Kafka集群SASL_CLIENT监听器SASL握手失败问题求助
Kafka SASL_CLIENT监听器通过负载均衡SASL_SSL连接失败排查与解决
在Bitnami Helm部署的Kafka 3.1.0集群中新增SASL认证监听器后,SASL_INTERNAL监听器正常工作,但通过负载均衡的SASL_CLIENT监听器(kafka-sasl-k8s.dev.host.com:4430转发到9094端口)使用SASL_SSL连接时,出现以下错误:
%3|1669825033.516|FAIL|rdkafka#consumer-1| [thrd:sasl_ssl://kafka-sasl-k8s.dev.host.com:4430/bootstrap]: sasl_ssl://kafka-sasl-k8s.dev.host.com:4430/bootstrap: SASL SCRAM-SHA-512 mechanism handshake failed: Broker: Request not valid in current SASL state: broker's supported mechanisms: (after 44ms in state AUTH_HANDSHAKE)
原因分析
错误提示中broker's supported mechanisms:为空,说明Kafka的SASL_CLIENT监听器未正确加载SASL认证配置,或负载均衡转发过程中破坏了SASL握手数据包。
解决方案与排查步骤
1. 验证Kafka SASL_CLIENT监听器的JAAS配置
Bitnami Kafka需要为每个SASL监听器单独绑定JAAS认证规则,确保SASL_CLIENT监听器能识别SCRAM/PLAIN机制。
方式一:通过Helm values.yaml配置
在Bitnami Kafka的Helm values中补充SASL相关配置,确保监听器加载正确的认证信息:
kafka: auth: sasl: enabled: true mechanisms: PLAIN,SCRAM-SHA-256,SCRAM-SHA-512 users: - username: demo-user password: secret scramIterations: 4096 configuration: listeners: "INTERNAL://:9093,CLIENT://:9092,SASL_INTERNAL://:9095,SASL_CLIENT://:9094" listener.security.protocol.map: "INTERNAL:PLAINTEXT,CLIENT:PLAINTEXT,SASL_INTERNAL:SASL_PLAINTEXT,SASL_CLIENT:SASL_PLAINTEXT" advertised.listeners: "CLIENT://$(MY_POD_NAME)-k8s.dev.host.com:4430,INTERNAL://$(MY_POD_NAME).message-broker-dev-kafka-headless.message-broker-dev.svc.cluster.local:9093,SASL_CLIENT://$(MY_POD_NAME)-sasl-k8s.dev.host.com:4430,SASL_INTERNAL://$(MY_POD_NAME).message-broker-dev-kafka-headless.message-broker-dev.svc.cluster.local:9095" allow.everyone.if.no.acl.found: true authorizer.class.name: kafka.security.authorizer.AclAuthorizer sasl.enabled.mechanisms: PLAIN,SCRAM-SHA-256,SCRAM-SHA-512 sasl.mechanism.inter.broker.protocol: PLAIN
方式二:检查Pod内配置
进入Kafka Pod,查看/opt/bitnami/kafka/config/server.properties,确认存在以下配置:
listener.name.sasl_client.plain.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="admin-secret" user_demo-user="secret"; listener.name.sasl_client.scram-sha-256.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="admin" password="admin-secret" user_demo-user="secret"; listener.name.sasl_client.scram-sha-512.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="admin" password="admin-secret" user_demo-user="secret";
若缺少这些配置,说明Helm配置未正确生成,需重新部署并核对values参数。
2. 直接测试Pod内部的SASL_CLIENT监听器
绕过负载均衡,直接连接Kafka Pod的9094端口,验证监听器本身是否正常:
# 替换为实际的Pod IP kafkacat -b <pod-ip>:9094 -C -t protected-topic-v1 -X security.protocol=SASL_PLAINTEXT -X sasl.mechanisms=SCRAM-SHA-512 -X sasl.username=demo-user -X sasl.password=secret
如果连接成功,说明Kafka端配置正常,问题出在负载均衡。
3. 检查负载均衡转发配置
- 确保负载均衡采用TCP转发,而非HTTP代理(Kafka基于TCP协议,HTTP代理会破坏SASL握手数据包结构)。
- 验证端口转发规则:
kafka-sasl-k8s.dev.host.com:4430需正确映射到Kafka Pod的9094端口,无端口配置错误。 - 确认负载均衡仅做TLS终止,不修改应用层数据(如添加HTTP头、篡改数据包内容)。
4. 验证advertised.listeners配置
检查advertised.listeners中的SASL_CLIENT地址是否正确:
SASL_CLIENT://$(MY_POD_NAME)-sasl-k8s.dev.host.com:4430
确保客户端能正常解析该域名,且负载均衡的SSL证书与域名匹配(避免TLS握手失败干扰后续SASL流程)。
内容的提问来源于stack exchange,提问作者MrLuje
相关产品推荐
相关产品推荐

