排查 AKS 中的 DNS 解析问题

本文讨论如何创建用于修复 Microsoft Azure Kubernetes 服务(AKS)中域名系统(DNS)解析问题的故障排除工作流。

先决条件

故障排除清单

排查 AKS 中的 DNS 问题通常是一个复杂的过程。 你可以轻松地在许多不同的步骤中迷失,而无需看到明确的前进道路。 为了帮助使过程更加简单有效,请使用“科学”方法组织工作:

  • 步骤 1. 收集事实。

  • 步骤 2. 制定假设。

  • 步骤 3. 创建和实施行动计划。

  • 步骤 4. 观察结果并得出结论。

  • 步骤 5. 根据需要重复。

故障排除步骤 1:收集事实

若要更好地了解问题的上下文,请收集有关特定 DNS 问题的事实。 通过使用以下基线问题作为起点,可以描述问题的性质、识别症状和确定问题的范围。

问题 可能的答案
DNS 解析在何处失败?
  • 节点
  • Pod 和节点
你遇到哪种 DNS 错误?
  • 超时
  • 没有此类主机
  • 其他 DNS 错误
DNS 错误的频率如何?
  • 始终
  • 间歇性
  • 在特定模式中
哪些记录受到影响?
  • 特定域
  • 任何域
是否存在任何自定义 DNS 配置?
  • 在虚拟网络上配置的自定义 DNS 服务器
  • CoreDNS 上的自定义 DNS 配置
哪种性能问题会影响节点?
  • 中央处理器
  • 内存
  • I/O 限制
哪种性能问题会影响 CoreDNS Pod?
  • 中央处理器
  • 内存
  • I/O 节流
导致 DNS 延迟的原因是什么? 接收响应花费太多时间的 DNS 查询(超过 5 秒)

若要获得这些问题的更好答案,请遵循这三部分过程。

第 1 部分:生成在不同层级重现问题的测试

AKS 上 Pod 的 DNS 解析过程包括许多层。 检查这些层以隔离问题。 以下层是典型的:

  • CoreDNS Pod
  • CoreDNS 服务
  • 节点
  • 虚拟网络 DNS

若要启动该过程,请针对每个层从测试 Pod 运行测试。

在 CoreDNS Pod 级别测试 DNS 解析
  1. 通过运行以下命令部署测试 Pod 以运行 DNS 测试查询:

    cat <<EOF | kubectl apply --filename -
    apiVersion: v1
    kind: Pod
    metadata:
      name: aks-test
    spec:
      containers:
      - name: aks-test
        image: debian:stable
        command: ["/bin/sh"]
        args: ["-c", "apt-get update && apt-get install -y dnsutils && while true; do sleep 1000; done"]
    EOF
    
  2. 通过运行以下 kubectl get 命令检索 CoreDNS Pod 的 IP 地址:

    kubectl get pod --namespace kube-system --selector k8s-app=kube-dns --output wide
    
  3. 运行以下命令,使用 kubectl exec -it aks-test -- bash 命令连接到测试 Pod,并针对每个 CoreDNS Pod IP 地址测试 DNS 解析:

    # Placeholder values
    FQDN="<fully-qualified-___domain-name>"  # For example, "db.contoso.com"
    DNS_SERVER="<coredns-pod-ip-address>"
    
    # Test loop
    for i in $(seq 1 1 10)
    do
        echo "host= $(dig +short ${FQDN} @${DNS_SERVER})"
        sleep 1
    done
    

有关从 Pod 层面排查 DNS 解析问题的详细信息,请参阅 从 Pod 内部排查 DNS 解析失败

在 CoreDNS 服务级别测试 DNS 解析
  1. 运行以下命令 kubectl get 检索 CoreDNS 服务 IP 地址:

    kubectl get service kube-dns --namespace kube-system
    
  2. 在测试 Pod 上,针对 CoreDNS 服务 IP 地址运行以下命令:

    # Placeholder values
    FQDN="<fully-qualified-___domain-name>"  # For example, "db.contoso.com"
    DNS_SERVER="<kubedns-service-ip-address>"
    
    # Test loop
    for i in $(seq 1 1 10)
    do
        echo "host= $(dig +short ${FQDN} @${DNS_SERVER})"
        sleep 1
    done
    
