4. 演练场景设计:单节点故障、可用区故障、跨区域故障的 Helm 部署模拟

故障域隔离演练的核心在于通过模拟不同粒度的基础设施故障,验证 Helm 应用在 Kubernetes 集群中的自愈能力、数据持久性以及跨故障域迁移的可行性。本章将故障域划分为三个层级:单节点、可用区、跨区域,并针对每个层级设计对应的 Helm 部署模拟场景与 diff 复核要点。

4.1 故障域层级与演练目标

不同故障域的爆炸半径差异巨大,对应的 Helm 部署策略与风险控制手段也截然不同。下表梳理了三个层级的核心特征与演练验证目标:

故障域层级 爆炸半径 典型故障场景 Helm 部署验证目标
单节点故障 1 台 Worker 节点 节点宕机、内核 Panic、网络中断 Pod 自动漂移、PVC 重新挂载、StatefulSet 有序恢复
可用区故障 1 个数据中心可用区 AZ 电力中断、AZ 网络隔离、AZ 级 API Server 不可用 多 AZ 副本分布、Topology Spread Constraints 生效、跨 AZ 流量切换
跨区域故障 1 个地理区域 Region 级自然灾害、Region 级 DNS 故障 Global 负载均衡切换、跨 Region 数据同步、Helm Release 多集群一致性
关键原则:演练场景必须从最细粒度的单节点故障开始,逐级升级到可用区与跨区域故障。跳过单节点直接演练跨区域故障,往往因基础自愈能力不足而导致演练失败且难以定位根因。

4.2 单节点故障模拟与 Helm 部署

单节点故障是最基础的故障域隔离演练。通过模拟 Kubernetes 集群中一个 Worker 节点的完全不可用,验证 Helm 部署的 PodDisruptionBudget (PDB)、反亲和性规则以及 StatefulSet 的持久化存储恢复。

4.2.1 模拟步骤

  1. 节点封锁与排空:使用 kubectl cordon <node> 和 kubectl drain <node> --ignore-daemonsets --delete-emptydir-data 模拟节点进入维护状态。
  2. 节点断电模拟:在云环境中直接停止虚拟机实例;在裸金属环境中通过 IPMI 执行硬关机。
  3. Helm 部署验证:执行 helm upgrade --install 部署一个包含 3 副本 StatefulSet 的 Chart,观察 Pod 是否在剩余健康节点上重建。
  4. diff 复核:对比故障前后 helm get manifest 的输出,确认 PVC 与 Pod 的绑定关系未丢失。

4.2.2 单节点故障演练拓扑

单节点故障模拟拓扑 Node-1 (正常) Pod-A (Running) Pod-B (Running) PVC-Data Node-2 (故障) Pod-C (Terminating) Pod-D (Lost) PVC-Data (Unbound) Node-3 (恢复) Pod-C (Rescheduled) Pod-D (Rescheduled) PVC-Data (Re-attached) 节点故障 Pod 漂移
diff 复核重点:在单节点故障场景中,重点关注 helm diff upgrade 输出的 spec.nodeName 字段变化,以及 PVC 的 volumeName 是否保持不变。如果 PVC 的 status.phase 变为 Lost,说明存储后端未正确支持跨节点挂载。

4.3 可用区故障模拟与 Helm 部署

可用区故障模拟的是整个数据中心可用区的服务中断。Helm 部署需要验证 Topology Spread Constraints、Pod Anti-Affinity 以及 Service 跨 AZ 负载均衡 是否按预期工作。

4.3.1 模拟步骤

  1. AZ 标签注入:确保集群节点带有 topology.kubernetes.io/zone 标签,且 Helm Chart 的 values 中配置了 topologySpreadConstraints。
  2. AZ 网络隔离:通过云平台安全组或网络 ACL 阻断目标 AZ 的所有入站/出站流量。
  3. Helm 部署验证:部署一个 6 副本的 Deployment,要求每个 AZ 最多 2 个副本。观察故障 AZ 的 Pod 是否被调度到其他 AZ。
  4. diff 复核:对比故障前后 kubectl describe pod 中的 Topology Spread Constraints 评分,确认调度器未违反约束。

