kubernetes将主机dns名称获取到容器中以进行kafka宣传主机

时间:2018-07-18 14:00:13

标签: amazon-web-services apache-kafka kubernetes

我想在kubernetes上部署kafka。

因为我要从Internet到kafka进行高带宽流传输,所以我想使用主机端口并将主机“ dnsName:hostPort”通告给zookeeper,以便所有流量都直接流向kafka代理(而不是使用nodeport和负载平衡器,流量到达某个随机节点,该节点将其重定向以创建不必要的流量。

我已经在亚马逊上设置了我的kubernetes集群。使用kubectl describe node ${nodeId},可以获取节点的internalIp,externalIp,内部和外部Dns名称。

我想将externalDns名称传递给kafka代理,以便它可以用作广告主机。

如何将这些信息传递给容器?理想情况下,我可以从部署yaml中做到这一点,但我也欢迎其他解决方案。

2 个答案:

答案 0 :(得分:2)

  

如何将这些信息传递给容器?理想情况下,我可以从部署yaml中做到这一点,但我也欢迎其他解决方案。

我要尝试的第一件事是envFrom: fieldRef:,看看它是否会让您进入PodSpec的{​​{1}}字段以抢占status:。我非常感谢您问的不是nodeName,但是如果ExternalDnsName有效,则可能会减少打字的次数,因此是一个很好的权衡。

但是,请牢记“我也愿意接受其他解决方案”:除非另有说明,否则不要忘记-每个Pod都可以与kubernetes API进行交互,并且具有正确的RBAC权限,要求您提供所需的信息。您可以将其作为fieldRef替代,以在启动kafka代理之前进行设置工作,也可以在init container中进行,将外部地址写入文件系统的共享位(使用command:或类似名称),然后再将其胶粘到您的kafka经纪人身上的所有粘合代码。

我100%确信我前面提到的volume: emptyDir: {}构造可以获取Pod的envFrom: fieldRef:metadata.name,这时Pod可以向kubernetes API询问其拥有metadata.namespace,从上述PodSpec字段中提取nodeName,然后向kubernetes API查询Node信息,瞧瞧,您拥有kubernetes知道的关于该Node的所有信息。

答案 1 :(得分:0)

Matthew L Daniels的答案描述了使用由环境变量获取的节点名查询kubernetes api的有效方法。困难在于赋予豆荚适当的rbac访问权限并设置一个初始化容器。

这里是使用python kubernetes客户端通过init容器实现此目标的kubernetes yml:

### 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: {}
相关问题