在节点级别测试 DNS 解析
  1. 连接到节点。

  2. grep运行以下命令,检索配置的上游 DNS 服务器的列表:

    grep ^nameserver /etc/resolv.conf
    
  3. 针对节点中配置的每个 DNS 运行以下文本命令:

    # Placeholder values
    FQDN="<fully-qualified-___domain-name>"  # For example, "db.contoso.com"
    DNS_SERVER="<dns-server-in-node-configuration>"
    
    # Test loop
    for i in $(seq 1 1 10)
    do
        echo "host= $(dig +short ${FQDN} @${DNS_SERVER})"
        sleep 1
    done
    
在虚拟网络 DNS 级别测试 DNS 解析

检查虚拟网络的 DNS 服务器配置,并确定服务器是否可以解析相关的记录。

第 2 部分:查看 CoreDNS Pod 和节点的运行状况和性能

查看 CoreDNS Pod 的运行状况和性能

可以使用 kubectl 命令来检查 CoreDNS Pod 的运行状况和性能。 为此,请执行以下步骤:

  1. 验证 CoreDNS Pod 是否正在运行:

    kubectl get pods -l k8s-app=kube-dns -n kube-system
    
  2. 检查 CoreDNS Pod 是否被过度使用:

    kubectl top pods -n kube-system -l k8s-app=kube-dns
    
    NAME                      CPU(cores)   MEMORY(bytes)
    coredns-dc97c5f55-424f7   3m           23Mi
    coredns-dc97c5f55-wbh4q   3m           25Mi
    
  3. 获取托管 CoreDNS Pod 的节点:

    kubectl get pods -n kube-system -l k8s-app=kube-dns -o jsonpath='{.items[*].spec.nodeName}'
    
  4. 验证节点是否未过度使用:

    kubectl top nodes
    
  5. 验证 CoreDNS Pod 的日志:

    kubectl logs -l k8s-app=kube-dns -n kube-system
    

注释

若要获取更多调试信息,请启用 CoreDNS 中的详细日志。 为此,请参阅 AKS 中的 CoreDNS 自定义疑难解答

查看节点的运行状况和性能

你可能会首先注意到 DNS 解析的性能问题,这些问题表现为间歇性错误,例如超时。 此问题的主要原因包括托管 CoreDNS Pod 或客户端 Pod 的节点内的资源耗尽和 I/O 限制。

若要检查资源耗尽或 I/O 限制是否发生,请运行以下 kubectl 描述 命令以及 grep 节点上的命令。 通过这一系列命令,可以查看请求计数,并将其与每个资源的限制进行比较。 如果资源的上限百分比超过100%,该资源就会出现过度分配。

kubectl describe node | grep -A5 '^Name:\|^Allocated resources:' | grep -v '.kubernetes.io\|^Roles:\|Labels:'

以下代码片段显示了此命令的示例输出:

Name:               aks-nodepool1-17046773-vmss00000m
--
Allocated resources:
  (Total limits might be more than 100 percent.)
  Resource           Requests           Limits
  --------           --------           ------
  cpu                250m (13 percent)  40m (2 percent)
  memory             420Mi (9 percent)  1762Mi (41 percent)
--
Name:               aks-nodepool1-17046773-vmss00000n
--
Allocated resources:
  (Total limits might be more than 100 percent.)
  Resource           Requests            Limits
  --------           --------            ------
  cpu                612m (32 percent)   8532m (449 percent)
  memory             804Mi (18 percent)  6044Mi (140 percent)
--
Name:               aks-nodepool1-17046773-vmss00000o
--
Allocated resources:
  (Total limits might be more than 100 percent.)
  Resource           Requests           Limits
  --------           --------           ------
  cpu                250m (13 percent)  40m (2 percent)
  memory             420Mi (9 percent)  1762Mi (41 percent)
