【问题标题】:Kubernetes DNS lookup issue and "invalid" in the /etc/resolv.conf fileKubernetes DNS 查找问题和 /etc/resolv.conf 文件中的“无效”
【发布时间】:2020-03-01 14:15:02
【问题描述】:

我已经使用kubeadm 和 Flannel 网络驱动程序部署了一个由一个 master 和两个 worker 组成的 Kubernetes 集群(所以我将 --pod-network-cidr=10.244.0.0/16 标志传递给了kubeadm init)。

这些节点使用 VPN 一起通信,因此:

  • 主节点IP地址为10.0.0.170
  • Worker 1 IP 地址为 10.0.0.247
  • Worker 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 pod 是否正在运行

$ 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 pod 中的错误

$ 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 pod 正在接收请求。

但我已经遇到了这个错误!

我第一次部署集群时发生了这个错误。

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

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

现在

DNS 服务器 IP 地址 10.96.0.10 在我看来是错误的,我无法从 pod ping 通它。 DNS pod 的 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文件里面还是有“invalid”:

$ 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 文件中解决这个“无效”问题?

【问题讨论】:

  • 重启 CoreDNS pod 后你是否重新部署了“busybox”pod?
  • 不,我没有重新启动它。

标签: kubernetes kubeadm kube-dns coredns


【解决方案1】:

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

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

如果您要在 Node 上手动修改 /etc/resolv.conf,则每个带有 dnsPolicy: ClusterFirst 的 Pod 都将通过此修改继承 /etc/resolv.conf

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

【讨论】:

  • 谢谢@KFC_的回答,你是对的,节点上的/etc/resolv.conf文件包含search invalid。非常感谢!
  • 我确认在节点本身修复/etc/resolv.conf文件,删除coredns pod,重新部署busybox pod后,/etc/resolv.conf文件有效,kubectl exec -ti busybox -- nslookup kubernetes.default命令有效。再次感谢您!
猜你喜欢
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 2022-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-06
  • 1970-01-01
相关资源
最近更新 更多