这是一个奇怪的事。
我已经设置了我的 K8s 集群,1 个主节点和 1 个工作节点。它使用 calico 作为 cni,一切看起来都按预期运行(我可以部署 pod、服务等)。我可以通过 IP 访问我的 pod/服务,但我尝试使用它们的 dns 名称来访问它们,即我的服务.默认.svc并且无法访问。因此,我开始深入研究并排除 DNS 解析故障,直到最终得出结论:我的 kube-dns pod 无法访问。
以下是一些信息:
DNS pod 正在运行:
kubectl --kubeconfig mycluster get pods --namespace=kube-system -l k8s-app=kube-dns
NAME READY STATUS RESTARTS AGE
coredns-f9fd979d6-jsqp9 1/1 Running 0 20h
coredns-f9fd979d6-tppbt 1/1 Running 0 20h
DNS 服务正在运行:
kubectl --kubeconfig cluster 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 21h
公开的 DNS 端点:
kubectl --kubeconfig cluster get endpoints kube-dns --namespace=kube-system
NAME ENDPOINTS AGE
kube-dns 10.45.83.1:53,10.45.83.2:53,10.45.83.1:9153 + 3 more... 21h
从 busybox pod,我可以访问其他服务——例如数据库:
/ # ping 10.36.12.13
PING 10.36.12.13 (10.36.12.13): 56 data bytes
64 bytes from 10.36.12.13: seq=0 ttl=63 time=0.213 ms
64 bytes from 10.36.12.13: seq=1 ttl=63 time=0.091 ms
# telnet 10.36.12.13 3306
Connected to 10.36.12.13
/etc/resolv.conf 看起来按预期设置:
cat /etc/resolv.conf
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
但是,如果我尝试进行 DNS 查找,它会因无法访问错误而挂起:
nslookup backend.default.svc.cluster.local
;; connection timed out; no servers could be reached
如果我尝试对 coreDNS pod 进行 telnet 或 ping 操作,则会失败:
telnet 10.45.83.1 53
^C
ping 10.45.83.1
PING 10.45.83.1 (10.45.83.1): 56 data bytes
^C
--- 10.45.83.1 ping statistics ---
2 packets transmitted, 0 packets received, 100% packet loss
两个 DNS pod 上的日志看起来都很好:
kubectl --kubeconfig cluster logs --namespace=kube-system -l k8s-app=kube-dns
.:53
[INFO] plugin/reload: Running configuration MD5 = db32ca3650231d74073ff4cf814959a7
CoreDNS-1.7.0
linux/amd64, go1.14.4, f59c03d
[INFO] Reloading
[INFO] plugin/health: Going into lameduck mode for 5s
[INFO] plugin/reload: Running configuration MD5 = 3d3f6363f05ccd60e0f885f0eca6c5ff
[INFO] Reloading complete
.:53
[INFO] plugin/reload: Running configuration MD5 = db32ca3650231d74073ff4cf814959a7
CoreDNS-1.7.0
linux/amd64, go1.14.4, f59c03d
[INFO] Reloading
[INFO] plugin/health: Going into lameduck mode for 5s
[INFO] plugin/reload: Running configuration MD5 = 3d3f6363f05ccd60e0f885f0eca6c5ff
[INFO] Reloading complete
[INFO] 127.0.0.1:40656 - 48819 "HINFO IN 1796540929503221175.488499616278261636. udp 56 false 512" NXDOMAIN qr,rd,ra 131 0.015421704s
如果您有任何关于检查内容的想法,我将不胜感激。我很乐意添加任何进一步的信息。
答案1
因此,根本原因是我的 pod 无法与另一台主机上的其他 pod 建立联系。两个 DSN pod 最终都在 host1 上创建,并且 host1 上一切正常,但在 host2 上(因为它无法看到 host1 上的任何东西),一切都变得一团糟,因为它无法解析任何 dns 查询。
通过将 CNI 更改为 Weave 而不是 Calico,这个问题得到了解决。我花了一个多星期的时间对 calico 进行故障排除,然后我放弃了;似乎 pod 无法从一个节点到达另一个节点。检查了 BGP 内容、网络端口是否打开并正常工作等,并calicoctl node status
一直提示对等连接未建立。此时,我不知道是什么原因造成的,我注意到的一件事是,每次安装 calico 时都会创建一个带有非常奇怪 CIDR 的奇怪虚拟接口,并且该 cidr 不符合我的任何网络需求。我认为这不值得付出努力,因为 calico 没有硬性要求。
感谢所有检查的人!