--
Name:               aks-ubuntu-16984727-vmss000008
--
Allocated resources:
  (Total limits might be more than 100 percent.)
  Resource           Requests            Limits
  --------           --------            ------
  cpu                250m (13 percent)   40m (2 percent)
  memory             420Mi (19 percent)  1762Mi (82 percent)

若要更好地了解 Pod 和节点级别的资源使用情况,还可以在 Azure 中使用容器见解和其他云原生工具。 有关详细信息,请参阅 使用 Azure 服务和云本机工具监视 Kubernetes 群集

第 3 部分:分析 DNS 流量并查看 DNS 解析性能

分析 DNS 流量有助于了解 AKS 群集如何处理 DNS 查询。 理想情况下,您应该在测试 Pod 上重现问题,同时捕获该测试 Pod 和每个 CoreDNS Pod 的流量。

可通过两种主要方法来分析 DNS 流量:

  • 使用实时 DNS 分析工具(如 Inspektor 小工具)实时分析 DNS 流量。
  • 使用流量捕获工具(如 Retina CaptureDumpy)收集 DNS 流量,并使用网络数据包分析器工具(如 Wireshark)对其进行分析。

这两种方法旨在使用 DNS 响应代码、响应时间和其他指标了解 DNS 响应的运行状况和性能。 选择最符合需求的解决方案。

实时 DNS 流量分析

可以使用 Inspektor 小工具 实时分析 DNS 流量。 若要将 Inspektor 小工具安装到群集,请参阅 如何在 AKS 群集中安装 Inspektor 小工具

若要跨所有命名空间跟踪 DNS 流量,请使用以下命令:

# Get the version of Gadget
GADGET_VERSION=$(kubectl gadget version | grep Server | awk '{print $3}')
# Run the trace_dns gadget
kubectl gadget run trace_dns:$GADGET_VERSION --all-namespaces --fields "src,dst,name,qr,qtype,id,rcode,latency_ns"

其中 --fields 要显示的字段的逗号分隔列表。 以下列表描述了命令中使用的字段:

  • src:包含 Kubernetes 信息的请求源(<kind>/<namespace>/<name>:<port>)。
  • dst:包含 Kubernetes 信息的请求目标(<kind>/<namespace>/<name>:<port>)。
  • name:DNS 请求的名称。
  • qr:查询/响应标志。
  • qtype:DNS 请求的类型。
  • id:DNS 请求的 ID,用于匹配请求和响应。
  • rcode:DNS 请求的响应代码。
  • latency_ns:DNS 请求的延迟。

命令输出如下所示:

SRC                                  DST                                  NAME                        QR QTYPE          ID             RCODE           LATENCY_NS
p/default/aks-test:33141             p/kube-system/coredns-57d886c994-r2… db.contoso.com.             Q  A              c215                                  0ns
p/kube-system/coredns-57d886c994-r2… 168.63.129.16:53                     db.contoso.com.             Q  A              323c                                  0ns
168.63.129.16:53                     p/kube-system/coredns-57d886c994-r2… db.contoso.com.             R  A              323c           NameErr…           13.64ms
p/kube-system/coredns-57d886c994-r2… p/default/aks-test:33141             db.contoso.com.             R  A              c215           NameErr…               0ns
p/default/aks-test:56921             p/kube-system/coredns-57d886c994-r2… db.contoso.com.             Q  A              6574                                  0ns
p/kube-system/coredns-57d886c994-r2… p/default/aks-test:56921             db.contoso.com.             R  A              6574           NameErr…               0ns

可以使用该 ID 字段来标识查询是否具有响应。 该 RCODE 字段显示 DNS 请求的响应代码。 该 LATENCY_NS 字段显示 DNS 请求的延迟(以纳秒为单位)。 这些字段可帮助你了解 DNS 响应的运行状况和性能。 有关实时 DNS 分析的详细信息,请参阅 实时排查 AKS 群集中的 DNS 故障

