我想把Kafka部署到Kubernetes。
因为我将以高带宽从互联网流到Kafka,所以我想使用主机端口和播发主机”dnsname:hostport“到zookeeper,以便所有流量都直接到kafka代理(而不是使用nodeport和loadbalancer,其中流量会命中一些随机节点,从而重定向它,从而创建不必要的流量)。
我已经在amazon上安装了kubernetes集群。与 kubectl describe node ${nodeId}
我得到节点的internalip、externalip、内部和外部dns名称。
我想将externaldns名称传递给kafka代理,以便它可以将其用作播发主机。
我怎样才能把这些信息传递给集装箱?理想情况下,我可以从部署yaml中完成这项工作,但我也愿意接受其他解决方案。
2条答案
按热度按时间iezvtpos1#
我怎样才能把这些信息传递给集装箱?理想情况下,我可以从部署yaml中完成这项工作,但我也愿意接受其他解决方案。
我要做的第一件事就是
envFrom: fieldRef:
看看它是否能让你进入PodSpec
的status:
现场抢夺nodeName
. 我很感激这不是ExternalDnsName
你问过,但如果fieldRef
工作,它可以少很多打字,因此可以是一个很好的权衡。但是,记住“我也对其他解决方案持开放态度”:不要忘记——除非另有指示——每个pod都能够与kubernetes api进行交互,并且通过正确的rbac权限,它可以请求您正在查找的信息。你可以作为一个
command:
重写,要在启动kafka代理之前执行安装工作,或者可以在init容器中执行该工作,请将外部地址写入文件系统的共享位(使用volume: emptyDir: {}
或者类似的),然后是将该值悄悄地放入kafka代理的任何粘合代码。我百分之百肯定
envFrom: fieldRef:
我前面提到的构造可以获得metadata.name
以及metadata.namespace
对于pod,此时pod可以向kubernetesapi请求它自己的PodSpec
,提取nodeName
从前面提到的status:
字段,然后向kubernetesapi请求节点信息,瞧à, 你有Kubernetes知道的关于那个节点的所有信息。2wnc66cl2#
matthew l daniels answer描述了使用env var获得的nodename查询kubernetes api的有效方法。难点在于为pod提供正确的rbac访问和设置init容器。
在这里,kubernetes yml使用python kubernetes客户机通过init容器实现了这一点: