CCE集群内域名解析失败,如何定位处理?
排查项一:检查是否已安装CoreDNS插件
- 登录CCE控制台,进入集群。
- 在左侧导航栏中选择“插件中心”,确认异常的集群是否已安装CoreDNS插件。
- 如果未安装,请安装。详情请参见为什么CCE集群的容器无法通过DNS解析?
排查项二:检查CoreDNS实例是否已到达性能瓶颈
CoreDNS所能提供的域名解析QPS与CPU消耗成正相关,如遇QPS较高的场景,需要根据QPS的量级调整CoreDNS实例规格。集群超过100节点时,推荐使用NodeLocal DNSCache提升DNS性能,详情请参见使用NodeLocal DNSCache提升DNS性能。
- 登录CCE控制台,进入集群。
- 在左侧导航栏中选择“插件中心”,确认CoreDNS插件状态为“运行中”。
- 单击CoreDNS插件名称,查看插件实例列表。
- 单击CoreDNS实例的“监控”按钮,查看实例CPU、内存使用率。
排查项三:解析外部域名很慢或超时
如果域名解析失败率低于1/10000,请参考解析外部域名很慢或超时,如何优化配置?进行参数优化,或在业务中增加重试。
排查项四:概率性出现UnknownHostException
集群中的业务请求到外部域名服务器时发生域名解析错误,概率性出现UnknownHostException。UnknownHostException是一个常见的异常,发生该异常时优先检查域名是否存在问题或键入错误。
您可根据以下步骤进行排查:
- 仔细检查主机名是否正确,检查域名的拼写并删除多余的空格。
- 检查DNS设置。在运行应用程序之前,通过ping hostname命令确保DNS服务器已启动并正在运行。如果主机名是新的,则需要等待一段时间才能访问DNS服务器。
- 检查CoreDNS实例的CPU、内存使用率监控,确认是否已到达性能瓶颈,具体操作步骤请参见排查项二:检查CoreDNS实例是否已到达性能瓶颈。
- 检查CoreDNS是否有发生限流,如果触发限流可能出现部分请求处理时间延长,需要调整CoreDNS插件规格。
登录CoreDNS Pod所在节点,查看以下文件内容:
cat /sys/fs/cgroup/cpu/kubepods/pod<pod_uid>/<coredns容器id>/cpu.stat
- <pod uid>为CoreDNS的Pod UID,可通过以下命令获取:
kubectl get po <pod name> -nkube-system -ojsonpath='{.metadata.uid}{"\n"}'
以上命令中的<pod name>需要是在当前节点上运行的CoreDNS Pod名称。
- <coredns容器id>需要是完整的容器ID,可通过以下命令获取:
docker节点:
docker ps --no-trunc | grep k8s_coredns | awk '{print $1}'
containerd节点:
crictl ps --no-trunc | grep k8s_coredns | awk '{print $1}'
完整的命令示例如下:
cat /sys/fs/cgroup/cpu/kubepods/pod27f58662-3979-448e-8f57-09b62bd24ea6/6aa98c323f43d689ac47190bc84cf4fadd23bd8dd25307f773df25003ef0eef0/cpu.stat
请关注以下指标:
- nr_throttled:被限流次数。
- throttled_time:被限流的总时间长度(纳秒)。
- <pod uid>为CoreDNS的Pod UID,可通过以下命令获取:
如果检查后无上述问题,可采用下方优化策略。
优化策略:
- 修改CoreDNS的缓存时间
- 配置存根域
- 修改ndots
- 增加coredns的缓存时间:有利于同一个域名的第N次解析,减少级联DNS的请求数量。
- 配置存根域:有利于减少DNS请求链路。
修改方式:
- 修改CoreDNS缓存时间及配置存根域
修改方法请参见为CoreDNS配置存根域。
修改完成后重启CoreDNS。
- 修改ndots
修改方法请参见解析外部域名很慢或超时,如何优化配置?。
示例:
dnsConfig: options: - name: timeout value: '2' - name: ndots value: '5' - name: single-request-reopen
建议值修改成:2