捕获 DNS 流量

本部分演示如何使用 Dumpy 从每个 CoreDNS Pod 和客户端 DNS Pod 收集 DNS 流量捕获(在本例中为 aks-test Pod)。

若要从测试客户端 Pod 收集捕获,请运行以下命令:

kubectl dumpy capture pod aks-test -f "-i any port 53" --name dns-cap1-aks-test

若要收集 CoreDNS Pod 的数据,请运行以下 Dumpy 命令:

kubectl dumpy capture deploy coredns \
    -n kube-system \
    -f "-i any port 53" \
    --name dns-cap1-coredns

理想情况下,您应在问题重现时进行数据捕获。 这一要求意味着,不同的捕获过程可能会运行不同的时长,这具体取决于您能够复现问题的频率。 为了收集数据包,请运行以下命令:

mkdir dns-captures
kubectl dumpy export dns-cap1-aks-test ./dns-captures
kubectl dumpy export dns-cap1-coredns ./dns-captures -n kube-system

若要删除 Dumpy 的 Pod,请运行以下 Dumpy 命令:

kubectl dumpy delete dns-cap1-coredns -n kube-system
kubectl dumpy delete dns-cap1-aks-test

若要合并所有 CoreDNS Pod 捕获,请使用 mergecap 命令行工具合并捕获文件。 该工具 mergecap 包含在 Wireshark 网络数据包分析器工具中。 运行以下 mergecap 命令:

mergecap -w coredns-cap1.pcap dns-cap1-coredns-<coredns-pod-name-1>.pcap dns-cap1-coredns-<coredns-pod-name-2>.pcap [...]
单个 CoreDNS Pod 的 DNS 数据包分析

生成和合并流量捕获文件后,可以在 Wireshark 中对捕获文件执行 DNS 数据包分析。 按照以下步骤查看单个 CoreDNS Pod 流量的数据包分析:

  1. 选择 “开始”,输入 Wireshark,然后在搜索结果中选择 Wireshark

  2. Wireshark 窗口中,选择 “文件” 菜单,然后选择“ 打开”。

  3. 导航到包含捕获文件的文件夹,选择 dns-cap1-db-check-db-check-pod-name.pcap<>(单个 CoreDNS Pod 的客户端捕获文件),然后选择“打开”按钮。

  4. 选择“ 统计信息 ”菜单,然后选择 DNS“Wireshark - DNS”对话框随即显示并显示对 DNS 流量的分析。 下表显示了对话框的内容。

    主题/项目 计数 平均值 Min Val Max Val 速率(ms) 百分比 突发速率 快速启动
    ▾ 数据包总数 1066 0.0017 100% 0.1200 0.000
     ▾ rcode 1066 0.0017 100.00% 0.1200 0.000
        服务器故障 17 0.0000 1.59% 0.0100 99.332
       无此类名称 353 0.0006 33.11% 0.0400 0.000
       无错误 696 0.0011 65.29% 0.0800 0.000
     ▾操作码 1066 0.0017 100.00% 0.1200 0.000
       标准查询 1066 0.0017 100.00% 0.1200 0.000
     ▾ 查询/响应 1066 0.0017 100.00% 0.1200 0.000
        响应 531 0.0009 49.81% 0.0600 0.000
        查询 535 0.0009 50.19% 0.0600 0.000
     ▾ 查询类型 1066 0.0017 100.00% 0.1200 0.000
       AAAA 167 0.0003 15.67% 0.0200 0.000
       一个 899 0.0015 84.33% 0.1000 0.000
     ▾ 类 1066 0.0017 100.00% 0.1200 0.000
       在 1066 0.0017 100.00% 0.1200 0.000
    ▾ 服务统计信息 0 0.0000 100% - -
       request-response time (msec) 531 184.42 0.067000 6308.503906 0.0009 0.0600 0.000
      不。 未经请求的回复 0 0.0000 - -
      不。 重传 0 0.0000 - -
    ▾ 响应统计信息 0 0.0000 100% - -
      不。 一些问题 1062 1.00 1 1 0.0017 0.1200 0.000
      不。 当局 1062 0.82 0 1 0.0017 0.1200 0.000
      不。 答案 1062 0.15 0 1 0.0017 0.1200 0.000
      不。 附加项 1062 0.00 0 0 0.0017 0.1200 0.000
    ▾ 查询统计信息 0 0.0000 100% - -
      Qname Len 535 32.99 14 66 0.0009 0.0600 0.000
     ▾ 标签统计信息 0 0.0000 - -
       第 4 级或更多级别 365 0.0006 0.0400 0.000
       第三级 170 0.0003 0.0200 0.000
       第二级 0 0.0000 - -
       第 1 级 0 0.0000 - -
     载荷大小 1066 92.87 32 194 0.0017 100% 0.1200 0.000

