1. 故障域概念
1.1 故障域定义
故障域(Failure Domain) 是指集群中一组共享同一故障风险边界的资源集合。当该边界内的任意组件(如电源、网络交换机、物理服务器、机架或数据中心)发生故障时,边界内的所有资源都会同时受到影响。故障域的本质是 故障传播的物理或逻辑隔离边界。
核心特征: 故障域内的资源具有 共因失效(Common Cause Failure) 特性——单一故障事件会导致域内全部或大部分服务实例不可用。
在分布式系统中,故障域通常按粒度从大到小划分为:
- 区域级故障域:整个数据中心、可用区(Availability Zone)或地理区域。
- 机架级故障域:共享同一电源分配单元(PDU)或 ToR(Top of Rack)交换机的服务器集合。
- 节点级故障域:单台物理服务器或虚拟机。
- 进程级故障域:单个容器、Pod 或操作系统进程。
1.2 故障域与可用区的关系
可用区(Availability Zone, AZ)是云服务商对故障域的一种标准化封装。下表清晰对比了两者的核心差异:
| 对比维度 | 故障域(Failure Domain) | 可用区(Availability Zone) |
|---|---|---|
| 定义粒度 | 任意级别的故障隔离边界(机架/节点/进程) | 通常对应一个或多个数据中心,是云厂商定义的逻辑单元 |
| 故障隔离范围 | 由用户自行定义,可细可粗 | AZ 之间物理隔离(独立电力、网络、制冷) |
| 典型延迟 | 取决于层级,机架内 < 1ms,跨 AZ 1~5ms | 跨 AZ 通常 1~2ms,跨 Region > 10ms |
| 用户控制力 | 完全可控(通过标签、拓扑约束自定义) | 由云平台预定义,用户只能选择部署到哪些 AZ |
| 典型用途 | 精细化调度、成本优化、故障隔离策略 | 高可用部署、跨 AZ 容灾、SLA 保障 |
实践要点: 在 Kubernetes 集群中,
topology.kubernetes.io/zone 标签通常映射到云厂商的可用区,而 topology.kubernetes.io/region 映射到地理区域。用户还可以通过自定义标签(如 failure-domain.beta.kubernetes.io/rack)定义更细粒度的故障域。
1.3 故障域在集群中的重要性
故障域划分直接决定了集群的 可用性上限 和 故障恢复速度。以下是故障域在集群架构中的三个关键作用:
- 避免单点故障(SPOF):将副本或分片分散到不同故障域,确保单个故障域失效时服务仍可用。
- 控制爆炸半径:限制故障影响范围,防止级联故障扩散到整个集群。
- 指导调度决策:调度器根据故障域约束将 Pod 或任务均匀分布,实现资源与风险的平衡。
下图展示了集群中不同粒度故障域的层级关系与故障传播路径:
常见误区: 许多团队将 Pod 副本部署到同一可用区的不同节点上,认为已经实现了高可用。但实际上,如果该可用区的网络或电力整体故障,所有副本仍会同时失效。真正的故障域隔离必须跨越可用区或机架层级。