我想在Kubernetes集群中运行一个MQTT代理和两个客户端,并能够来回发送消息。
因此,我想使用eclipse-mosquitto Docker image和两个使用paho-mqtt Python library的自定义客户端:
import paho.mqtt.client as mqtt
import time
broker_address = "localhost"
port = 1883
client_id = "client1"
counter = 0
def on_message(client, userdata, message):
global counter
counter += 1
print(f"Client 1 received: {message.payload.decode()} - counter: {counter}")
time.sleep(1)
client.publish("test/topic", f"Client 1: {counter}")
client = mqtt.Client(client_id)
client.on_message = on_message
client.connect(broker_address, port=port)
client.subscribe("test/topic")
client.loop_start()
while True:
client.publish("test/topic", f"Client 1: {counter}")
字符串
在Docker中,当将所有这些都放在同一个Docker网络上时,这可以很好地工作。代理容器名为mosquitto-broker
,然后可以被客户端找到。他们订阅一个主题并在其上发布消息。
然而,在Kubernetes集群上重新创建相同的用例似乎需要不同的方法,因为K8s有自己的网络生态系统,broker_address
将是不同的。由于我的Docker映像mqtt_client_1
和mqtt_client_2
是本地的,所以我将imagePullPolicy
设置为Never
。
apiVersion: apps/v1
kind: Deployment
metadata:
name: mqtt-deployment
labels:
app: mqtt
spec:
replicas: 1
selector:
matchLabels:
app: mqtt
template:
metadata:
labels:
app: mqtt
spec:
containers:
- name: eclipse-mosquitto
image: eclipse-mosquitto
imagePullPolicy: IfNotPresent
ports:
- containerPort: 1883
volumeMounts:
- name: mosquitto-config
mountPath: /mosquitto/config/mosquitto.conf
subPath: mosquitto.conf
- name: mqtt-client1
image: mqtt_client_1
imagePullPolicy: Never
command:
- python
- /app/client1.py
- name: mqtt-client2
image: mqtt_client_2
imagePullPolicy: Never
command:
- python
- /app/client2.py
volumes:
- name: mosquitto-config
configMap:
name: mosquitto-config
型
我也用了一个Map:
apiVersion: v1
kind: ConfigMap
metadata:
name: mosquitto-config
data:
mosquitto.conf: |-
listener 1883
allow_anonymous true
型
但是,当尝试在broker_address
和port
上连接时,客户端pod会以Name or service not known
退出。如何让客户端和服务器在同一网络上通过MQTT进行通信?
1条答案
按热度按时间vfwfrxfs1#
您需要包含指向Deployment的Kubernetes Service描述。
服务的名称将是您在客户机代码中用来连接代理的主机名。
例如
字符串
您可以使用
mqtt-broker
作为主机名(或mqtt-broker.<namespace>
用于跨名称空间访问)