Wireshark 中的 DNS 分析对话框显示总共 1,066 个数据包。 在这些数据包中,17(1.59%)导致服务器故障。 此外,最大响应时间为 6,308 毫秒(6.3 秒),并且 0.38% 的查询未收到任何响应。 通过从包含查询的数据包的 50.19% 减去包含响应的数据包的 49.81% 来计算此总计。

如果在 Wireshark 中输入 (dns.flags.response == 0) && ! dns.response_in 为显示筛选器,此筛选器将显示未收到响应的 DNS 查询,如下表所示。

否。 时间 来源 目的地 协议 长度 信息
225 2024-04-01 16:50:40.000520 10.0.0.21 172.16.0.10 DNS(域名系统) 80 标准查询 0x2c67 AAAA db.contoso.com
426 2024-04-01 16:52:47.419907 10.0.0.21 172.16.0.10 DNS(域名系统) 132 标准查询 0x8038 A db.contoso.com.iosffyoulcwehgo1g3egb3m4oc.jx.internal.cloudapp.net
693 2024-04-01 16:55:23.105558 10.0.0.21 172.16.0.10 DNS(域名系统) 132 标准查询 0xbcb0 A db.contoso.com.iosffyoulcwehgo1g3egb3m4oc.jx.internal.cloudapp.net
768 2024-04-01 16:56:06.512464 10.0.0.21 172.16.0.10 DNS(域名系统) 80 标准查询0xe330 A db.contoso.com

此外,Wireshark 状态栏显示文本 数据包:1066 - 显示:4 (0.4%)。 此信息意味着 1,066 个数据包(即 0.4%)中有 4 个是从未收到响应的 DNS 查询。 此百分比实质上与之前计算的 0.38% 总计匹配。

如果将显示筛选器更改为,该筛选器 dns.time >= 5将显示需要五秒或更多时间才能接收的查询响应数据包,如更新后的表所示。

否。 时间 来源 目的地 协议 长度 信息 SourcePort 其他 RR DNS 响应时间
213 2024-04-01 16:50:32.644592 172.16.0.10 10.0.0.21 DNS(域名系统) 132 标准查询 0x9312 服务器故障 A db.contoso.com.iosffyoulcwehgo1g3egb3m4oc.jx.internal.cloudapp.net 53 0 6.229941
320 2024-04-01 16:51:55.053896 172.16.0.10 10.0.0.21 DNS(域名系统) 80 标准查询 0xe5ce 服务器故障 A db.contoso.com 53 0 6.065555
328 2024-04-01 16:51:55.113619 172.16.0.10 10.0.0.21 DNS(域名系统) 132 标准查询0x6681服务器故障 A db.contoso.com.iosffyoulcwehgo1g3egb3m4oc.jx.internal.cloudapp.net 53 0 6.029641
335 2024年04月01日 16:52:02.553811 172.16.0.10 10.0.0.21 DNS(域名系统) 80 标准查询 0x6cf6,服务器故障 A db.contoso.com 53 0 6.500504
541 2024-04-01 16:53:53.423838 172.16.0.10 10.0.0.21 DNS(域名系统) 80 标准查询0x07b3服务器错误 AAAA db.contoso.com 53 0 6.022195
553 2024-04-01 16:54:05.165234 172.16.0.10 10.0.0.21 DNS(域名系统) 132 标准查询0x1ea0服务器崩溃 A db.contoso.com.iosffyoulcwehgo1g3egb3m4oc.jx.internal.cloudapp.net 53 0 6.007022
774 2024-04-01 16:56:17.553531 172.16.0.10 10.0.0.21 DNS(域名系统) 80 标准查询 0xa20f 服务器故障 AAAA db.contoso.com 53 0 6.014926
891 2024-04-01 16:56:44.442334 172.16.0.10 10.0.0.21 DNS(域名系统) 132 标准查询编号 0xa279 服务器故障:A db.contoso.com.iosffyoulcwehgo1g3egb3m4oc.jx.internal.cloudapp.net 53 0 6.044552

