GKE上部署的Strimzi Kafka集群无法从外部机器访问问题咨询
问题根因
该元数据超时错误核心源于两个常见问题:
- 你仅放开了Kafka外部引导服务(bootstrap)的NodePort,未放开单节点Kafka broker自身对应的NodePort:Kafka客户端完成和bootstrap的连接后,会从bootstrap获取broker的对外访问地址,需要单独和broker的NodePort建立连接拉取Topic元数据,该端口被防火墙拦截会导致元数据拉取失败。
- 目标Topic
my-topic未提前创建,且集群未开启自动创建Topic配置。
排查步骤
- 执行
kubectl get svc -n kafka | grep NodePort,查看Kafka相关服务的端口映射:
输出示例如下:
其中my-cluster-kafka-external-bootstrap NodePort 10.4.12.34 <none> 9094:31045/TCP 2d my-cluster-kafka-0 NodePort 10.4.5.67 <none> 9094:31245/TCP 2dmy-cluster-kafka-0服务9094端口对应的NodePort(示例中为31245)就是需要额外放开的端口。 - 执行
kubectl -n kafka exec -it my-cluster-kafka-0 -- bin/kafka-topics.sh --list --bootstrap-server localhost:9092,检查my-topic是否存在。
修复方案
放开broker对应的NodePort:
执行GCP防火墙规则放开上一步查到的broker NodePort,替换下方命令中的<broker-node-port>为你实际查询到的端口:gcloud compute firewall-rules create allow-kafka-broker-nodeport --allow tcp:<broker-node-port>如果你后续扩容为多节点Kafka集群,需要把所有broker对应的NodePort都加入防火墙放行规则。
创建目标Topic(或开启自动创建):
方式一:手动创建Topic,集群内执行如下命令:kubectl -n kafka run kafka-topics --image=quay.io/strimzi/kafka:0.26.0-kafka-3.0.0 --rm -it --command -- bin/kafka-topics.sh --create --topic my-topic --bootstrap-server my-cluster-kafka-bootstrap:9092 --partitions 1 --replication-factor 1方式二:开启自动创建Topic,修改你的Kafka自定义资源YAML,在
spec.kafka.config下添加配置:auto.create.topics.enable: true重新apply该YAML,等待Strimzi完成集群滚动更新后即可自动创建不存在的Topic。
验证访问:
配置完成后重新使用外部控制台生产者测试,即可正常发送消息。
内容的提问来源于stack exchange,提问作者Karan Alang
相关产品推荐
相关产品推荐

