k8s 集群内无法通过 svc 域名访问的问题处理
一、问题
k8s集群内,无法通过svc 域名访问,以下为测试报错:
root@backend-auth-5565c87f8b-nmrbn:/data# ping mysql.dubhe-system.svc.cluster.local
ping: mysql.dubhe-system.svc.cluster.local: Temporary failure in name resolution
root@backend-auth-5565c87f8b-nmrbn:/data#
二、解决方法
问题排查
这个问题可能是由于DNS解析的配置问题导致的。在Kubernetes集群中,DNS服务负责将服务名称解析为对应的IP地址。
首先,你可以检查以下几点:
-
CoreDNS是否正常运行:可以使用命令
kubectl get pods -n kube-system
来查看CoreDNS的状态。确保所有的CoreDNS Pod都处于Running状态。 -
CoreDNS配置是否正确:可以通过查看CoreDNS的配置文件来确认是否正确配置了svc域名的解析。可以通过执行
kubectl get configmap coredns -n kube-system -o yaml
来获取CoreDNS的配置信息。 -
网络插件是否正常工作:如果你使用的是Calico等网络插件,确保网络插件正常工作并正确配置。
-
DNS策略是否正确:检查Pod的DNS策略,确保它们正确配置为"ClusterFirst"或"Default"。可以通过执行
kubectl get pod <pod-name> -o yaml
来查看Pod的配置信息。
如果上述步骤都没有发现问题,可以尝试以下解决方法:
-
清除Pod的DNS缓存:在Pod所在的节点上执行以下命令清除DNS缓存:
sudo systemctl restart kubelet
-
检查DNS配置是否正确:确保kubelet的
--resolv-conf
参数正确指向节点上的resolv.conf文件。可以通过查看kubelet的配置文件/etc/default/kubelet
来确认。 -
检查集群的DNS策略:可以通过查看kubelet的配置文件
/etc/default/kubelet
来确认KUBELET_EXTRA_ARGS
中是否正确配置了--cluster-dns
和--cluster-domain
参数。
如果问题仍然存在,建议查看集群的网络和DNS配置,以及相关组件的日志,进一步排查问题。
实际解决
根据以上提示排查,发现 coreDNS 在集群内部挂了,所以,删掉重启就ok 了;
[root@192.168.1.101 ~]#kubectl get pods -n kube-system | grep coredns
coredns-5787695b7f-wbpj9 0/1 ImagePullBackOff 0 15h
# 处理方法,删掉重启
[root@192.168.1.101 ~]#kubectl delete pod coredns-5787695b7f-wbpj9 -n kube-system
pod "coredns-5787695b7f-wbpj9" deleted
# 重启之后就ok了
root@backend-auth-5565c87f8b-nmrbn:/data# ping mysql.dubhe-system.svc.cluster.local
PING mysql.dubhe-system.svc.cluster.local (10.68.1.26) 56(84) bytes of data.
64 bytes from mysql.dubhe-system.svc.cluster.local (10.68.1.26): icmp_seq=1 ttl=64 time=0.058 ms
64 bytes from mysql.dubhe-system.svc.cluster.local (10.68.1.26): icmp_seq=2 ttl=64 time=0.097 ms
64 bytes from mysql.dubhe-system.svc.cluster.local (10.68.1.26): icmp_seq=3 ttl=64 time=0.100 ms
64 bytes from mysql.dubhe-system.svc.cluster.local (10.68.1.26): icmp_seq=4 ttl=64 time=0.102 ms
为者常成,行者常至
自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)