Strimzi部署Kafka时ZooKeeper启动失败:SSL主机名验证异常
解决Strimzi部署Kafka时ZooKeeper的SSLPeerUnverifiedException问题
问题根源
你遇到的SSLPeerUnverifiedException错误,核心原因是:Strimzi默认会为ZooKeeper节点间的通信启用TLS加密,自动生成的证书里只包含了ZooKeeper节点的域名(比如*.my-cluster-zookeeper-nodes.kafka.svc这类),但ZooKeeper节点之间实际用Pod IP(比如日志里的10.244.0.14)通信时,这个IP不在证书的Subject Alternative Names(SANs)列表里,导致hostname校验失败。
解决方案
这里提供两种方案,推荐用第一种(生产环境友好),第二种仅适用于测试场景:
方案1:让ZooKeeper内部证书包含Pod IP(推荐)
修改你的Kafka CR配置,在ZooKeeper的TLS设置里开启ipSans选项,让Strimzi生成证书时自动把每个节点的Pod IP加入SAN:
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: version: 3.1.0 replicas: 2 listeners: - name: plain port: 9092 type: internal tls: false - name: external port: 9094 type: loadbalancer tls: false config: offsets.topic.replication.factor: 2 transaction.state.log.replication.factor: 2 transaction.state.log.min.isr: 2 default.replication.factor: 2 min.insync.replicas: 2 inter.broker.protocol.version: "3.1" storage: type: ephemeral zookeeper: replicas: 2 storage: type: ephemeral tls: internal: certificates: - secretName: zookeeper-internal-cert ipSans: true # 启用该选项,让证书包含Pod IP作为SAN
修改完成后,重新应用配置:
kubectl apply -f your-kafka-cr-file.yaml -n kafka
Strimzi Operator会自动重新生成包含Pod IP的证书,ZooKeeper节点间的TLS通信就能通过hostname校验了。
方案2:关闭ZooKeeper节点间的TLS(仅测试环境用)
如果是测试环境,想快速绕过这个问题,可以直接关闭ZooKeeper节点间的TLS加密:
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # 保持原有kafka配置不变 version: 3.1.0 replicas: 2 listeners: - name: plain port: 9092 type: internal tls: false - name: external port: 9094 type: loadbalancer tls: false config: offsets.topic.replication.factor: 2 transaction.state.log.replication.factor: 2 transaction.state.log.min.isr: 2 default.replication.factor: 2 min.insync.replicas: 2 inter.broker.protocol.version: "3.1" storage: type: ephemeral zookeeper: replicas: 2 storage: type: ephemeral tls: internal: false # 关闭节点间TLS加密
重新应用配置后,ZooKeeper节点间用明文通信,就不会有证书校验的问题了。但生产环境绝对不建议这么做,会失去节点间通信的加密保护。
额外建议
ZooKeeper集群通常推荐使用奇数个副本(3、5个),这样能避免脑裂问题,提升故障场景下的可用性。虽然2个副本也能运行,但生产环境最好调整为3个副本。
内容的提问来源于stack exchange,提问作者Faheem Sultan
相关产品推荐
相关产品推荐