4.3.2 可用区故障演练拓扑

可用区故障模拟拓扑 可用区 A (正常) Pod-1 (Running) Pod-2 (Running) SLB-A (Active) Redis-A (Master) 可用区 B (故障) Pod-3 (CrashLoopBackOff) Pod-4 (Pending) SLB-B (Down) Redis-B (Replica/Unreachable) 可用区 C (接管) Pod-3 (Rescheduled) Pod-4 (Rescheduled) SLB-C (Active) Redis-C (New Master) AZ 故障 跨 AZ 调度
风险提示:可用区故障时,如果 Helm Chart 未配置 topologySpreadConstraints 或 podAntiAffinity,调度器可能将所有副本集中到剩余可用区,导致单可用区过载。diff 复核时必须检查 spec.topologySpreadConstraints 是否在 Release 的 manifest 中正确渲染。

4.4 跨区域故障模拟与 Helm 部署

跨区域故障是最严重的故障域场景,通常涉及多集群架构。Helm 部署需要验证 多集群 Release 一致性、Global 负载均衡切换以及 跨 Region 数据同步。

4.4.1 模拟步骤

  1. 多集群 Helm 部署:使用 helm install 分别在主 Region 和备 Region 的集群中部署同一 Chart,但 values 中配置不同的 global.region 标识。
  2. Region 级 DNS 故障:模拟主 Region 的 DNS 解析失败,或直接切断主 Region 集群的 API Server 网络。
  3. Helm 部署验证:执行 helm list --all-namespaces 确认备 Region 集群的 Release 状态正常,且 Service 的 External IP 已通过 Global SLB 切换。
  4. diff 复核:使用 helm diff release 对比主备集群的 Release 配置差异,确保除 region 标识外,核心参数(镜像版本、副本数、资源限制)完全一致。

4.4.2 跨区域故障演练拓扑

跨区域故障模拟拓扑 主 Region (故障) K8s Cluster-A (API Server Unreachable) Helm Release-A (Unknown) Global SLB-A (Active → Down) DB-A (Primary, Unreachable) 备 Region (接管) K8s Cluster-B (API Server Healthy) Helm Release-B (Deployed, Consistent) Global SLB-B (Standby → Active) DB-B (Replica → Primary) Region 故障切换 跨 Region 数据同步 (异步)
diff 复核关键命令:
# 对比主备集群的 Release 配置
helm diff release --kube-context=cluster-a my-app ./chart -n production
helm diff release --kube-context=cluster-b my-app ./chart -n production

# 重点关注差异项
helm get values my-app -n production --kube-context=cluster-a
helm get values my-app -n production --kube-context=cluster-b

4.5 演练场景参数对比清单

为了在演练前快速配置 Helm 部署参数,下表汇总了三个故障域场景的关键 Helm values 配置项:

故障域 Helm Values 配置项 推荐值 验证指标
单节点故障 podDisruptionBudget.minAvailable 2 (3 副本) 故障后可用副本数 ≥ 2
单节点故障 affinity.podAntiAffinity preferredDuringScheduling Pod 分布在 ≥ 2 个节点
可用区故障 topologySpreadConstraints.maxSkew 1 每个 AZ 副本数偏差 ≤ 1
可用区故障 global.zoneCount 3 故障 AZ 副本迁移至其他 AZ
跨区域故障 global.region primary / dr 备 Region Release 状态为 deployed
跨区域故障 service.globalLoadBalancer.enabled true Global SLB 切换时间 < 60s
演练前置检查:在开始任何故障注入之前,务必执行 helm test 确保当前 Release 的健康检查通过。同时使用 helm get manifest 导出当前基线配置,作为故障后 diff 复核的基准。