Kubernetes Pod中Python MQTT订阅脚本无法输出消息日志排查
问题:Kubernetes Pod内Python MQTT订阅脚本无法接收消息日志
我在Kubernetes Pod的Docker容器中运行Python MQTT订阅脚本,脚本设计为收到消息时打印内容(后续计划保存到.txt文件)。目前只能看到客户端连接相关日志,看不到消息接收日志。用mosquitto_pub/mosquitto_sub在终端能正常接收消息,但Pod内脚本无输出,求排查原因。
相关配置与代码
Dockerfile
FROM docker.deere.com/python:3.8-slim RUN pip install paho-mqtt COPY subscriber.py /subscriber.py CMD ["python", "./subscriber.py"]
Kubernetes Deployment
apiVersion: apps/v1 kind: Deployment metadata: name: mosquitto-broker spec: replicas: 1 selector: matchLabels: app: mqtt-broker template: metadata: labels: app: mqtt-broker spec: containers: - name: mqtt-broker-init image: my-mosquitto:latest ports: - containerPort: 1883 - name: mqtt-subs image: mosquitto-subscriber:latest
Python订阅脚本
import paho.mqtt.client as mqtt def on_connect(client, userdata, flags, rc): print("Connected with result code " + str(rc)) client.subscribe("test/topic") def on_message(client, userdata, msg): print("Received message: " + msg.payload.decode()) client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION1, "SubscriberTest") client.on_connect = on_connect client.on_message = on_message client.connect("172.30.0.130", 30988, 60) client.loop_forever()
Pod日志输出
❯ kubectl logs deployment/mosquitto-broker Found 4 pods, using pod/mqtt-broker-68c7545bc8-4fs86 Defaulted container "mqtt-broker" out of: mqtt-broker, mosquitto-subs 1708114383: mosquitto version 2.0.18 starting 1708114383: Config loaded from /mosquitto/config/mosquitto.conf. 1708114383: Opening ipv4 listen socket on port 1883. 1708114383: Opening ipv6 listen socket on port 1883. 1708114383: mosquitto version 2.0.18 running 1708114429: New connection from 10.244.0.1:32866 on port 1883. 1708114429: New client connected from 10.244.0.1:32866 as SubscriberTest (p2, c1, k60). 1708114471: New connection from 10.244.0.1:23628 on port 1883. 1708114471: New client connected from 10.244.0.1:23628 as auto-8F54FBAD-6D14-FBB1-6C0B-9E9A5E6101AB (p2, c1, k60). 1708114471: Client auto-8F54FBAD-6D14-FBB1-6C0B-9E9A5E6101AB disconnected. 1708114474: New connection from 10.244.0.1:14961 on port 1883. 1708114474: Client SubscriberTest already connected, closing old connection. 1708114474: New client connected from 10.244.0.1:14961 as SubscriberTest (p2, c1, k60). 1708114475: New connection from 10.244.0.1:18285 on port 1883. 1708114475: Client SubscriberTest already connected, closing old connection. 1708114475: New client connected from 10.244.0.1:18285 as SubscriberTest (p2, c1, k60). 1708114476: New connection from 10.244.0.1:11965 on port 1883. 1708114476: Client SubscriberTest already connected, closing old connection. 1708114476: New client connected from 10.244.0.1:11965 as SubscriberTest (p2, c1, k60). 1708114477: New connection from 10.244.0.1:50342 on port 1883. 1708114477: Client SubscriberTest already connected, closing old connection. 1708114477: New client connected from 10.244.0.1:50342 as SubscriberTest (p2, c1, k60). 1708114604: New connection from 10.244.0.1:48118 on port 1883. 1708114604: New client connected from 10.244.0.1:48118 as auto-6CE6C67F-7CC7-53BD-2627-F3A483F7E774 (p2, c1, k60). 1708114604: Client auto-6CE6C67F-7CC7-53BD-2627-F3A483F7E774 disconnected. 1708115507: New connection from 10.244.0.1:33888 on port 1883. 1708115507: Client SubscriberTest already connected, closing old connection. 1708115507: New client connected from 10.244.0.1:33888 as SubscriberTest (p2, c1, k60). 1708115512: New connection from 10.244.0.1:60569 on port 1883. 1708115512: Client SubscriberTest already connected, closing old connection. 1708115512: New client connected from 10.244.0.1:60569 as SubscriberTest (p2, c1, k60). 1708115565: New connection from 10.244.0.1:14096 on port 1883. 1708115565: New client connected from 10.244.0.1:14096 as auto-451A6E10-1B48-73E8-5BA8-A7606A5D4AC9 (p2, c1, k60). 1708115565: Client auto-451A6E10-1B48-73E8-5BA8-A7606A5D4AC9 disconnected. 1708115567: New connection from 10.244.0.1:15433 on port 1883. 1708115567: New client connected from 10.244.0.1:15433 as auto-3B09DB6C-5735-EEF5-2F17-279A7221E179 (p2, c1, k60). 1708115567: Client auto-3B09DB6C-5735-EEF5-2F17-279A7221E179 disconnected. 1708115929: New connection from 10.244.0.1:23931 on port 1883. 1708115929: New client connected from 10.244.0.1:23931 as auto-7ECB485C-F10A-3DB3-9CB4-DF4F481EFF46 (p2, c1, k60). 1708115929: Client auto-7ECB485C-F10A-3DB3-9CB4-DF4F481EFF46 disconnected. 1708115939: New connection from 10.244.0.1:33648 on port 1883. 1708115939: New client connected from 10.244.0.1:33648 as auto-A4247317-B4D0-1B57-A339-E29F57E70313 (p2, c1, k60). 1708115939: Client auto-A4247317-B4D0-1B57-A339-E29F57E70313 disconnected.
排查与解决方法
1. 查看正确容器的日志
当前日志默认展示的是mqtt-broker容器的内容,但订阅脚本运行在mqtt-subs容器中。执行以下命令查看订阅容器的日志:
kubectl logs pod/mqtt-broker-68c7545bc8-4fs86 -c mqtt-subs # 或直接指定Deployment和容器名 kubectl logs deployment/mosquitto-broker -c mqtt-subs
2. 解决客户端ID冲突
从Broker日志反复出现Client SubscriberTest already connected, closing old connection,说明固定客户端ID导致连接被强制断开,错过消息。解决方式:
- 去掉固定ID,让paho自动生成唯一ID:
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION1) - 或生成随机唯一ID:
import random import string client_id = "SubscriberTest-" + ''.join(random.choices(string.ascii_uppercase + string.digits, k=8)) client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION1, client_id)
3. 检查MQTT主题权限
Mosquitto 2.0+默认启用ACL,若Broker配置了访问控制规则,可能限制test/topic的订阅权限。检查mosquitto.conf,确保允许客户端访问该主题:
allow_anonymous true topic read test/topic
若使用认证,需确保客户端拥有对应主题的订阅权限。
4. 验证连接地址与端口
脚本连接的172.30.0.130:30988需确认是否为Broker的正确访问地址:
- 若Broker与订阅脚本在同一Pod内,应使用
localhost:1883连接 - 若Broker通过Service暴露,应使用Service名称作为主机名,如
mosquitto-service:1883 - 检查Kubernetes是否为Broker创建了Service,端口映射是否正确
5. 禁用Python输出缓冲
Python的print默认有缓冲,可能导致日志不实时输出。解决方式:
- 在脚本开头添加:
import sys sys.stdout.flush() - 或修改Dockerfile的CMD,添加
-u参数禁用缓冲:CMD ["python", "-u", "./subscriber.py"]
内容的提问来源于stack exchange,提问作者Adriana Treviño
相关产品推荐
相关产品推荐

