繁体   English   中英

无法从 k8s pod 内部解析 dns

[英]Can't resolve dns from inside k8s pod

在 dnsutils pod exec ping stackoverflow.com

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

/etc/resolve.conf文件从 pod 内部看起来不错

/ # cat /etc/resolv.conf 
nameserver 10.96.0.10
search weika.svc.cluster.local svc.cluster.local cluster.local
options ndots:5

10.96.0.10是 kube-dns 服务 ip:

[root@test3 k8s]# kubectl -n kube-system get service
NAME                        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                     AGE
kube-dns                    ClusterIP   10.96.0.10      <none>        53/UDP,53/TCP,9153/TCP      75d

core dns

[root@test3 k8s]# kubectl -n kube-system get  pod -o wide | grep core
coredns-6557d7f7d6-5nkv7                             1/1     Running   0          10d   10.244.0.14    test3.weikayuninternal.com   <none>           <none>
coredns-6557d7f7d6-gtrgc                             1/1     Running   0          10d   10.244.0.13    test3.weikayuninternal.com   <none>           <none>

当我将名称服务器 ip 更改为 coredns ip 时。解析 dns 就可以了。

/ # cat /etc/resolv.conf 
nameserver 10.244.0.14
#nameserver 10.96.0.10
search weika.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
/ # ping stackoverflow.com
PING stackoverflow.com (151.101.65.69): 56 data bytes
64 bytes from 151.101.65.69: seq=0 ttl=49 time=100.497 ms
64 bytes from 151.101.65.69: seq=1 ttl=49 time=101.014 ms
64 bytes from 151.101.65.69: seq=2 ttl=49 time=100.462 ms
64 bytes from 151.101.65.69: seq=3 ttl=49 time=101.465 ms
64 bytes from 151.101.65.69: seq=4 ttl=49 time=100.318 ms
^C
--- stackoverflow.com ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 100.318/100.751/101.465 ms
/ # 

为什么会这样?

您还没有提到 kubernetes 是如何安装的。 您应该使用以下命令重新启动 coredns pod。

kubectl -n kube-system rollout restart deployment coredns

这可能仅适用于您在初始安装microk8s或启用dns插件期间出现问题的情况,但它可能仍然值得一试。 我在这方面投入了太多的时间,如果我不至少分享帮助那个人的话,我就无法忍受自己。

在我的例子中,我配置的用于设置单节点集群的服务器太小——只有 1GB 的 memory。当我第一次设置 microk8s 并启用我想要的所有插件时(dns、ingress、hostpath-storage ), 我开始遇到问题,只需给服务器更多 memory 就可以解决这些问题。不幸的是,最初搞砸了似乎让插件处于某种未定义、部分初始化/配置的状态 state,这样一切似乎都在运行通常我能说的最好(即 CoreDNS 已部署并准备就绪,并且kube-dns服务显示 CoreDNS 的 ClusterIP 作为它的后端端点)但是我的 pod 都无法解析集群内部或外部的任何 DNS 名称,我会得到当我运行kubectl describe <pod>时, 这些烦人的事件日志表明存在某种 DNS 问题。

最终修复它的是重置集群 ( microk8s reset --destroy-storage ),然后重新启用我的所有插件 ( microk8s enable dns ingress hostpath-storage ),现在我有足够的 memory 可以干净利落地这样做。 在那之后,CoreDNS 和kube-dns服务看起来像以前一样准备就绪,但 DNS 查询实际上在集群中运行的 pod 中正常工作。

TL;博士; - 您的dns插件可能在集群安装过程中已损坏。 尝试重置您的集群,重新启用插件,并重新部署您的资源。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM