【问题标题】:kubernetes get host dns name to container for kafka advertise hostkubernetes 将主机 dns 名称获取到 kafka 广告主机的容器
【发布时间】:2018-12-26 11:48:04
【问题描述】:

我想在 kubernetes 上部署 kafka。

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    我会尝试的第一件事是envFrom: fieldRef:,看看它是否能让您进入PodSpecstatus: 字段以获取nodeName。我非常感谢这不是您询问的 ExternalDnsName,但如果 fieldRef 有效,它可能会减少打字次数,因此可能是一个很好的权衡。

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

    我 100% 确定前面提到的 envFrom: fieldRef: 构造可以获取 Pod 的 metadata.namemetadata.namespace,此时 Pod 可以向 kubernetes API 请求自己的 PodSpec,提取来自上述status: 字段的nodeName,然后向kubernetes API 询问节点信息,瞧,您拥有kubernetes 知道的关于该节点的所有信息。

    【讨论】:

    • 谢谢。我让它工作。我使用了 python kubernetes 客户端,如您所说的边车容器和共享卷。一个 Serviceaccount(默认命名空间)、ClusterRole 和 clusterRolebinding 以提供必要的权限。花了我一天,但它有效:)
    【解决方案2】:

    Matthew L Daniels 的回答描述了使用 env var 获得的节点名查询 kubernetes api 的有效方法。困难在于为 pod 提供正确的 rbac 访问权限并设置一个 init Container。

    这里的 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: {}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-24
      • 1970-01-01
      • 2022-06-15
      • 1970-01-01
      • 2011-07-06
      • 2020-10-20
      • 2011-08-01
      相关资源
      最近更新 更多