更新时间:2023-07-06 GMT+08:00

域名解析失败,如何定位处理?

排查项一:检查是否已安装CoreDNS插件

  1. 登录CCE控制台,进入集群。
  2. 在左侧导航栏中选择“插件管理”,在“已安装插件”中确认异常的集群是否已安装CoreDNS插件。
  3. 如果未安装,请安装。详情请参见为什么CCE集群的容器无法通过DNS解析?

排查项二:检查CoreDNS实例是否已到达性能瓶颈

CoreDNS所能提供的域名解析QPS与CPU消耗成正相关,如遇QPS较高的场景,需要根据QPS的量级调整CoreDNS实例规格。

  1. 登录CCE控制台,进入集群。
  2. 在左侧导航栏中选择“插件管理”,在“已安装插件”中找到集群对应的CoreDNS插件,确认插件状态为“运行中”
  3. 单击CoreDNS插件名称,查看插件实例列表。
  4. 单击CoreDNS实例的“监控”按钮,查看实例CPU、内存使用率。

    如实例已达性能瓶颈,则需调整CoreDNS插件规格。

排查项三:解析外部域名很慢或超时

如果域名解析失败率低于1/10000,请参考解析外部域名很慢或超时,如何优化配置?进行参数优化,或在业务中增加重试。

排查项四:概率性出现UnknownHostException

集群中的业务请求到外部域名服务器时发生域名解析错误,概率性出现UnknownHostException。UnknownHostException是一个常见的异常,发生该异常时优先检查域名是否存在问题或键入错误。

您可根据以下步骤进行排查:

  1. 仔细检查主机名是否正确,检查域名的拼写并删除多余的空格。
  2. 检查DNS设置。在运行应用程序之前,通过ping hostname命令确保DNS服务器已启动并正在运行。如果主机名是新的,则需要等待一段时间才能访问DNS服务器。
  3. 检查CoreDNS实例的CPU、内存使用率监控,确认是否已到达性能瓶颈,具体操作步骤请参见排查项二:检查CoreDNS实例是否已到达性能瓶颈
  4. 检查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 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:被限流的总时间长度(纳秒)。

如果检查后无上述问题,可采用下方优化策略。

优化策略:

  1. 修改CoreDNS的缓存时间
  2. 配置存根域
  3. 修改ndots
  • 增加coredns的缓存时间:有利于同一个域名的第N次解析,较少级联DNS的请求数量。
  • 配置存根域:有利于减少DNS请求链路。

修改方式

  1. 修改CoreDNS缓存时间及配置存根域

    修改完成后重启CoreDNS。

  2. 修改ndots

    修改方法请参见解析外部域名很慢或超时,如何优化配置?

    示例:

          dnsConfig:
            options:
              - name: timeout
                value: '2'
              - name: ndots
                value: '5'
              - name: single-request-reopen

    建议值修改成:2