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