Mosquitto Broker - 供 MQTT 客户端使用的 DNS 名称而不是 IP 地址

时间:2021-01-29 18:40:51

标签: kubernetes mqtt mosquitto coredns

我能够让 Eclipse mosquitto 代理启动并运行,MQTT 客户端能够使用代理的 IP 地址与代理通信。然而,当我在 kubernetes 上运行这些时,代理 IP 在重启时不断变化。我想为代理启用 DNS 名称服务,以便客户端可以使用代理名称而不是 IP。 coreDNS 在 kubernetes 中默认运行..

有什么可以做的建议吗?

$ nslookup kubernetes.default
Server:     10.43.0.10
Address:    10.43.0.10:53

** server can't find kubernetes.default: NXDOMAIN

** server can't find kubernetes.default: NXDOMAIN

2 个答案:

答案 0 :(得分:0)

您可以使用 headless service 来实现。您可以通过将服务规范中的 clusterIP 字段设置为 None 来创建它。一旦你这样做,DNS 服务器将返回 pod IP 而不是单个服务,而不是返回单个 DNS A 记录,DNS 服务器将返回该服务的多个 A 记录,每个记录都指向支持该服务的单个 Pod 的 IP目前。

有了这个,您的客户端可以执行单个 DNS A 记录查找,以获取作为服务一部分的所有 Pod 的 IP。 Headless 服务也经常被用作服务发现系统。

apiVersion: v1
kind: Service
metadata:
  name: your-headless-service
spec:
  clusterIP: None # <-- This makes the service hadless! 
  selector:
    app: your-mosquito-broker-pod
  ports:
    - protocol: TCP
      port: 80
      targetPort: 3000 

您也可以使用常规服务解析 dns 名称。不同之处在于,使用无头服务,您可以直接与 Pod 对话,而不是将服务用作负载平衡器或代理。

通过 dns 解析服务很容易,您可以使用以下模式来实现:

backend-broker.default.svc.cluster.local

backend-broker 对应服务名称,default 代表定义服务的命名空间,svc.cluster.local 是可配置的集群域后缀,用于所有集群本地服务名称。

请注意,如果您的客户端和代理位于同一命名空间中,则可以省略 svc.cluster.local 后缀和命名空间。然后,您将服务称为:

backend-broker

我强烈建议您阅读有关 kubernetes 中 Dns 的更多信息。

答案 1 :(得分:0)

全部,

感谢您回答查询,尤其是 Thomas 的代码指针。根据您的建议,一旦我为 POD 创建了一个服务,我就能够让 DNS 正常工作,因为 core-dns 已经在运行。在此之后,我也能够在 MQTT 代理中使用主机名。

    opts.AddBroker(fmt.Sprintf("tcp://mqtt-broker:1883"))

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: "2021-02-01T19:08:46Z"
  labels:
    app: ipc
  name: mqtt-broker
  namespace: default

顺便说一句,我无法使无头服务工作,遇到了这个错误,所以继续使用 ClusterIP 本身 + 1883 暴露的 MQTT 端口。请问有什么建议吗?

`services "mqtt-broker" was not valid:`
`spec.clusterIPs[0]: Invalid value: []string{"None"}: may not change once set`