1. 故障域概念与重要性

1.1 什么是故障域

故障域(Failure Domain) 是指系统中一组共享同一故障风险边界的资源集合。当该边界内的某个组件(如电源、网络交换机、物理服务器或机架)发生故障时,边界内的所有资源都会受到连带影响,而边界外的资源理论上不受影响。

故障域的本质是 故障隔离边界。划分故障域的核心目标是将系统拆分为多个相互独立的故障单元,使单点故障的爆炸半径被限制在最小范围内。

关键定义: 故障域 = 共享同一故障源(电源、网络、散热、物理位置)的资源组。故障域越大,单次故障的影响范围越广;故障域越小,系统冗余成本越高。

1.2 故障域与可用区的关系

在云原生和分布式系统架构中,可用区(Availability Zone, AZ) 是故障域的一种具体实现形式。两者并非等同概念,而是 抽象层级 与 具体实现 的关系。

对比维度 故障域(Failure Domain) 可用区(Availability Zone)
抽象层级 通用概念,适用于任何系统 云平台/数据中心的具体实现
粒度 可大可小(进程、主机、机架、机房、城市) 通常对应独立数据中心或独立电力/网络单元
故障隔离 逻辑或物理隔离 物理隔离(独立电力、制冷、网络入口)
典型用途 架构设计、容灾规划、资源调度 云服务实例部署、跨AZ高可用
关系 可用区是故障域的一种特例 一个可用区通常包含多个故障域(机架级)
实践要点: 在Kubernetes集群中,通常使用 topology.kubernetes.io/zone 标签标识可用区级别的故障域,使用 topology.kubernetes.io/region 标识地域级别的故障域。Pod反亲和性策略正是基于这些标签实现跨故障域调度。

1.3 为什么需要划分故障域

不划分故障域的集群,本质上是一个 单点故障集合体。以下四个核心原因决定了故障域划分的必要性:

  1. 限制爆炸半径:将故障影响范围从“全集群”缩小到“单个机架”或“单个可用区”。
  2. 实现高可用:通过跨故障域冗余部署,确保单个故障域失效时业务不中断。
  3. 提升可预测性:明确故障边界后,容量规划、灾备演练、SLA承诺才有实际依据。
  4. 降低运维复杂度:故障域划分后,运维团队可以针对每个域独立进行变更、升级和监控。
常见误区: 很多团队认为“只要用了云服务商的多可用区,故障域就自动划分好了”。实际上,如果应用层没有做跨AZ的Pod反亲和调度、没有配置跨AZ的负载均衡,多可用区只是“物理上的隔离”,业务层面仍然是单点。

1.4 故障域层级模型

故障域是一个 分层嵌套 的结构。从最细粒度到最粗粒度,典型的故障域层级如下:

故障域层级模型 故障域层级模型 进程 / 容器 物理主机 / 虚拟机 机架 / 电源域 可用区 / 数据中心 地域 / Region 层级说明 • 进程/容器级:单进程崩溃,仅影响该容器 • 主机级:宿主机宕机,影响其上所有容器 • 机架级:交换机/电源故障,影响整个机架 • 可用区级:数据中心故障,影响整个AZ • 地域级:自然灾害,影响整个Region 故障域划分原则: 1. 上层故障域包含下层故障域 2. 不同层级故障域之间相互独立 3. 冗余部署应跨越至少2个同级故障域 4. 故障域粒度越细,冗余成本越高

1.5 故障域划分的核心收益

收益维度 未划分故障域 已划分故障域
故障影响范围 单点故障可能导致全集群不可用 故障被限制在单个故障域内
可用性SLA 难以承诺99.9%以上 可支撑99.99%+(跨3个AZ)
变更风险 变更必须全集群停机 按故障域灰度发布,风险可控
容量规划 无法精确评估冗余需求 按故障域独立规划,冗余清晰
故障定位 需要排查全集群 直接定位到故障域,效率提升
SRE实践建议: 在集群初始化阶段,就应该完成故障域标签的标准化定义。推荐使用 failure-domain.beta.kubernetes.io/zone 和 failure-domain.beta.kubernetes.io/region 作为基础标签,并自定义 topology.kubernetes.io/rack 标签用于机架级故障域划分。后续所有Pod调度策略、HPA弹性伸缩、PDB预算配置都应基于这些标签进行。