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