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 模拟步骤
- 节点封锁与排空:使用
kubectl cordon <node>和kubectl drain <node> --ignore-daemonsets --delete-emptydir-data模拟节点进入维护状态。 - 节点断电模拟:在云环境中直接停止虚拟机实例;在裸金属环境中通过 IPMI 执行硬关机。
- Helm 部署验证:执行
helm upgrade --install部署一个包含 3 副本 StatefulSet 的 Chart,观察 Pod 是否在剩余健康节点上重建。 - diff 复核:对比故障前后
helm get manifest的输出,确认 PVC 与 Pod 的绑定关系未丢失。
4.2.2 单节点故障演练拓扑
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 模拟步骤
- AZ 标签注入:确保集群节点带有
topology.kubernetes.io/zone标签,且 Helm Chart 的 values 中配置了topologySpreadConstraints。 - AZ 网络隔离:通过云平台安全组或网络 ACL 阻断目标 AZ 的所有入站/出站流量。
- Helm 部署验证:部署一个 6 副本的 Deployment,要求每个 AZ 最多 2 个副本。观察故障 AZ 的 Pod 是否被调度到其他 AZ。
- diff 复核:对比故障前后
kubectl describe pod中的Topology Spread Constraints评分,确认调度器未违反约束。
4.3.2 可用区故障演练拓扑
风险提示:可用区故障时,如果 Helm Chart 未配置
topologySpreadConstraints 或 podAntiAffinity,调度器可能将所有副本集中到剩余可用区,导致单可用区过载。diff 复核时必须检查 spec.topologySpreadConstraints 是否在 Release 的 manifest 中正确渲染。
4.4 跨区域故障模拟与 Helm 部署
跨区域故障是最严重的故障域场景,通常涉及多集群架构。Helm 部署需要验证 多集群 Release 一致性、Global 负载均衡切换以及 跨 Region 数据同步。
4.4.1 模拟步骤
- 多集群 Helm 部署:使用
helm install分别在主 Region 和备 Region 的集群中部署同一 Chart,但 values 中配置不同的global.region标识。 - Region 级 DNS 故障:模拟主 Region 的 DNS 解析失败,或直接切断主 Region 集群的 API Server 网络。
- Helm 部署验证:执行
helm list --all-namespaces确认备 Region 集群的 Release 状态正常,且 Service 的 External IP 已通过 Global SLB 切换。 - diff 复核:使用
helm diff release对比主备集群的 Release 配置差异,确保除 region 标识外,核心参数(镜像版本、副本数、资源限制)完全一致。
4.4.2 跨区域故障演练拓扑
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 复核的基准。