coredns解析内网域名失败问题记录

问题现象:

公司内网域名解析失败: ping: rdfa-auth.uat.ennew.com: Name or service not known
image.png

处理办法:删除重建 coredns pod
kubectl delte po coredns-6f85d5fb88-2cgbv  coredns-6f85d5fb88-hnwt7  .... -nkube-system

处理过程:

  1. 复现pod 访问域名错误:
    image.png
  2. 测试主机是否能访问通域名
    image.png

    主机访问正常 证明问题无法解析域名的问题出在pod上

  3. 查看k8s集群网络组件和dns容器是否正常
    image.png

    网络和DNS一切正常

  4. 查看pod内dns地址
    image.png

    只有kube-dns 地址 且endpoint 的三个pod都是正常状态


    image.png

    kube-dns 的后端pod 状态也正常 如前图
    image.png
  5. 查看dns日志: kubectl logs coredns-6f85d5fb88-bn4p6 -nkube-system
[ERROR] plugin/errors: 2 apm-server-rest.uat.ennewi.cn. A: read udp 10.202.2.2:54366->100.125.129.250:53: i/o timeout
[ERROR] plugin/errors: 2 apm-server-rest.uat.ennewi.cn. A: read udp 10.202.2.2:44915->100.125.129.250:53: i/o timeout
[ERROR] plugin/errors: 2 apm-server-rest.uat.ennewi.cn. A: read udp 10.202.2.2:52744->100.125.129.250:53: i/o timeout
[ERROR] plugin/errors: 2 apm-server-rest.dev.ennewi.cn. A: read udp 10.202.2.2:50696->100.125.1.250:53: i/o timeout
[ERROR] plugin/errors: 2 nacos.uat.ennewi.cn. A: read udp 10.202.2.2:38828->100.125.1.250:53: i/o timeout
  1. 经查看得知
    10.202.2.2 为coredns地址
    100.125.1.250:53 地址不属于集群内 但是可以ping通,且53端口可以访问


    image.png

    100.125.1.250 也不是默认的内网dns地址


    image.png
  2. 百度得知 100.125.1.250:53 为华为内网dns地址 正好我们使用的也是华为云的主机


    image.png
  3. 问题来了 : 为什么pod使用的是华为云的内网dns地址 而不是主机resolv.conf定义dns地址的呢
    参考kubernetes关于coredns的文档可以知道, 不在 Kubernetes 集群域内的任何查询都将转发到 预定义的解析器 (/etc/resolv.conf).

    image.png

  4. 由上可知,k8s集群里肯定不会有公司内网的dns解析,那走的就会是主机的/etc/resolv.conf里指定的dns,但是主机使用这个里定义的dns是可以解析的


    image.png
  5. 难道问题出在/etc/resolv.conf 文件上? 开始验证
    /etc/resolv.conf 是4.8号修改的


    image.png

    查看pod 启动时间是43天前(今天是5月6号)

[root@pt-k8s-uat-master-0001 ~]# kubectl get po -nkube-system -owide|grep dns
coredns-6f85d5fb88-7c24l                   1/1     Running     0          43d   10.202.7.2     10.228.8.238              
coredns-6f85d5fb88-bn4p6                   1/1     Running     0          43d   10.202.2.2     10.228.8.136              
coredns-6f85d5fb88-sztbx                   1/1     Running     0          43d   10.202.4.2     10.228.8.175              
coredns-autoscaler-79599b9dc6-jnbb8        1/1     Running     0          43d   10.202.3.2     10.228.8.178              

推断: coredns 加载/etc/resolv.conf的是4月8号修改前的配置 也就是coredns 日志报错的100.125.1.250 地址

  1. 开始验证上面推断
    1. 尝试登录coredns 进行文件查看,结果无法登录
[root@pt-k8s-uat-master-0001 ~]# kubectl exec -it coredns-6f85d5fb88-7c24l  -nkube-system sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
OCI runtime exec failed: exec failed: container_linux.go:348: starting container process caused "exec: \"sh\": executable file not found in $PATH": unknown
command terminated with exit code 126
  1. 删掉coredns pod 让其重新加载配置文件,以便读到正确的/etc/resolv.conf文件
# 看pod时间 已重启47m
[root@pt-k8s-uat-master-0001 ~]# kubectl get po -A|grep dns
kube-system           coredns-6f85d5fb88-2cgbv                   1/1     Running            0          47m
kube-system           coredns-6f85d5fb88-hnwt7                   1/1     Running            0          55m
kube-system           coredns-6f85d5fb88-lxqcn                   1/1     Running            0          47m
  1. 去pod里测试域名解析
[root@tenant-identify-api-769f9cd7f9-lwd6p ~]# ping rdfa-auth.uat.ennew.com 
PING rdfa-auth.uat.ennew.com (10.39.201.234) 56(84) bytes of data.
64 bytes from 10.39.201.234 (10.39.201.234): icmp_seq=1 ttl=57 time=1.85 ms
64 bytes from 10.39.201.234 (10.39.201.234): icmp_seq=2 ttl=57 time=1.82 ms
64 bytes from 10.39.201.234 (10.39.201.234): icmp_seq=3 ttl=57 time=1.81 ms
64 bytes from 10.39.201.234 (10.39.201.234): icmp_seq=4 ttl=57 time=1.76 ms
  1. 问题已解决

你可能感兴趣的:(coredns解析内网域名失败问题记录)