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

mum43rcc  于 2021-06-08  发布在  Kafka
关注(0)|答案(2)|浏览(356)

我想把Kafka部署到Kubernetes。
因为我将以高带宽从互联网流到Kafka,所以我想使用主机端口和播发主机”dnsname:hostport“到zookeeper,以便所有流量都直接到kafka代理(而不是使用nodeport和loadbalancer,其中流量会命中一些随机节点,从而重定向它,从而创建不必要的流量)。
我已经在amazon上安装了kubernetes集群。与 kubectl describe node ${nodeId} 我得到节点的internalip、externalip、内部和外部dns名称。
我想将externaldns名称传递给kafka代理,以便它可以将其用作播发主机。
我怎样才能把这些信息传递给集装箱?理想情况下,我可以从部署yaml中完成这项工作,但我也愿意接受其他解决方案。

iezvtpos

iezvtpos1#

我怎样才能把这些信息传递给集装箱?理想情况下,我可以从部署yaml中完成这项工作,但我也愿意接受其他解决方案。
我要做的第一件事就是 envFrom: fieldRef: 看看它是否能让你进入 PodSpecstatus: 现场抢夺 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知道的关于那个节点的所有信息。

2wnc66cl

2wnc66cl2#

matthew l daniels answer描述了使用env var获得的nodename查询kubernetes api的有效方法。难点在于为pod提供正确的rbac访问和设置init容器。
在这里,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: {}

相关问题