跨独立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
解决方案建议
修正Service端口映射错误:
当前Service中follower端口的targetPort设为2188,但ZooKeeper容器内的follower同步端口是2888,这会导致跨集群的节点同步请求无法正确路由到容器端口。需修改为:- name: follower port: 2888 nodePort: 30182 targetPort: 2888标准化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。验证跨集群网络连通性:
- 确保各K8s集群节点的NodePort端口(30181、30182、30183)在集群间的防火墙/安全组中开放TCP协议的入站、出站规则;
- 在ZooKeeper容器内执行
telnet <<dcX ip>> 30182和telnet <<dcX ip>> 30183,确认跨集群端口无阻塞。
确认ZooKeeper监听配置:
保证ZOO_LISTEN_ALLIPS_ENABLED设置为"1",让ZooKeeper监听所有网卡地址,避免仅绑定集群内部IP导致外部节点无法访问。搭配Headless Service优化StatefulSet网络(可选):
为StatefulSet部署的ZooKeeper配置Headless Service用于集群内部通信,同时保留NodePort Service暴露跨集群所需端口,既保证StatefulSet的稳定网络标识,又满足跨集群访问需求。
内容的提问来源于stack exchange,提问作者Sujit Tah

