You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跨独立Kubernetes集群搭建ZooKeeper Stretch集群求助

跨Kubernetes集群搭建ZooKeeper Stretch集群连接问题及解决方案

需求与问题

需求:在3个独立的Kubernetes集群中搭建非Confluent版本的Kafka Stretch集群,各K8s集群相互独立,并非Stretch集群。
问题:跨Kubernetes集群的ZooKeeper节点无法建立连接。

已完成测试场景

场景1(单ZooKeeper节点)

  • 在第一个Kubernetes环境部署2个Kafka Broker和1个ZooKeeper;
  • 在第二个Kubernetes环境部署1个Kafka Broker;
  • 通过NodePort暴露2181、3888、2888端口。
    测试结果:第二个集群的Broker成功连接第一个集群的ZooKeeper。

场景2(双ZooKeeper节点)

  • 在第一个Kubernetes环境部署2个Kafka Broker和1个ZooKeeper;
  • 在第二个Kubernetes环境部署1个Kafka Broker和1个ZooKeeper;
  • 通过NodePort暴露2181、3888、2888端口。
    测试结果:跨集群的ZooKeeper无法通过3888端口或暴露的NodePort(如30183)互联。

环境配置文件示例

dc2-zookeeper-cluster Service配置

apiVersion: v1
kind: Service
metadata:
  name: dc2-zookeeper-cluster
  namespace: kafka  
spec:
  selector:
    app: dc1-zookeeper-cluster
  type: NodePort
  ports:
  - name: client
    port: 2181
    nodePort: 30181  
    targetPort: 2181 
  - name: follower
    port: 2888
    nodePort: 30182
    targetPort: 2188
  - name: leader
    port: 3888
    nodePort: 30183
    targetPort: 3888

dc1-zookeeper StatefulSet配置

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: dc1-zookeeper
  namespace: kafka  
spec:
  replicas: 1
  serviceName: dc1-zookeeper-cluster
  selector:
    matchLabels:
      app: dc1-zookeeper-cluster
  template:
    metadata:
      labels:
        component: dc1-zookeeper-cluster
        app: dc1-zookeeper-cluster
    spec:
      containers:
      - name: zookeeper
        image: bitnami/zookeeper:latest
        ports:
        - containerPort: 2181
        - containerPort: 2888
        - containerPort: 3888
        lifecycle:
          postStart:
            exec:
              command:
                - "sh"
                - "-c"
                - >
                  echo "1"  > /bitnami/zookeeper/data/myid
        env:
        - name: ZOO_SERVER_ID
          value: "1" 
        - name: ZOO_LISTEN_ALLIPS_ENABLED
          value: "1"    
        - name: ALLOW_ANONYMOUS_LOGIN
          value: "yes"
        - name: ZOO_SERVERS
          value: <<dc1 ip>>:30182:30183,<<dc2 ip>>:30182:30183

解决方案建议

  1. 修正Service端口映射错误:
    当前Service中follower端口的targetPort设为2188,但ZooKeeper容器内的follower同步端口是2888,这会导致跨集群的节点同步请求无法正确路由到容器端口。需修改为:

    - name: follower
      port: 2888
      nodePort: 30182
      targetPort: 2888
    
  2. 标准化ZOO_SERVERS配置格式:
    ZooKeeper的ZOO_SERVERS必须遵循server.id=host:follower_port:leader_port格式,当前配置缺少server.id前缀,正确配置应为:

    - name: ZOO_SERVERS
      value: "server.1=<<dc1 ip>>:30182:30183;server.2=<<dc2 ip>>:30182:30183"
    

    同时注意每个K8s集群的ZooKeeper节点ZOO_SERVER_ID需唯一,比如dc2节点的ID应设为2,对应的myid文件内容也要改为2。

  3. 验证跨集群网络连通性:

    • 确保各K8s集群节点的NodePort端口(30181、30182、30183)在集群间的防火墙/安全组中开放TCP协议的入站、出站规则;
    • 在ZooKeeper容器内执行telnet <<dcX ip>> 30182和telnet <<dcX ip>> 30183,确认跨集群端口无阻塞。
  4. 确认ZooKeeper监听配置:
    保证ZOO_LISTEN_ALLIPS_ENABLED设置为"1",让ZooKeeper监听所有网卡地址,避免仅绑定集群内部IP导致外部节点无法访问。

  5. 搭配Headless Service优化StatefulSet网络(可选):
    为StatefulSet部署的ZooKeeper配置Headless Service用于集群内部通信,同时保留NodePort Service暴露跨集群所需端口,既保证StatefulSet的稳定网络标识,又满足跨集群访问需求。

内容的提问来源于stack exchange,提问作者Sujit Tah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 07:34:55