【问题标题】:Mosquitto Broker - DNS name instead of IP address for MQTT clients to useMosquitto Broker - MQTT 客户端使用 DNS 名称而不是 IP 地址
【发布时间】:2021-01-29 18:40:51
【问题描述】:

我能够让 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

【问题讨论】:

  • 向我们展示您的尝试。 nslookup 命令正在尝试查找域而不是无法正常工作的主机。
  • 目前,我正在尝试查看如何让 pod.name ping 在 kubernetes 中工作,以便我可以在 MQTT 客户端中使用相同的字符串。但这对我也不起作用,如下所示: kubectl get pods mqtt-broker 1/1 Running 0 9d [#] ping mqtt-broker.mosquitto-broker ping: mqtt-broker.mosquitto-broker: Name or service not known [# ] 种类:Pod 元数据:名称:mqtt-broker
  • EDIT问题添加详情
  • 我不认为你了解 K8s DNS 的工作原理...kubernetes.io/docs/concepts/services-networking/dns-pod-service

标签: kubernetes mqtt mosquitto coredns


【解决方案1】:

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

这样,您的客户端可以执行单个 DNS A 记录查找,以获取属于该服务的所有 pod 的 IP。无头服务也经常被用作服务发现系统。

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 的信息。

【讨论】:

    【解决方案2】:

    全部,

    感谢您回答问题,特别是 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 本身 + MQTT 的 1883 暴露端口。请问有什么建议吗?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 2013-11-11
      • 2022-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多