K8S集群中Coredns域名解析故障排查思路

K8S集群中Coredns域名解析故障排查思路

1.K8S域名解析故障

在使用K8S的过程中,可能会遇到域名解析失败的现象,主要有以下几种问题:

  • 在Pod中无法解析集群外部的域名,例如baidu.com,但是可以上网。
  • Pod与Pod之间服务调用,可以ping通Service资源的地址,但是无法使用服务发现地址进行通信。

在实际生产环境中,程序依赖的Tomcat、Nginx都是以Pod的形式部署的,Nginx需要对Tomcat进行反向代理,若Pod无法解析域名或者是无法使用服务发现的地址通信,那么Nginx只能通过Service资源的IP进行通信,IP可能会发生变化,但是域名是肯定不会变化的。

服务发现地址是K8S内部针对每个Service资源设定的域名地址,程序之间的调用都是采用的服务发现地址,当遇到域名无法解析的时候,就会影响应用程序之间的调用。

2.无法解析集群外部的域名排查思路

问题一:无法解析集群外部的域名。

当遇到Pod无法解析集群外部其他服务的域名时,大致的排查思路如下:

1)首先排查Coredns组件是否正常运行,查看Coredns的运行日志,可以从日志中读取关键信息。

2)Coredns是以Pod的形式部署在K8S集群的,会挂载调度到的Node节点上/etc/resolv.conf这个文件,可以去排查一下这个文件中配置的DNS地址,可以将地址换成114.114.114.114,到这一步问题可能会解决。

3)如果还是无法解析域名,那么就将Coredns组件删除重建。

3.无法解析集群内部服务发现地址排查思路

问题二:无法解析集群内部服务发现地址。

集群内部服务发现地址也叫做集群内部域名,服务发现地址就是一串域名地址,服务发现的地址命名格式:Service名称+NameServer名称+svc.cluster.local

例如:knowsystem-svc.prod-knowsystem:80,完整的域名地址为:knowsystem-svc.prod-knowsystem.svc.cluster.local

Pod与Pod之间就可以通过服务发现地址进行通信,服务发现地址会被Coredns解析到Pod资源所关联Service资源上,如下图所示。
在这里插入图片描述

当Coredns无法解析集群内部的服务发现地址时,可能就会应用Pod与Pod之间的调用。

当出现内部服务发现地址无法解析时,基本上都会报如下的错误,大致的意思就是Coredns解析超时。

io.netty.resolver.dns.DnsNameRes olverTimeoutException: [/10.96.0.10:53] query timed out after 1000 milliseconds (no stack trace available)

排查思路:

1)出现域名无法解析的情况,大多数情况下都是Pod内部的resolv.conf文件配置的有问题,可以先进入容器查看resolv.conf文件配置的DNS地址。

[root@knowsystem-v1-96d57f6c-zbmgj /]# cat /etc/resolv.conf 
nameserver 10.96.0.10			#Coredns的Service地址
search prod-knowsystem.svc.cluster.local svc.cluster.local cluster.local			#搜索域,自动配置

2)尝试ping搜索域中的域名,如果ping不通,可能就是搜索域指定的太多引起了DNS超时。

3)可以在资源编排文件中手动配置搜索域的地址,覆盖默认的搜索域。

    spec:
      containers:
      - image: jiangxlrepo/know-system:v1
        name: knowsystem-v1
      dnsPolicy: "None"
      dnsConfig:
        nameservers:
        - 10.96.0.10
        searches:
        - knowsystem-svc.prod-knowsystem.svc.cluster.local
        options:
        - name: test

4)更新资源编排文件,再次进入到Pod中,查看搜索域的配置信息。

5)会发现搜索域已经是我们手动配置的搜索域地址了,并且也可以正常解析和ping通服务发现的域名地址。

在这里插入图片描述

4.K8S集群中域名无法解析排查思路总结

无论是什么原因,只要是无法解析域名,就按照下面几步进行排查:

1)排查Coredns组件的运行状态是否出现异常,查看运行日志获取关键信息。

2)查看Node节点的/etc/resolv.conf文件中DNS地址是否配置正确,再进入到Pod中查看/etc/resolv.conf文件中DNS地址是否配置正确。

3)通过K8S资源编排文件中的dnsConfig配置参数,手动配置搜索域。

猜你喜欢

转载自blog.csdn.net/weixin_44953658/article/details/126259974