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 调度约束 和 拓扑分布约束 实现。以下为三种核心策略:

  1. 节点级隔离(PodAntiAffinity):确保同一工作负载的多个副本不会调度到同一节点,防止单节点故障导致全部副本丢失。
  2. 可用区级隔离(PodTopologySpread):将副本均匀分布到不同可用区,容忍整个可用区故障。
  3. 区域级隔离(多集群部署):通过 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 切换
故障域层级与隔离策略关系 区域(Region) 地理隔离 · 多集群 Helm Release · Global 负载均衡 故障事件:自然灾害、大规模电力中断 可用区(Availability Zone) 独立电力/网络单元 · PodTopologySpread · 跨 AZ 分布 故障事件:机架断电、核心交换机故障 节点(Node) 单台物理机/虚拟机 · PodAntiAffinity · hostname 反亲和 故障事件:磁盘损坏、内核崩溃、网卡故障 隔离策略逐层递进:节点 → 可用区 → 区域,故障半径越大,隔离成本越高

2.5 故障域在 Helm diff 中的风险映射

在 diff 报告复核中,故障域相关字段的变更直接影响风险等级判定。以下为常见变更场景及其风险映射:

diff 变更类型 影响的故障域层级 风险等级 复核动作
删除 podAntiAffinity 节点 高 确认是否故意放宽调度约束
修改 topologySpreadConstraints.maxSkew 可用区 中 验证新值是否仍满足可用区容灾要求
新增 nodeSelector 指向单一可用区 可用区 高 检查是否破坏了跨 AZ 分布策略
变更 replicas 从 3 降为 1 节点/可用区 高 确认是否为临时变更,评估单点故障影响
更新 affinity 中的 topologyKey 节点/可用区 中 确认新 key 是否对应正确的故障域标签
风险控制要点:任何导致 Pod 副本集中在更少故障域的变更,都应触发人工复核。在 Helm diff 复核流程中,将故障域相关字段的变更标记为“必须审批”级别。
Helm 部署故障域隔离决策流程 Helm 部署请求 replicas > 1 ? 单副本:无故障域隔离 检查 topologySpreadConstraints topologyKey = zone ? 仅节点级隔离 可用区级隔离 diff 复核关键检查点 • replicas 是否被意外减少 • topologyKey 是否被修改 • podAntiAffinity 是否被删除 • maxSkew 是否超过容灾阈值

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,意味着可用区故障容忍度下降,应标记为高风险变更并触发回滚审批。