在minikube Kubernetes集群中运行eclipse-mosquito MQTT代理Docker镜像和自定义paho-mqtt Python客户端

p4tfgftt  于 5个月前  发布在  Kubernetes
关注(0)|答案(1)|浏览(87)

我想在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_1mqtt_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_addressport上连接时,客户端pod会以Name or service not known退出。如何让客户端和服务器在同一网络上通过MQTT进行通信?

vfwfrxfs

vfwfrxfs1#

您需要包含指向Deployment的Kubernetes Service描述。
服务的名称将是您在客户机代码中用来连接代理的主机名。
例如

apiVersion: v1
kind: Service
metadata:
  name: mqtt-broker
spec:
  selector:
    app: mqtt
  ports:
    - name: mqtt-native
      targetPort: 1883
      port: 1883

字符串
您可以使用mqtt-broker作为主机名(或mqtt-broker.<namespace>用于跨名称空间访问)

相关问题