You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 20:27:02