Bitnami Helm部署Kubernetes上KRaft模式Kafka集群遇监听协议错误
解决KRaft模式Kafka集群部署的“No security protocol defined for listener”错误
问题根源
Bitnami Kafka Helm Chart在KRaft模式下,必须为每个定义的listener明确绑定安全协议,否则Kafka启动时无法匹配listener与对应协议,导致Pod进入CrashLoopBackOff状态。
修正后的values.yaml核心配置
以下是适配KRaft模式、仅使用PLAINTEXT协议且支持集群内外访问的关键配置片段:
# 禁用ZooKeeper,启用KRaft模式 zookeeper: enabled: false kafka: enabled: true kraft: enabled: true # 3节点集群需配置对应副本数 controller: replicaCount: 3 broker: replicaCount: 3 # 配置Listener及对应安全协议 listeners: # 集群内部通信Listener internal: enabled: true containerPort: 9092 securityProtocol: PLAINTEXT # 外部访问Listener(适配minikube的NodePort模式) external: enabled: true type: NodePort containerPort: 9094 securityProtocol: PLAINTEXT advertisedHost: "{{ .Values.external.ip }}" advertisedPort: "{{ .Values.external.nodePort }}" # 绑定Listener与安全协议,键名需与上方listener名称一致(大写) listenerSecurityProtocolMap: INTERNAL: PLAINTEXT EXTERNAL: PLAINTEXT # minikube外部访问配置:部署前先执行`minikube ip`获取IP,nodePort可指定范围或自动分配 external: ip: "$(minikube ip)" nodePort: 30094
重新部署步骤
- 卸载现有失败的Release:
helm uninstall cluster-kafka
- 应用修正后的配置重新部署:
helm install cluster-kafka bitnami/kafka -f values.yaml
部署验证
- 检查Pod状态,等待所有controller和broker Pod进入Running状态:
kubectl get pods -l app.kubernetes.io/name=kafka
- 集群内部访问测试(创建临时客户端Pod):
kubectl run kafka-client --restart='Never' --image docker.io/bitnami/kafka:2.8.1-debian-10-r0 --command -- sleep infinity kubectl exec -it kafka-client -- /opt/bitnami/kafka/bin/kafka-topics.sh --create --topic test-topic --bootstrap-server cluster-kafka-controller-0.cluster-kafka-controller-headless.default.svc.cluster.local:9092 --partitions 3 --replication-factor 3
- minikube外部访问测试:
# 获取外部访问地址 MINIKUBE_IP=$(minikube ip) EXTERNAL_PORT=$(kubectl get svc cluster-kafka-external -o jsonpath='{.spec.ports[0].nodePort}') # 用容器客户端测试发送消息 docker run --rm docker.io/bitnami/kafka:2.8.1-debian-10-r0 /opt/bitnami/kafka/bin/kafka-console-producer.sh --broker-list $MINIKUBE_IP:$EXTERNAL_PORT --topic test-topic
关键注意点
listenerSecurityProtocolMap中的键名必须与listeners配置的名称完全匹配(需大写)- 3节点KRaft集群必须同时设置controller和broker的
replicaCount为3,保证集群高可用 - 若未指定固定nodePort,部署后需通过
kubectl get svc cluster-kafka-external获取自动分配的端口
内容的提问来源于stack exchange,提问作者Fernando Tuquina
相关产品推荐
相关产品推荐

