4. DNS 故障场景分类

在生产环境中,DNS 故障的表现形式多种多样,但根据故障发生的层次和原因,可以归纳为五大核心类别。理解这些分类是进行故障域划分和 Helm 部署隔离的前提。每一类故障对 Kubernetes 集群的影响范围、恢复手段均不相同。

4.1 故障分类总览

故障类别 故障层次 典型影响范围 恢复难度
上游递归故障 递归解析器 → 根/顶级域 集群外域名解析全部失效 中
权威服务器故障 权威 NS → 特定域名 特定业务域名解析失败 低
缓存污染 递归解析器 / 本地缓存 域名指向错误 IP 高
网络分区 节点间 / Pod 间网络 部分节点 DNS 不可达 高
配置错误 CoreDNS / kubelet / Pod 局部或全局解析异常 低
课程要点: 在 Helm 部署测试中,我们通过 values.yaml 中的 faultInjection 参数来模拟上述五类故障,从而验证故障域隔离策略的有效性。

4.2 上游递归故障

上游递归故障指集群 CoreDNS 所依赖的外部递归解析器(如 8.8.8.8、114.114.114.114)无法正常完成递归查询。常见原因包括:上游 DNS 服务器宕机、网络链路中断、递归查询超时。

  • 故障表现: 集群内 Pod 无法解析外部域名(如 www.example.com),但集群内部 Service 解析正常。
  • 故障域划分: 影响所有使用该上游解析器的节点和命名空间,属于全局性故障。
  • Helm 模拟方式: 在 CoreDNS ConfigMap 中配置 forward . 0.0.0.0:53 或设置超时时间为 0。

4.3 权威服务器故障

权威服务器故障是指特定域名的权威名称服务器(Authoritative Nameserver)不可用或返回 SERVFAIL。例如 example.com 的 NS 记录指向的服务器宕机。

  • 故障表现: 仅特定域名解析失败,其他域名正常。例如 api.example.com 无法解析,但 google.com 正常。
  • 故障域划分: 影响所有请求该域名的 Pod,属于局部性故障。
  • Helm 模拟方式: 在测试命名空间部署自定义权威服务器,并配置 CoreDNS 的 rewrite 规则指向不可达地址。

4.4 缓存污染

缓存污染(DNS Cache Poisoning)指递归解析器或本地 CoreDNS 缓存中存储了错误的 DNS 记录,导致域名被解析到错误的 IP 地址。攻击或配置错误均可引发。

  • 故障表现: 域名解析返回错误 IP,导致连接失败或安全风险。例如 db-service 被解析到错误的 Pod IP。
  • 故障域划分: 影响所有使用该缓存实例的 Pod,属于局部性故障,但扩散速度快。
  • Helm 模拟方式: 通过 faultInjection.cachePoison 参数注入伪造的 A 记录到 CoreDNS 缓存。
注意: 缓存污染在 Kubernetes 环境中容易被忽视,因为 CoreDNS 默认缓存时间(TTL)较长。在故障域测试中,建议将 TTL 调低至 5 秒以加速故障注入和恢复验证。

4.5 网络分区

网络分区(Network Partition)指集群内部分节点或 Pod 之间的网络连通性中断,导致 DNS 请求无法到达 CoreDNS Pod 或上游服务器。这是分布式系统中最棘手的故障之一。

  • 故障表现: 部分节点上的 Pod 无法解析任何域名,而其他节点正常。或特定命名空间的 Pod 无法访问 CoreDNS Service。
  • 故障域划分: 影响特定节点组或网络拓扑区域,属于区域性故障。
  • Helm 模拟方式: 使用 NetworkPolicy 或 Service Mesh 的流量规则,阻断特定命名空间到 CoreDNS 的 UDP/53 流量。

4.6 配置错误

配置错误是最常见且最容易复现的 DNS 故障。包括 CoreDNS 配置错误、kubelet 的 --cluster-dns 参数错误、Pod 的 dnsPolicy 设置不当、ndots 值不合理等。

  • 故障表现: 解析超时、搜索域拼接错误、域名解析顺序混乱。例如 my-svc 被解析为 my-svc.default.svc.cluster.local 失败。
  • 故障域划分: 影响配置错误的命名空间或 Pod,属于局部性故障。
  • Helm 模拟方式: 在 values.yaml 中设置 coreDNS.configOverrides 注入错误配置,如错误的 forward 目标或缺失的 rewrite 规则。

4.7 故障分类关系图

下图展示了五类 DNS 故障在 Kubernetes 集群中的影响层次和传播路径,帮助理解故障域划分的边界。

DNS 故障分类关系图 DNS 故障分类与影响层次 集群外部 DNS 基础设施 根域名服务器 · 顶级域 · 权威名称服务器 · 公共递归解析器 CoreDNS 集群(递归解析器) 缓存 · 转发 · 重写 · 健康检查 Kubernetes 工作负载(Pod / Service) kubelet dnsPolicy · Pod 搜索域 · ndots · Service 发现 故障注入点(Helm 模拟) ① 上游递归故障 → 外部 DNS 不可达 ② 权威服务器故障 → 特定域名失败 ③ 缓存污染 → 错误解析结果 ④ 网络分区 → 部分节点不可达 ⑤ 配置错误 → CoreDNS/Pod 配置异常 故障域划分 全局故障:上游递归、网络分区 局部故障:权威服务器、缓存污染 配置错误:按命名空间隔离 Helm 部署:每个故障独立 Chart

4.8 故障分类与 Helm 测试策略对照

故障类别 Helm 测试 Chart 故障注入参数 预期故障域
上游递归故障 dns-upstream-fault faultInjection.upstreamDead=true 全局
权威服务器故障 dns-authoritative-fault faultInjection.authoritativeDown=true 特定域名
缓存污染 dns-cache-poison faultInjection.cachePoison.enabled=true 缓存实例
网络分区 dns-network-partition faultInjection.networkBlock.namespace=test 节点/命名空间
配置错误 dns-config-error faultInjection.configError.type=forward 命名空间