AKS集群Confluent Kafka外部访问配置后,Node.js生产者连接失败排查
AKS集群Confluent Kafka外部访问故障排查与解决
问题描述
在AKS集群中配置Confluent Kafka外部访问,已通过Ingress成功连接Control Center,但Kafka外部访问异常:
- Kafka spec配置如下:
listeners: external: externalAccess: type: loadBalancer loadBalancer: domain: lb.example.it advertisedPort: 39093 - 配置后生成两个LoadBalancer服务,
/etc/hosts添加了IP映射:20.31.10.27 kafka.lb.example.it 20.31.9.167 b0.lb.example.it - Node.js生产者设置brokers为
['kafka.lb.example.it:39093'],连接时报错:
程序自动使用内部Pod地址{"level":"ERROR","timestamp":"2023-01-22T08:43:20.761Z","logger":"kafkajs","message":"[Connection] Connection error: connect ECONNREFUSED 127.0.0.2:9092","broker":"kafka-0.kafka.ckafka.svc.cluster.local:9092","clientId":"my-app","stack":"Error: connect ECONNREFUSED 127.0.0.2:9092\n at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1495:16)"}kafka-0.kafka.ckafka.svc.cluster.local:9092而非预期的外部地址,导致连接失败。
故障原因
Kafka客户端连接初始broker后,会从broker获取集群元数据(包含其他broker的地址)。此处问题在于broker返回的是内部Pod地址,外部客户端无法访问该地址,进而引发连接拒绝错误。
解决步骤
修正Kafka外部监听器的advertised配置
需确保外部监听器的advertisedAddress配置为外部可访问的地址模板,根据LoadBalancer部署方式调整:- 若使用统一集群外部地址(
kafka.lb.example.it):listeners: external: externalAccess: type: loadBalancer loadBalancer: domain: lb.example.it advertisedPort: 39093 advertisedAddress: "kafka.lb.example.it" - 若每个broker对应独立LoadBalancer(如
b0.lb.example.it对应kafka-0):listeners: external: externalAccess: type: loadBalancer loadBalancer: domain: lb.example.it advertisedPort: 39093 advertisedAddress: "{brokerId}.lb.example.it"
配置完成后重新部署Kafka集群,确保配置生效。
- 若使用统一集群外部地址(
验证元数据返回的地址正确性
使用kafkacat工具测试外部地址返回的元数据:kafkacat -L -b kafka.lb.example.it:39093检查输出中的
broker条目,确认返回的是外部可访问地址,而非内部Pod地址。确认LoadBalancer配置有效性
通过kubectl命令检查服务状态:kubectl get svc -n ckafka确认两个LoadBalancer服务的
EXTERNAL-IP已正常分配,且端口映射存在39093:xxxx/TCP(xxxx为Kafka Pod的内部监听端口)。检查网络与防火墙规则
- 确认AKS集群防火墙允许外部访问LoadBalancer的39093端口。
- 检查集群内部网络策略,确保未阻止Kafka Pod与LoadBalancer服务的通信。
调整客户端配置(可选)
确保Node.js客户端使用正确的端口39093连接,若使用独立broker LB,需在客户端所在环境的/etc/hosts添加所有broker的LB地址映射。
内容的提问来源于stack exchange,提问作者Luana Mantovan
相关产品推荐
相关产品推荐

