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
排查思路:
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 #搜索域,自动配置
- 1
- 2
- 3
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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
4)更新资源编排文件,再次进入到Pod中,查看搜索域的配置信息。
5)会发现搜索域已经是我们手动配置的搜索域地址了,并且也可以正常解析和ping通服务发现的域名地址。
4.K8S集群中域名无法解析排查思路总结
无论是什么原因,只要是无法解析域名,就按照下面几步进行排查:
1)排查Coredns组件的运行状态是否出现异常,查看运行日志获取关键信息。
2)查看Node节点的/etc/resolv.conf文件中DNS地址是否配置正确,再进入到Pod中查看/etc/resolv.conf文件中DNS地址是否配置正确。
3)通过K8S资源编排文件中的dnsConfig配置参数,手动配置搜索域。
文章来源: jiangxl.blog.csdn.net,作者:Jiangxl~,版权归原作者所有,如需转载,请联系作者。
原文链接:jiangxl.blog.csdn.net/article/details/126259974
- 点赞
- 收藏
- 关注作者
评论(0)