本文介绍关于Kubernetes集群域名解析异常的诊断流程、排查思路,以及常见的客户端报错内容。

基本概念

  • 集群内部域名:CoreDNS会将集群中的服务暴露为集群内部域名,默认以.cluster.local结尾,这类域名的解析通过CoreDNS内部缓存完成,不会从上游DNS服务器查询。
  • 集群外部域名:除了集群内部域名以外的域名。外部域名可由CoreDNS配置文件提供解析结果,或从DNSConfig配置文件中指定的上游DNS服务器查询,默认使用阿里云VPC中的私网DNS服务地址(100.100.2.136和100.100.2.138)。您可以修改其为您自建的DNS服务器。
  • 业务Pod:您部署在Kubernetes集群中的容器Pod,不包含Kubernetes自身系统组件的容器。
  • 接入CoreDNS的业务Pod:容器内DNS服务器指向了CoreDNS的业务Pod。
  • 接入NodeLocal DNSCache的业务Pod:集群中安装了NodeLocal DNSCache插件后,通过自动或手动方式注入DNSConfig的业务Pod。这类Pod在解析域名时,会优先访问本地缓存组件。如果访问本地缓存组件不通时,会访问CoreDNS提供的kube-dns服务。

异常诊断流程

故障手册流程.png
  1. 判断当前的异常原因。具体信息,请参见常见客户端报错
    • 如果异常原因是域名不存在,请参见排查思路按解析异常的域名类型
    • 如果异常原因是无法连接至域名服务器,请参见排查思路按解析异常出现频次
  2. 如果以上排查无果,请按以下步骤排查。
  3. 如果以上排查无果,请提交工单排查。

常见客户端报错

客户端 报错日志 可能异常
ping ping: xxx.yyy.zzz: Name or service not known 域名不存在或无法连接域名服务器。如果解析延迟大于5秒,一般是无法连接域名服务器。
curl curl: (6) Could not resolve host: xxx.yyy.zzz
PHP HTTP客户端 php_network_getaddresses: getaddrinfo failed: Name or service not known in xxx.php on line yyy
Golang HTTP客户端 dial tcp: lookup xxx.yyy.zzz on 100.100.2.136:53: no such host 域名不存在。
dig ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: xxxxx
Golang HTTP客户端 dial tcp: lookup xxx.yyy.zzz on 100.100.2.139:53: read udp 192.168.0.100:42922->100.100.2.139:53: i/o timeout 无法连接域名服务器。
dig ;; connection timed out; no servers could be reached

排查思路

排查思路 排查依据 问题及解决方案
按解析异常的域名类型排查 集群内外域名都异常
仅集群外部域名异常 集群外部域名自身异常
仅PrivateZone 、vpc-proxy域名解析异常 PrivateZone域名解析异常
仅Headless类型服务域名异常
按解析异常出现频次排查 完全无法解析
异常仅出现在业务高峰时期
异常出现频次非常高
异常出现频次非常低
异常仅出现在节点扩缩容或CoreDNS缩容时 IPVS缺陷导致解析异常