首页 > 解决方案 > 无法在公共域上连接 Mosquitto Broker

问题描述

我的 Kubernetes 上有一个 Mosquitto Broker。我可以连接到专用网络中的 Mosquitto Broker。它运作良好。但是当我们使用公共域(我们使用 Sophos UTM 9)时,客户端无法连接到 Mosquitto Broker。

我是 Kubernetes 的新手。这是 mosquitto.yaml 文件:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mosquitto
spec:
  selector:
    matchLabels:
      app: mosquitto
  replicas: 1
  template:
    metadata:
      labels:
        app: mosquitto
    spec:
      containers:
      - name: mosquitto
        image: eclipse-mosquitto:v1.16.10
        resources:
          limits:
            cpu: "1"
            memory: 2Gi
          requests:
            cpu: "1"
            memory: 2Gi
        imagePullPolicy: Always
        ports:
        - containerPort: 1883
---

apiVersion: v1
kind: Service
metadata:
  name: mosquitto
spec:
  externalIPs:
  - xxx.xxx.xxx.xxx
  type: ClusterIP
  ports:
    - name: mqtt
      port: 1883
      targetPort: 1883
      protocol: TCP
  selector:
    app: mosquitto

我使用 NodeJS 连接公共领域。这个 NodeJS 代码是:

var mqtt = require('mqtt');
var client = mqtt.connect('mqtt://mydomain.com:1883');

client.on('connect', function () {
    client.subscribe(topic)
    console.log("Subscribed topic " + topic);
})

我想知道 kubernetes 或 Sophos UTM 9 的问题是什么。我错过了什么吗?

为了让 Kubernetes 上的 Mosquitto 使用公共域,我需要做什么?

我非常感激。

标签: kubernetesmosquitto

解决方案


在测试了你的 yaml 文件后,我得出的结论是你的配置几乎是正确的,我的意思是因为:

  • 您使用的图像eclipse-mosquitto:v1.16.10不存在。您可以在此处查看所有可用的标签。

因此,最可能的问题是您的 pod 可能没有运行。您可以通过运行以下命令并检查列来检查它STATUS

$ kubectl get pods -l=app=mosquitto
NAME                        READY   STATUS    RESTARTS   AGE
mosquitto-c9dc57d59-98l8r   1/1     Running   0          5m53s

这是对我有用的 yaml。注意:出于测试目的,我已从服务和部署中删除了externalIPandresource limits并将图像替换为eclipse-mosquitto:1.6.10

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mosquitto
spec:
  selector:
    matchLabels:
      app: mosquitto
  replicas: 1
  template:
    metadata:
      labels:
        app: mosquitto
    spec:
      containers:
      - name: mosquitto
        image: eclipse-mosquitto:1.6.10
        imagePullPolicy: Always
        ports:
        - containerPort: 1883
---

apiVersion: v1
kind: Service
metadata:
  name: mosquitto
spec:
  type: ClusterIP
  ports:
    - name: mqtt
      port: 1883
      targetPort: 1883
      protocol: TCP
  selector:
    app: mosquitto

部署后,我使用 dnsutil 容器进行了测试(您可以在此处找到规范):

kubectl exec dnsutils -- sh -c 'apk update && apk add mosquitto-clients'
kubectl exec dnsutils -- mosquitto_pub -h mosquitto -t 'test/topic' -m 'upvoteIt'

检查 mosquitto pod 中的日志:

kubectl logs mosquitto-xxxxx 

1597829622: New client connected from 172.17.0.4 as mosqpub|88-dnsutils (p1, c1, k60).
1597829622: Client mosqpub|88-dnsutils disconnected.

如果您想在测试前查看消息,请打开第二个终端并运行此命令以查看 mosquitto 服务器正在接收的消息:

$ kubectl exec mosquitto-xxxxx -- mosquitto_sub -v -t 'test/topic'
test/topic upvoteIt

mosquitto-xxxxx 是您的 pod 的名称。


推荐阅读