切换为SCRAM后KRaft Kafka集群Broker认证失败求助
原有基于KRaft的Kafka集群,Broker间及控制器通信均采用SASL_PLAIN认证,配置如下:
echo security.inter.broker.protocol=SASL_SSL >> $KAFKA_HOME/milvus/server.properties echo sasl.enabled.mechanisms="PLAIN" >> $KAFKA_HOME/milvus/server.properties echo sasl.mechanism.inter.broker.protocol="PLAIN" >> $KAFKA_HOME/milvus/server.properties echo sasl.mechanism.controller.protocol="PLAIN" >> $KAFKA_HOME/milvus/server.properties
尝试将Broker间协议改为SCRAM-SHA-512,控制器保留PLAIN,修改后的配置:
echo security.inter.broker.protocol=SASL_SSL >> $KAFKA_HOME/milvus/server.properties echo sasl.enabled.mechanisms="PLAIN,SCRAM-SHA-512" >> $KAFKA_HOME/milvus/server.properties echo sasl.mechanism.inter.broker.protocol="SCRAM-SHA-512" >> $KAFKA_HOME/milvus/server.properties echo sasl.mechanism.controller.protocol="PLAIN" >> $KAFKA_HOME/milvus/server.properties
执行存储格式化时添加SCRAM凭证:
$KAFKA_HOME/bin/kafka-storage.sh format \ -t $KAFKA_CLUSTER_ID \ --add-scram 'SCRAM-SHA-512=[name=USERNAME,password=PASSWORD]' \ -c $KAFKA_HOME/path/server.properties || true
修改每个Broker的JAAS文件KafkaServer部分为SCRAM:
cat <<-EOF > $KAFKA_HOME/path/kafkaJaas.conf KafkaServer { org.apache.kafka.common.security.scram.ScramLoginModule required username="user" password="user" user_admin="admin-secret" user_user="user"; }; EOF
Broker/控制器监听器已设置为:
listeners=SASL_SSL
但Kafka Pod运行日志出现认证失败警告:
WARN [RaftManager id=0] Connection to node 2 (xx.svc.cluster.local/10.254.16.101:19092) terminated during authentication. This may happen due to any of the following reasons: (1) Authentication failed due to invalid credentials with brokers older than 1.0.0, (2) Firewall blocking Kafka TLS traffic (eg it may only allow HTTPS traffic), (3) Transient network issue.
已参考Confluent相关文档配置,询问是否遗漏或需要修改的步骤。
1. 修正SCRAM凭证一致性
执行kafka-storage.sh时指定的name=USERNAME,password=PASSWORD需与JAAS文件中的username、password完全匹配。当前命令使用占位符USERNAME/PASSWORD,但JAAS配置的是user/user,凭证不匹配会直接触发认证失败。同时要确保所有Broker执行格式化时添加的SCRAM凭证完全一致,集群ID$KAFKA_CLUSTER_ID正确无误。
2. 分离Broker与控制器的JAAS配置
由于控制器通信仍采用PLAIN协议,而Broker间用SCRAM,必须为控制器单独配置JAAS文件,不能与Broker共用:
- 控制器JAAS文件示例(使用PlainLoginModule):
cat <<-EOF > $KAFKA_HOME/path/controllerJaas.conf KafkaServer { org.apache.kafka.common.security.plain.PlainLoginModule required username="controller-user" password="controller-secret" user_controller-user="controller-secret"; }; EOF - 启动控制器时通过JVM参数指定该文件:
-Djava.security.auth.login.config=/path/to/controllerJaas.conf - Broker的JAAS文件保持SCRAM配置,但需确保
user_xxx段的密码与格式化时添加的SCRAM凭证一致。
3. 完善监听器与协议映射配置
确保listener.security.protocol.map配置明确,避免协议混淆:
echo listener.security.protocol.map=SASL_SSL:SASL_SSL >> $KAFKA_HOME/milvus/server.properties
若Broker与控制器使用不同端口(如控制器用9093、Broker用19092),需分别配置监听器及对应协议,例如:
listeners=SASL_SSL://:19092,CONTROLLER://:9093 listener.security.protocol.map=SASL_SSL:SASL_SSL,CONTROLLER:SASL_SSL
4. 补全SSL相关配置
日志提示TLS流量可能存在问题,需确保SSL配置完整:
echo ssl.keystore.location=/path/to/kafka.keystore.jks >> $KAFKA_HOME/milvus/server.properties echo ssl.keystore.password=keystore-secret >> $KAFKA_HOME/milvus/server.properties echo ssl.truststore.location=/path/to/kafka.truststore.jks >> $KAFKA_HOME/milvus/server.properties echo ssl.truststore.password=truststore-secret >> $KAFKA_HOME/milvus/server.properties echo ssl.endpoint.identification.algorithm=HTTPS >> $KAFKA_HOME/milvus/server.properties
同时验证所有Broker/控制器的SSL证书有效且彼此信任。
5. 确保集群配置修改生效
去掉kafka-storage.sh format后的|| true,避免掩盖格式化失败的错误。若集群已初始化,修改SCRAM凭证应使用kafka-configs.sh而非重新格式化:
$KAFKA_HOME/bin/kafka-configs.sh --bootstrap-server <broker-address> --alter --add-config 'SCRAM-SHA-512=[name=user,password=user]' --entity-type brokers --entity-name <broker-id>
6. 验证JVM参数传递
确认Broker和控制器启动时正确加载对应JAAS文件,例如Broker启动参数需包含:
-Djava.security.auth.login.config=$KAFKA_HOME/path/kafkaJaas.conf
容器部署场景下,需检查环境变量或启动脚本是否正确传递该参数。
内容的提问来源于stack exchange,提问作者abdullah ahmed

