Apache kafka 如何为kubernetes上的Kafka multi-broker设置指定播发的侦听器并专门公开集群?

Apache kafka 如何为kubernetes上的Kafka multi-broker设置指定播发的侦听器并专门公开集群?,apache-kafka,kubernetes,apache-zookeeper,messagebroker,Apache Kafka,Kubernetes,Apache Zookeeper,Messagebroker,我正在尝试在Azure中托管的kubernetes群集上设置多代理kafka。我有一个单一的经纪人设置工作。对于多代理设置,目前我有一组zookeeper节点(3)来管理kafka服务。我将kafka群集部署为复制因子为3的复制控制器。那是3个经纪人。我如何向Zookeeper注册这三个代理,以便它们向Zookeeper注册不同的IP地址 部署服务后,我启动复制控制器,并使用复制控制器yaml文件中的群集IP指定两个播发的.listener,一个用于SSL,另一个用于明文。但是,在此场景中,所有

我正在尝试在Azure中托管的kubernetes群集上设置多代理kafka。我有一个单一的经纪人设置工作。对于多代理设置,目前我有一组zookeeper节点(3)来管理kafka服务。我将kafka群集部署为复制因子为3的复制控制器。那是3个经纪人。我如何向Zookeeper注册这三个代理,以便它们向Zookeeper注册不同的IP地址

部署服务后,我启动复制控制器,并使用复制控制器yaml文件中的群集IP指定两个播发的.listener,一个用于SSL,另一个用于明文。但是,在此场景中,所有代理都使用相同的IP注册,并且写入副本失败。我不想将每个代理部署为单独的复制控制器/pod和服务,因为扩展成为一个问题。我非常感谢您对此有任何想法/想法

编辑1:


另外,我还试图将集群暴露给云中的另一个VPC。我必须为客户端公开SSL和明文端口,我正在使用adverted.listeners。如果我使用复制因子为3的statefulset,并让kubernetes公开pod的规范主机名作为主机名,则无法从外部客户端解析这些主机名。我实现这一点的唯一方法是使用/公开与每个代理对应的外部服务。然而,这并不具有规模

Kubernetes提出了
statefulset
的概念来解决这些问题。状态集的每个实例都有自己的DNS名称,因此您可以通过DNS名称引用每个实例

这一概念将得到更详细的描述。您还可以查看以下内容:


你好,卢卡斯,谢谢你的回复。但是,我担心的是,所有代理(作为复制控制器的一部分)都会向zookeeper注册到同一个播发的.listener主机和端口。如果它们是有状态集的一部分,它们的注册方式会有所不同吗?即使他们仍然在为相同的主机和端口做广告?尽管如此,我还是会尝试这种方法,并让大家知道!您好@Annu,这种方法是在Kubernetes上运行多zookeeper和多代理Kafka集群的一种行之有效的方法。你可以看看其中显示了一个很好的默认卡夫卡部署在Kubernetes上的Helm.Hi@Luckas,我仍然在努力让它与StatefulSet一起工作。我正在使用advised.listeners公开SSL和明文端口。我的问题是,我需要能够通过云中的不同VPC访问集群。我对卡夫卡的理解是,制作人/消费者需要能够直接连接(解析)代理,以读取/写入数据。我不想用三种不同的服务暴露我的经纪人。但我看不出有其他办法。你能解决这个问题吗?面对类似的情况,让ZK集群使用上面回答的有状态集。有状态集用于启动Kafka集群,并使用lifecycle hook postStart来设置代理ID,但如果不设置播发的侦听器,POD将无法启动。不确定如何通过清单配置将动态值输入到
env
中。如何在有状态集中设置播发的主机?您是否使用kubernetes有状态集生成的规范名称?您曾经解决过这个问题吗?嗨,Mike,我还没有解决kafka的“易伸缩性”问题。我在一个statefulset(对于一个持久卷)中使用每个代理,其中播发的主机作为入口IP地址(到我的kubernetes群集):端口,不同的代理使用不同的端口。这很难扩展,因为需要为更多的代理打开新的端口,并且broker.yaml中公布的端口需要相应更改。
apiVersion: v1
kind: Service
metadata:
  name: zk-headless
  labels:
    app: zk-headless
spec:
  ports:
  - port: 2888
    name: server
  - port: 3888
    name: leader-election
  clusterIP: None
  selector:
    app: zk
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: zk-config
data:
  ensemble: "zk-0;zk-1;zk-2"
  jvm.heap: "2G"
  tick: "2000"
  init: "10"
  sync: "5"
  client.cnxns: "60"
  snap.retain: "3"
  purge.interval: "1"
---
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
  name: zk-budget
spec:
  selector:
    matchLabels:
      app: zk
  minAvailable: 2
---
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: zk
spec:
  serviceName: zk-headless
  replicas: 3
  template:
    metadata:
      labels:
        app: zk
      annotations:
        pod.alpha.kubernetes.io/initialized: "true"

    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: "app"
                    operator: In
                    values: 
                    - zk-headless
              topologyKey: "kubernetes.io/hostname"
      containers:
      - name: k8szk
        imagePullPolicy: Always
        image: gcr.io/google_samples/k8szk:v1
        resources:
          requests:
            memory: "4Gi"
            cpu: "1"
        ports:
        - containerPort: 2181
          name: client
        - containerPort: 2888
          name: server
        - containerPort: 3888
          name: leader-election
        env:
        - name : ZK_ENSEMBLE
          valueFrom:
            configMapKeyRef:
              name: zk-config
              key: ensemble
        - name : ZK_HEAP_SIZE
          valueFrom:
            configMapKeyRef:
                name: zk-config
                key: jvm.heap
        - name : ZK_TICK_TIME
          valueFrom:
            configMapKeyRef:
                name: zk-config
                key: tick
        - name : ZK_INIT_LIMIT
          valueFrom:
            configMapKeyRef:
                name: zk-config
                key: init
        - name : ZK_SYNC_LIMIT
          valueFrom:
            configMapKeyRef:
                name: zk-config
                key: tick
        - name : ZK_MAX_CLIENT_CNXNS
          valueFrom:
            configMapKeyRef:
                name: zk-config
                key: client.cnxns
        - name: ZK_SNAP_RETAIN_COUNT
          valueFrom:
            configMapKeyRef:
                name: zk-config
                key: snap.retain
        - name: ZK_PURGE_INTERVAL
          valueFrom:
            configMapKeyRef:
                name: zk-config
                key: purge.interval
        - name: ZK_CLIENT_PORT
          value: "2181"
        - name: ZK_SERVER_PORT
          value: "2888"
        - name: ZK_ELECTION_PORT
          value: "3888"
        command:
        - sh
        - -c
        - zkGenConfig.sh && zkServer.sh start-foreground
        readinessProbe:
          exec:
            command:
            - "zkOk.sh"
          initialDelaySeconds: 15
          timeoutSeconds: 5
        livenessProbe:
          exec:
            command:
            - "zkOk.sh"
          initialDelaySeconds: 15
          timeoutSeconds: 5
        volumeMounts:
        - name: datadir
          mountPath: /var/lib/zookeeper
      securityContext:
        runAsUser: 1000
        fsGroup: 1000
  volumeClaimTemplates:
  - metadata:
      name: datadir
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 20Gi