问题描述
k8s 集群模式nacos无法相互发现
原因分析:
检查nacos日志发现,报错无法选主
nacos控制台可以看到频繁在投票选举,异常节点ip可以看到,k8s svc全路径local后多了一个小点(.),这就是罪魁祸首了。
K8S中StatefulSet是有状态应用:
- Pod名称末尾有编号。从0开始,按顺序启动,前边Pod启动成功后,才开始启动后边Pod。
- 拥有固定的网络标志
- 持久化存储
网络标志最终是通过Headless Service来实现的,Headless Service 服务没有cluster IP
- 对于ClusterIP模式的Service来说,它的A记录格式是serviceName.namespace.svc.cluster.local,当你访问这条 A 记录的时候,它解析到的就是该 Service 的 VIP 地址。
- 对于指定了 clusterIP=None 的 Headless Service来说,它的A记录的格式跟上面一样,但是访问记录后返回的是Pod的IP地址集合。Pod 也会被分配对应的 DNS A 记录,格式为:podName.serviceName.namesapce.svc.cluster.local
解决方案:
排查kubelet配置文件,ClusterDomain属性配置错误,导致Headless Service服务域名解析错误
导致自动生成的DNS记录多了一个点,podName.serviceName.namesapce.svc.cluster.local.
无法解析
修改kubelet配置,删掉多余的点,重启kubelet问题恢复