Amazon web services kubernetes将主机dns名称获取到kafka播发主机的容器中

Amazon web services kubernetes将主机dns名称获取到kafka播发主机的容器中,amazon-web-services,apache-kafka,kubernetes,Amazon Web Services,Apache Kafka,Kubernetes,我想把卡夫卡部署到库伯内特斯 因为我将以高带宽从internet流式传输到kafka,所以我想使用主机端口,并向zookeeper播发主机“dnsName:hostport”,以便所有流量都直接传输到kafka代理(而不是使用nodeport和负载平衡器,其中流量会命中一些随机节点,从而重定向它,从而产生不必要的流量) 我已经在amazon上安装了kubernetes集群。使用kubectl description node${nodeId}I获取节点的internalIp、externalIp

我想把卡夫卡部署到库伯内特斯

因为我将以高带宽从internet流式传输到kafka,所以我想使用主机端口,并向zookeeper播发主机“dnsName:hostport”,以便所有流量都直接传输到kafka代理(而不是使用nodeport和负载平衡器,其中流量会命中一些随机节点,从而重定向它,从而产生不必要的流量)

我已经在amazon上安装了kubernetes集群。使用
kubectl description node${nodeId}
I获取节点的internalIp、externalIp、internal和externaldns名称

我想将externalDns名称传递给kafka代理,以便它可以将其用作播发主机

如何将该信息传递给容器?理想情况下,我可以通过部署yaml来实现这一点,但我也对其他解决方案持开放态度

如何将该信息传递给容器?理想情况下,我可以通过部署yaml来实现这一点,但我也对其他解决方案持开放态度

我要尝试的第一件事是
envFrom:fieldRef:
,看看它是否能让您进入
PodSpec
状态:
字段以获取
节点名。我非常感激这不是您所问的
ExternalDnsName
,但是如果
fieldRef
有效,那么输入可能会少很多,因此可能是一个很好的折衷方案

但是,记住“我也对其他解决方案持开放态度”:不要忘记——除非另有指示——每个Pod都能够与kubernetes API交互,并且具有正确的RBAC权限,它可以请求您正在查找的信息。您可以使用
命令:
覆盖,在启动kafka代理之前执行设置工作,也可以在中执行该工作,将外部地址写入文件系统的共享位(使用
卷:emptyDir:{}
或类似文件),然后使用任何胶水代码将该值写入kafka代理


我100%确信我前面提到的
envFrom:fieldRef:
构造可以获取Pod的
元数据.name
元数据.namespace
,此时Pod可以向kubernetes API索取自己的
PodSpec
,从前面提到的
状态:
字段中提取
节点名
,然后向kubernetes API询问节点信息,瞧,您拥有kubernetes知道的关于该节点的所有信息。

Matthew L Daniels answer描述了使用由env var获得的节点名称查询kubernetes api的有效方法。难点在于为pod提供正确的rbac访问和设置初始容器

这里是kubernetes yml,它通过使用python kubernetes客户端的init容器实现这一点:

### This serviceAccount gives the kafka sidecar the permission to query the kubernetes API for node information so that it can find out the advertise host (node public dns name) for the kafka which uses hostPort to be as efficient as possible.
apiVersion: v1
kind: ServiceAccount
metadata:
  name: node-reader-service-account
  namespace: default
---

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: node-reader-cluster-role
rules:
  - apiGroups: [""] # The API group "" indicates the core API Group.
    resources: ["nodes"]
    verbs: ["get", "list", "watch"]

---

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: read-nodes-rolebinding
subjects:
  - kind: ServiceAccount # May be "User", "Group" or "ServiceAccount"
    name: node-reader-service-account
    namespace: default 
roleRef:
  kind: ClusterRole
  name: node-reader-cluster-role
  apiGroup: rbac.authorization.k8s.io

---

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  annotations:
  creationTimestamp: null
  labels:
    io.kompose.service: kafka
  name: kafka
spec:
  replicas: 1
  strategy:
    type: Recreate
  template:
    metadata:
      creationTimestamp: null
      labels:
        io.kompose.service: kafka
    spec:
      serviceAccountName: node-reader-service-account
      containers:

      - name: kafka
        image: someImage
        resources: {}
        command: ["/bin/sh"]
        args: ["-c", "export KAFKA_ADVERTISED_LISTENERS=$(cat '/etc/sidecar-data/dnsName') && env | grep KAFKA_ADVERTISED_LISTENERS && /start-kafka.sh"]
        volumeMounts:
        - name: sidecar-data
          mountPath: /etc/sidecar-data/

      initContainers:
      - name: kafka-sidecar
        image: sidecarImage
        command: ["python"]
        args: ["/script/getHostDnsName.py", "$(KUBE_NODE_NAME)", "/etc/sidecar-data/dnsName"]
        env:
          - name: KUBE_NODE_NAME
            valueFrom:
              fieldRef:
                fieldPath: spec.nodeName
        volumeMounts:
        - name: sidecar-data
          mountPath: /etc/sidecar-data/

      volumes:
      - name: sidecar-data
        emptyDir: {}

      restartPolicy: Always
status: {}

非常感谢。我让它工作了。我使用了python kubernetes客户端,正如您所说,它是一个侧车容器和一个共享卷。Serviceaccount(默认名称空间)、ClusterRole和clusterRolebinding以提供必要的权限。花了我一天的时间,但效果很好:)