更改显示筛选器后,状态栏将更新为显示文本数据包:1066 - 显示:8(0.8%)。 因此,1,066 个数据包(即 0.8%)中有 8 个是 DNS 响应,需要 5 秒或更多时间才能接收。 但是,在大多数客户端上,默认 DNS 超时值应为 5 秒。 此预期意味着,尽管 CoreDNS Pod 处理并传递了八个响应,但客户端已通过发出“超时”错误消息来结束会话。 筛选结果中的 “信息 ”列显示所有 8 个数据包都导致服务器故障。

所有 CoreDNS Pod 的 DNS 数据包分析

在 Wireshark 中,打开前面合并的 CoreDNS Pod 的捕获文件(coredns-cap1.pcap),然后打开 DNS 分析,如上一部分所述。 此时会显示一个“Wireshark”对话框,其中显示了下表。

主题/项目 计数 平均值 Min Val Max Val 速率(ms) 百分比 突发速率 快速启动
数据包总数 4540233 7.3387 100% 84.7800 592.950
 ▾ rcode 4540233 7.3387 100.00% 84.7800 592.950
    服务器故障 121781 0.1968 2.68% 8.4600 599.143
   无此类名称 574658 0.9289 12.66% 10.9800 592.950
   无错误 3843794 6.2130 84.66% 73.2500 592.950
 ▾操作码 4540233 7.3387 100.00% 84.7800 592.950
   标准查询 4540233 7.3387 100.00% 84.7800 592.950
 ▾ 查询/响应 4540233 7.3387 100.00% 84.7800 592.950
    响应 2135116 3.4512 47.03% 39.0400 581.680
    查询 2405117 3.8876 52.97% 49.1400 592.950
 ▾ 查询类型 4540233 7.3387 100.00% 84.7800 592.950
   SRV 3647 0.0059 0.08% 0.1800 586.638
   PTR 554630 0.8965 12.22% 11.5400 592.950
   NS 系列 15918 0.0257 0.35% 0.7200 308.225
   墨西哥 393016 0.6353 8.66% 7.9700 426.930
   AAAA 384032 0.6207 8.46% 8.4700 438.155
   一个 3188990 5.1546 70.24% 57.9600 592.950
 ▾ 类 4540233 7.3387 100.00% 84.7800 592.950
   在 4540233 7.3387 100.00% 84.7800 592.950
▾ 服务统计信息 0 0.0000 100% - -
   request-response time (msec) 2109677 277.18 0.020000 12000.532227 3.4100 38.0100 581.680
  不。 未经请求的回复 25402 0.0411 5.1400 587.832
  不。 重传 37 0.0001 0.0300 275.702
▾ 响应统计信息 0 0.0000 100% - -
  不。 一些问题 4244830 1.00 1 1 6.8612 77.0500 581.680
  不。 当局 4244830 0.39 0 11 6.8612 77.0500 581.680
  不。 答案 4244830 1.60 0 22 6.8612 77.0500 581.680
  不。 附加项 4244830 0.29 0 26 6.8612 77.0500 581.680
