• 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配置参数,手动配置搜索域。

  • 相关阅读:
    Docker 应用架构
    C 语言获取文件绝对路径
    分布式通信RMI简述
    golang的channel探索
    【UML】UML类图
    联表查询之交叉连接、内、外连接
    在线表格 循环替换 脚本
    狗屁不通文章生成易语言代码
    Linux权限管理— 文件特殊权限SetUID
    力扣--找不同
  • 原文地址:https://blog.csdn.net/weixin_44953658/article/details/126259974