2. 核心概念:故障域(Failure Domain)定义、类型与隔离策略
2.1 故障域定义
故障域(Failure Domain)是云原生基础设施中一个共享故障点的逻辑或物理边界。在该边界内,任意单一故障事件(如电源中断、网络分区、硬件故障)可能导致所有承载的服务同时不可用。在 Helm 应用交付场景中,明确故障域是设计高可用架构、编排 Pod 分布策略以及复核 diff 报告时判断风险等级的基础。
核心原则:两个工作负载若位于同一故障域,则它们共享相同的风险剖面;若位于不同故障域,则具备独立故障隔离能力。
2.2 故障域类型与层级
故障域按物理范围从小到大分为三个层级:节点(Node)、可用区(Availability Zone, AZ)、区域(Region)。下表对比了各层级的关键特征:
| 层级 | 故障范围 | 典型故障事件 | K8s 原生抽象 | Helm 关注点 |
|---|---|---|---|---|
| 节点 | 单台物理机/虚拟机 | 磁盘损坏、内核崩溃、网卡故障 | Node / Pod | Pod 反亲和、topologyKey: kubernetes.io/hostname |
| 可用区 | 数据中心内独立电力/网络单元 | 机架断电、核心交换机故障 | topology.kubernetes.io/zone | PodTopologySpread、多副本跨 AZ 分布 |
| 区域 | 地理隔离的完整数据中心集群 | 自然灾害、大规模电力中断 | topology.kubernetes.io/region | 多集群 Helm Release、Global 负载均衡 |
2.3 故障域隔离策略
在 Helm 应用交付中,故障域隔离策略通过 Pod 调度约束 和 拓扑分布约束 实现。以下为三种核心策略:
- 节点级隔离(PodAntiAffinity):确保同一工作负载的多个副本不会调度到同一节点,防止单节点故障导致全部副本丢失。
- 可用区级隔离(PodTopologySpread):将副本均匀分布到不同可用区,容忍整个可用区故障。
- 区域级隔离(多集群部署):通过 Helm 同时部署到多个 Region 的集群,配合 Global DNS 或 Service Mesh 实现跨区域容灾。
Helm 实践提示:在 values.yaml 中通过
topologySpreadConstraints 和 affinity 字段声明隔离策略。diff 报告复核时,需重点检查这些字段是否被意外修改或删除。
2.4 故障域隔离策略对比
| 策略 | K8s 资源字段 | 隔离粒度 | RTO(恢复时间目标) | Helm values 示例 |
|---|---|---|---|---|
| 节点反亲和 | spec.affinity.podAntiAffinity | 单节点 | 秒级(重新调度) | affinity.podAntiAffinity.requiredDuringScheduling |
| 可用区拓扑分布 | spec.topologySpreadConstraints | 可用区 | 分钟级(AZ 切换) | topologySpreadConstraints[0].topologyKey: topology.kubernetes.io/zone |
| 区域多集群 | 多 Helm Release / ArgoCD Application | 地理区域 | 分钟~小时级(DNS 切换) | 独立 values 文件 + kubecontext 切换 |
2.5 故障域在 Helm diff 中的风险映射
在 diff 报告复核中,故障域相关字段的变更直接影响风险等级判定。以下为常见变更场景及其风险映射:
| diff 变更类型 | 影响的故障域层级 | 风险等级 | 复核动作 |
|---|---|---|---|
删除 podAntiAffinity |
节点 | 高 | 确认是否故意放宽调度约束 |
修改 topologySpreadConstraints.maxSkew |
可用区 | 中 | 验证新值是否仍满足可用区容灾要求 |
新增 nodeSelector 指向单一可用区 |
可用区 | 高 | 检查是否破坏了跨 AZ 分布策略 |
变更 replicas 从 3 降为 1 |
节点/可用区 | 高 | 确认是否为临时变更,评估单点故障影响 |
更新 affinity 中的 topologyKey |
节点/可用区 | 中 | 确认新 key 是否对应正确的故障域标签 |
风险控制要点:任何导致 Pod 副本集中在更少故障域的变更,都应触发人工复核。在 Helm diff 复核流程中,将故障域相关字段的变更标记为“必须审批”级别。
2.6 故障域隔离策略的 Helm values 配置示例
以下为一个生产级 Helm values 片段,同时启用了节点反亲和与可用区拓扑分布:
# values.yaml
replicaCount: 3
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app.kubernetes.io/name
operator: In
values:
- my-app
topologyKey: kubernetes.io/hostname
topologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app.kubernetes.io/name: my-app
复核要点:在 diff 报告中,若上述
topologySpreadConstraints 段被整体删除或 maxSkew 从 1 变为 2,意味着可用区故障容忍度下降,应标记为高风险变更并触发回滚审批。