dns - Kubernetes 上的多代理 Kafka 如何设置 KAFKA_ADVERTISED_HOST_NAME

标签 dns kubernetes yaml kubectl kube-dns

我当前带有 3 个 Kafka 代理的 Kafka 部署文件如下所示:

apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: kafka
spec:
  selector:
    matchLabels:
      app: kafka
  serviceName: kafka-headless
  replicas: 3
  updateStrategy:
    type: RollingUpdate
  podManagementPolicy: Parallel
  template:
    metadata:
      labels:
        app: kafka
    spec:
      containers:
      - name: kafka-instance
        image: wurstmeister/kafka
        ports:
        - containerPort: 9092
        env:
        - name: KAFKA_ADVERTISED_PORT
          value: "9092"
        - name: KAFKA_ADVERTISED_HOST_NAME
          valueFrom:
              fieldRef:
                fieldPath: metadata.name
        - name: KAFKA_ZOOKEEPER_CONNECT
          value: "zookeeper-0.zookeeper-headless.default.svc.cluster.local:2181,\
                  zookeeper-1.zookeeper-headless.default.svc.cluster.local:2181,\
                  zookeeper-2.zookeeper-headless.default.svc.cluster.local:2181"
        - name: BROKER_ID_COMMAND
          value: "hostname | awk -F '-' '{print $2}'"
        - name: KAFKA_CREATE_TOPICS
          value: hello:2:1
        volumeMounts:
        - name: data
          mountPath: /var/lib/kafka/data
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 50Gi

这将创建 3 个 Kafka 代理作为有状态集,并使用 Kubedns 服务和 FQDN(完全限定域名)连接到 Zookeeper 集群,例如:
zookeeper-0.zookeeper-headless.default.svc.cluster.local:2181

Broker ID 是根据 pod 名称生成的:
- name: BROKER_ID_COMMAND
          value: "hostname | awk -F '-' '{print $2}'"

结果:
kafka-0 = 0
kafka-1 = 1
kafka-2 = 2

但是,为了对 Kafka 代理使用 Kubedns 名称:
kafka-0.kafka-headless.default.svc.cluster.local:9092
kafka-1.kafka-headless.default.svc.cluster.local:9092
kafka-2.kafka-headless.default.svc.cluster.local:9092

我需要能够设置 KAFKA_ADVERTISED_HOST_NAME根据 pod 的名称将变量更改为上述 FQDN 值。

目前我将变量设置为 pod 的名称:
- name: KAFKA_ADVERTISED_HOST_NAME
   valueFrom:
      fieldRef:
        fieldPath: metadata.name

结果:
KAFKA_ADVERTISED_HOST_NAME=kafka-0
KAFKA_ADVERTISED_HOST_NAME=kafka-1
KAFKA_ADVERTISED_HOST_NAME=kafka-2

但不知何故,我需要附加 DNS 名称的其余部分。

有没有办法直接设置DNS值?

类似的东西:
- name: KAFKA_ADVERTISED_HOST_NAME
       valueFrom:
          fieldRef:
            fieldPath: kubedns.name

最佳答案

我设法用 pod 定义中的命令字段解决了这个问题:

    command:
    - sh
    - -c
    - "export KAFKA_ADVERTISED_HOST_NAME=$(hostname).kafka-headless.default.svc.cluster.local &&
       start-kafka.sh"

这将运行一个 shell 命令,该命令根据 hostname 导出通告的主机名环境变量。值(value)。

关于dns - Kubernetes 上的多代理 Kafka 如何设置 KAFKA_ADVERTISED_HOST_NAME,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47516355/

相关文章:

dns - 如何在 mailgun(为子域配置)中从根域发送和接收电子邮件

dns - 如何将两个不同的域名指向同一个网站?

kubernetes - Kubernetes 上的 Schema Registry,可公开访问

node.js - 应用程序级别的 Kubernetes 证书?

amazon-web-services - 目标运行状况检查失败 - AWS 网络负载均衡器

azure - 如何在 Azure DevOps/GitHub 中设置 PR 验证?

r - 为 bookdown 项目创建随附幻灯片

git - 当两者都在防火墙/NATs/...之后时,如何在 git 存储库之间推送/pull ?

ssl - 无法使用 nginx 配置 certbot 以接受 https

python - 为什么 yaml 包没有安装在 conda env 中?