▾ 查询统计信息 0 0.0000 100% - -
  Qname Len 2405117 20.42 2 113 3.8876 49.1400 592.950
 ▾ 标签统计信息 0 0.0000 - -
   第 4 级或更多级别 836034 1.3513 16.1900 592.950
   第三级 1159513 1.8742 23.8900 592.950
   第二级 374182 0.6048 8.7800 592.955
   第 1 级 35388 0.0572 0.9200 294.492
 载荷大小 4540233 89.87 十七 1128 7.3387 100% 84.7800 592.950

该对话框表示总共有大约 450 万(4,540,233 个)数据包,其中 2.68% 导致服务器故障。 查询和响应数据包百分比的差异表明,5.94% 的查询(52.97% 减 47.03%)未收到响应。 最长响应时间为 12 秒(12,000.5322227 毫秒)。

如果您为查询响应应用了显示筛选器(处理时间为 5 秒或更长),dns.time >= 5那么筛选结果中的大多数数据包将显示服务器出现故障。 这可能是因为客户端“超时”错误。

下表汇总了捕获结果。

收集评审标准 是的
DNS 查询和响应之间的差异超过 2%
DNS 延迟超过 1 秒

故障排除步骤 2:制定假设

本部分对常见问题类型进行分类,以帮助缩小潜在问题范围,并确定可能需要调整的组件。 此方法为创建有针对性的行动计划奠定了基础,以有效缓解和解决这些问题。

常见的 DNS 响应代码

下表汇总了最常见的 DNS 返回代码。

DNS 返回代码 DNS 返回消息 DESCRIPTION
RCODE:0 NOERROR DNS 查询成功完成。
RCODE:1 FORMERR 存在 DNS 查询格式错误。
RCODE:2 SERVFAIL 服务器未完成 DNS 请求。
RCODE:3 NXDOMAIN 域名不存在。
RCODE:5 REFUSED 服务器拒绝回答查询。
RCODE:8 NOTAUTH 服务器对该区域不具有权威性。

常规问题类型

下表列出了有助于分解问题症状的问题类型类别。

问题类型 DESCRIPTION
性能 DNS 解析性能问题可能会导致间歇性错误,例如从客户端角度来看会出现“超时”错误。 这些问题可能是因为节点遇到资源耗尽或 I/O 限流。 此外,CoreDNS Pod 中计算资源的约束可能会导致解析延迟。 如果 CoreDNS 延迟较高或随着时间的推移而增加,则可能表示负载问题。 如果 CoreDNS 实例重载,可能会遇到 DNS 名称解析问题和延迟,或者可能会在工作负载和 Kubernetes 内部服务中看到问题。
配置 配置问题可能会导致 DNS 解析不正确。 在这种情况下,可能会遇到 NXDOMAIN 或“超时”错误。 CoreDNS、节点、Kubernetes、路由、虚拟网络 DNS、专用 DNS 区域、防火墙、代理等可能会出现不正确的配置。
网络连接 网络连接问题可能会影响 Pod 到 Pod 连接(东西流量)或与外部资源(南北流量)的 pod 和节点连接。 此方案可能会导致“超时”错误。 如果 CoreDNS 服务终结点不是最新的(例如,由于 kube-proxy 问题、路由问题、数据包丢失等),可能会出现连接问题。 外部资源依赖关系与连接问题(例如,自定义 DNS 服务器或外部 DNS 服务器的依赖关系)也可能导致问题。

所需的输入

在提出问题可能原因的假设之前,请汇总故障排除工作流前面步骤的结果。

可以使用下表收集结果。

