Kubernetes DNS查找问题和/etc/resolv.conf文件中的“无效”

时间:2019-11-05 08:37:40

标签: kubernetes kubeadm kube-dns coredns

我已经使用kubeadm和Flannel网络驱动程序部署了一个由一个主服务器和两个工作人员组成的Kubernetes集群(因此我将--pod-network-cidr=10.244.0.0/16标志传递给了kubeadm init)。

这些节点正在使用VPN进行通信,以便:

  • 主节点IP地址为10.0.0.170
  • 工人1的IP地址是10.0.0.247
  • 工人2的IP地址是10.0.0.35

当我创建一个新的pod并尝试ping google时,出现以下错误:

/ # ping google.com
ping: bad address 'google.com'

我遵循了Kubernetes DNS debugging resolution文档页面上的说明:

$ kubectl exec -ti busybox -- nslookup kubernetes.default
Server:    10.96.0.10
Address 1: 10.96.0.10

nslookup: can't resolve 'kubernetes.default'
command terminated with exit code 1

请先检查本地DNS配置

$ kubectl exec busybox cat /etc/resolv.conf
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local invalid
options ndots:5

检查DNS窗格是否正在运行

$ kubectl get pods --namespace=kube-system -l k8s-app=kube-dns
NAME                       READY   STATUS    RESTARTS   AGE
coredns-5c98db65d4-cqzb7   1/1     Running   0          7d18h
coredns-5c98db65d4-xc5d7   1/1     Running   0          7d18h

检查DNS窗格中的错误

$ for p in $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name); do kubectl logs --namespace=kube-system $p; done
.:53
2019-10-28T13:40:41.834Z [INFO] CoreDNS-1.3.1
2019-10-28T13:40:41.834Z [INFO] linux/amd64, go1.11.4, 6b56a9c
CoreDNS-1.3.1
linux/amd64, go1.11.4, 6b56a9c
2019-10-28T13:40:41.834Z [INFO] plugin/reload: Running configuration MD5 = 5d5369fbc12f985709b924e721217843
.:53
2019-10-28T13:40:42.870Z [INFO] CoreDNS-1.3.1
2019-10-28T13:40:42.870Z [INFO] linux/amd64, go1.11.4, 6b56a9c
CoreDNS-1.3.1
linux/amd64, go1.11.4, 6b56a9c
2019-10-28T13:40:42.870Z [INFO] plugin/reload: Running configuration MD5 = 5d5369fbc12f985709b924e721217843

DNS服务启动了吗?

$ kubectl get svc --namespace=kube-system
NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
kube-dns   ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   7d18h

是否暴露了DNS端点?

$ kubectl get ep kube-dns --namespace=kube-system
NAME       ENDPOINTS                                               AGE
kube-dns   10.244.0.3:53,10.244.0.4:53,10.244.0.3:53 + 3 more...   7d18h

是否正在接收/处理DNS查询?

我对coredns ConfigMap进行了更新,再次运行了nslookup kubernetes.default命令,结果如下:

$ for p in $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name); do kubectl logs --namespace=kube-system $p; done
.:53
2019-10-28T13:40:41.834Z [INFO] CoreDNS-1.3.1
2019-10-28T13:40:41.834Z [INFO] linux/amd64, go1.11.4, 6b56a9c
CoreDNS-1.3.1
linux/amd64, go1.11.4, 6b56a9c
2019-10-28T13:40:41.834Z [INFO] plugin/reload: Running configuration MD5 = 5d5369fbc12f985709b924e721217843
[INFO] Reloading
2019-11-05T08:12:12.511Z [INFO] plugin/reload: Running configuration MD5 = 906291470f7b1db8bef629bdd0056cad
[INFO] Reloading complete
2019-11-05T08:12:12.608Z [INFO] 127.0.0.1:55754 - 7434 "HINFO IN 4808438627636259158.5471394156194192600. udp 57 false 512" NXDOMAIN qr,rd,ra 132 0.095189791s
.:53
2019-10-28T13:40:42.870Z [INFO] CoreDNS-1.3.1
2019-10-28T13:40:42.870Z [INFO] linux/amd64, go1.11.4, 6b56a9c
CoreDNS-1.3.1
linux/amd64, go1.11.4, 6b56a9c
2019-10-28T13:40:42.870Z [INFO] plugin/reload: Running configuration MD5 = 5d5369fbc12f985709b924e721217843
[INFO] Reloading
2019-11-05T08:12:47.988Z [INFO] plugin/reload: Running configuration MD5 = 906291470f7b1db8bef629bdd0056cad
[INFO] Reloading complete
2019-11-05T08:12:48.004Z [INFO] 127.0.0.1:51911 - 60104 "HINFO IN 4077052818408395245.3902243105088660270. udp 57 false 512" NXDOMAIN qr,rd,ra 132 0.016522153s

因此,DNS吊舱似乎正在接收请求。

但是我已经有这个错误了!

该错误是我第一次部署群集时发生的。

那时候,我注意到kubectl get nodes -o wide将工作节点的公共IP地址显示为“ INTERNAL-IP”,而不是私有IP。

进一步看,我发现在工作节点上,kubelet缺少--node-ip标志,因此我将其添加并重新启动Kubelet,问题不再存在。然后,我得出结论,认为丢失标志是原因,但事实并非如此,因为kubectl get nodes -o wide命令将工作人员的内部IP地址显示为“ INTERNAL-IP”。

现在

DNS服务器IP地址10.96.0.10在我看来错了,我无法从Pod ping它。 DNS容器的IP地址为10.244.0.3和10.244.0.4,我也无法ping通。

我只是试图删除coredns pod,以便再次安排它们,现在更改了它们的IP地址,我可以从pod ping通它们,kubectl exec -ti busybox -- nslookup kubernetes.default可以正常工作:

$ kubectl exec -ti busybox -- nslookup kubernetes.default
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      kubernetes.default
Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local

但是resolv.conf文件中仍然包含“无效”:

$ kubectl exec busybox cat /etc/resolv.conf
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local invalid
options ndots:5
  • 有人可以向我解释发生了什么事吗?
  • 如何解决resolv.conf文件中的这个“无效”内容?

1 个答案:

答案 0 :(得分:3)

根据CoreDNS ConfigMap中的配置,默认上游名称服务器是从节点继承的,即节点在群集域(.cluster.local)之外的所有内容。

因此,“无效”是在Pod创建期间从Node的/etc/resolv.conf文件复制的条目。

如果您要在节点上手动修改/etc/resolv.conf,则每个具有dnsPolicy: ClusterFirst的Pod都会继承此修改的/etc/resolv.conf

因此,在将--node-ip标志添加到kubelet并重新启动CoreDNS Pod之后,您应该重新部署您的busybox Pod,以便它可以从Node继承/etc/resolv.conf