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 集群中的影响层次和传播路径,帮助理解故障域划分的边界。
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 |
命名空间 |