背景
部署过多套k8s
集群,发现在其中一套k8s
环境中,在Pod内无法访问Service Name
,访问了很多次,偶尔又能通,使用Service
的IP
能正常访问,域名解析的问题基本确定与CoreDNS
有关系,于是开始了一系列的排查之路。
使用busybox工具测试网络
- 创建
busybox
的Pod
kubectl apply -f-<<EOF
apiVersion: v1
kind: Pod
metadata:
name: busybox
spec:
containers:
- name: busybox
image: busybox-curl:latest
imagePullPolicy: IfNotPresent
command: ["sleep","3600"]
EOF
- 进入
busybox
的Pod
kubectl exec busybox -it -- sh
- 查看
nameserver
/home # cat /etc/resolv.conf
- 显示如下
nameserver 10.43.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
- 修改
nameserver
为CoreDNS
的Pod
的IP
,进行逐个测试 - 先查看CoreDNS所有的Pod的IP
kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o wide
看到的列表如下
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
coredns-95dcf6b48-9vxtq 1/1 Running 0 4h52m 10.42.168.201 xxx1 <none> <none>
coredns-95dcf6b48-lcqmt 1/1 Running 0 18h 10.42.166.89 xxx2 <none> <none>
coredns-95dcf6b48-nwp8z 1/1 Running 0 28m 10.42.204.47 xxx3 <none> <none>
- 按如下逐个修改
resolv.conf
进入测试
nameserver 10.42.204.47
#nameserver 10.42.166.89
#nameserver 10.42.168.201
#nameserver 10.43.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
- 每次修改一次
nameserver
,就使用命令nslookup Service-Name
,也可以使用ping
或curl
命令访问Service
域名
CoreDNS测试结果
经过测试后,发现其中一个Pod
无法正常做域名解析,其它Pod
均能正常解析Service
域名
解决办法
- 删除无法正常工作的Pod
kubectl delete pod coredns-95dcf6b48-9vxtq
- 立马会重新启动一个新
Pod
,查看IP
- 放到
busybox
的resolv.conf
进行测试,工作正常