Microk8s部署Kafka后Python生产者连接失败问题求助
我用两个Python脚本实现简单的生产者和消费者,Kafka部署在Microk8s上,但运行producer.py时反复出现以下错误:
...|FAIL|rdkafka#producer-1| [thrd:...:9092/bootstrap]: ...:9092/bootstrap: Connect to ipv4#localhost:9092 failed: Connection refused (after 0ms in state CONNECT, ... identical error(s) suppressed
我确定是监听器配置的问题,但因为缺乏相关知识一直没找到修复方法。已经查过一些资料,但没找到能理解并执行的解决方案。
复现步骤:
- 生产者和消费者的Python脚本取自第三方教程
- 按官方文档安装Microk8s,同时安装了Helm(项目要求用Helm Chart)
- 通过以下命令安装Kafka:
helm repo add bitnami https://charts.bitnami.com/bitnami helm install kafka-release bitnami/kafka
解决方法
Bitnami的Kafka Helm Chart默认只配置了集群内部可访问的监听器,本地主机的Python脚本属于外部客户端,需要调整配置来允许外部访问:
1. 重新配置Kafka,启用外部访问
执行Helm升级命令,开启外部访问并指定NodePort:
helm upgrade kafka-release bitnami/kafka --set service.type=NodePort --set externalAccess.enabled=true --set externalAccess.service.nodePorts[0]=30092
如果是刚安装完还没改配置,也可以直接用上面的参数重新安装。
2. 获取Microk8s节点的内部IP
在部署Microk8s的机器上执行命令,找到节点的IP:
microk8s kubectl get nodes -o wide
查看输出里INTERNAL-IP列的地址,比如192.168.31.15。
3. 修改Python生产者的连接地址
打开你的producer.py脚本,把bootstrap_servers的值从localhost:9092替换成刚才拿到的节点IP加30092端口,示例:
producer = KafkaProducer(bootstrap_servers=['192.168.31.15:30092'], value_serializer=lambda x: json.dumps(x).encode('utf-8'))
4. 临时测试方案(可选)
如果只是临时测试,不想修改Helm配置,可以用端口转发把Kafka的9092端口映射到本地:
microk8s kubectl port-forward svc/kafka-release 9092:9092
这时候生产者脚本用localhost:9092就能连接,但这个转发会在终端关闭后失效,只适合临时调试。
内容的提问来源于stack exchange,提问作者wb1210