基线问卷模板的结果
问题 可能的答案
DNS 解析在何处失败? ☐ 荚
☐ 节点
☐ Pod 和 节点
你会收到哪种类型的 DNS 错误? ☐ 超时
NXDOMAIN
☐ 其他 DNS 错误
DNS 错误的频率如何? ☐ 总是
☐ 间歇
☐ 在特定模式中
哪些记录受到影响? ☐ 特定域
☐ 任何领域
是否存在任何自定义 DNS 配置? ☐ 虚拟网络上的自定义 DNS 服务器
☐ 自定义 CoreDNS 配置
不同级别的测试结果
分辨率测试结果 作品 失败
从 Pod 到 CoreDNS 服务
从一个 Pod 到 CoreDNS Pod 的 IP 地址
从 Pod 到 Azure 内部 DNS
从 Pod 到虚拟网络 DNS
从节点到 Azure 内部 DNS
从节点到虚拟网络 DNS
节点和 CoreDNS Pod 的运行状况和性能结果
性能评审结果 正常 不健康
节点性能
CoreDNS Pod 性能
流量捕获和 DNS 解析性能的结果
收集评审标准 是的
DNS 查询和响应之间的差异超过 2%
DNS 延迟超过 1 秒

将所需的输入映射到问题类型

若要开发第一个假设,请将每个结果从所需输入映射到一个或多个问题类型。 通过在问题类型上下文中分析这些结果,可以开发有关 DNS 解决问题的潜在根本原因的假设。 然后,可以创建有针对性的调查和故障排除的行动计划。

错误类型映射指针

  • 如果测试结果显示 CoreDNS 服务的 DNS 解析失败,或者在尝试访问特定终结点时包含“超时”错误,则可能存在配置或连接问题。

  • CoreDNS Pod 或节点级别的计算资源不足的指示可能表明性能问题。

  • DNS 捕获在 DNS 查询和 DNS 响应之间存在相当大的不匹配,这可以指示数据包丢失。 此方案建议存在连接或性能问题。

  • 在虚拟网络级别或 Kubernetes 级别存在的自定义配置可能包含一些设置,这些设置无法与 AKS 和 CoreDNS 正常工作。

故障排除步骤 3:创建和实施行动计划

现在,你应该有足够的信息来创建和实施行动计划。 以下部分包含为特定问题类型制定计划的额外建议。

性能问题

如果要处理 DNS 解决性能问题,请查看并实施以下最佳做法和指南。

最佳做法 指南
设置一个专门的系统节点池,以满足最低规模要求。 在 Azure Kubernetes 服务中管理系统节点池(AKS)
为了避免磁盘 I/O 限流,请使用具有临时 OS 磁盘的节点。 Azure AKS 中的默认 OS 磁盘大小调整GitHub 问题 1373
在系统节点内对工作负载实施最佳的资源管理实践。 有关管理 Azure Kubernetes 服务 (AKS) 中的资源的应用程序开发人员最佳做法

如果进行这些更改后 DNS 性能仍然不够好,请考虑使用 节点本地 DNS

配置问题

根据具体组件,您应审查并理解该特定设置的影响。 有关配置详细信息,请参阅以下特定于组件的文档列表:

网络连接问题

  • 涉及容器网络接口(CNI)或其他 Kubernetes 或 OS 组件的 Bug 通常需要 AKS 支持或 AKS 产品组的干预。

  • 基础结构问题(如硬件故障或虚拟机监控程序问题)可能需要基础结构支持团队的协作。 或者,这些问题可能有自我修复功能。

故障排除步骤 4:观察结果并得出结论

观察实施行动计划的结果。 此时,你的行动计划应能够修复或缓解问题。

故障排除步骤 5:根据需要重复

如果这些故障排除步骤无法解决问题,请根据需要重复故障排除步骤。

第三方信息免责声明

本文讨论的第三方产品由独立于微软的公司制造。 Microsoft对这些产品的性能或可靠性不作任何明示或暗示的保证。

第三方联系人免责声明

为了帮助您获取有关此主题的更多信息,Microsoft 提供了第三方的联系信息。 该联系信息可能会在不通知的情况下更改。 微软不保证第三方联系信息的准确性。

联系我们以获得帮助

如果您有任何疑问或需要帮助,可以创建支持请求,或咨询Azure社区支持。 您还可以向Azure反馈社区提交产品反馈。