2. 故障域基础:故障域定义、物理故障域(机架/可用区)、逻辑故障域(服务/版本)
2.1 故障域定义
故障域(Failure Domain) 是指系统中一组共享单一故障点的资源集合。当该故障点失效时,集合内的所有资源将同时不可用。故障域是集群升级、容灾设计、流量调度的基础抽象单元。
核心原则: 故障域之间应尽量相互隔离,使一个域的故障不会级联扩散到其他域。升级操作必须按故障域逐批执行,控制爆炸半径。
2.2 物理故障域
物理故障域由基础设施的物理边界定义,常见层级如下:
| 层级 | 故障范围 | 典型故障场景 | 隔离粒度 |
|---|---|---|---|
| 机架(Rack) | 单机架内所有服务器 | 电源模块故障、TOR交换机宕机、机架级断电 | 粗粒度 |
| 可用区(Availability Zone, AZ) | 同一数据中心内独立电力/网络单元 | AZ级电力中断、制冷失效、网络分区 | 中粒度 |
| 区域(Region) | 跨数据中心的地理区域 | 自然灾害、骨干网故障、大规模电力事故 | 粗粒度 |
实践建议: 在 Kubernetes 集群中,通常将
topology.kubernetes.io/zone 和 topology.kubernetes.io/region 标签绑定到 Node 上,用于 Pod 调度和 Envoy 端点发现时的故障域感知。
2.3 逻辑故障域
逻辑故障域由软件架构或部署策略定义,与物理位置解耦。常见类型包括:
- 服务(Service):同一微服务内的所有实例共享相同的代码库和配置,一个 Bug 可能影响该服务的全部实例。
- 版本(Version):同一服务的不同版本(如 v1、v2)构成独立的逻辑故障域。版本升级时,新旧版本之间的兼容性、流量切换是核心风险点。
- 部署组(Deployment Group):如金丝雀组、蓝组、绿组,每组独立接收流量,用于渐进式发布。
常见误区: 逻辑故障域不能完全替代物理故障域。即使服务版本隔离,若所有 Pod 被调度到同一机架,物理故障仍会导致全版本不可用。升级策略必须同时考虑物理与逻辑两个维度。
2.4 物理 vs 逻辑故障域对比
| 维度 | 物理故障域 | 逻辑故障域 |
|---|---|---|
| 定义依据 | 硬件、电力、网络拓扑 | 软件版本、服务边界、部署策略 |
| 故障原因 | 硬件老化、断电、光纤中断 | 代码缺陷、配置错误、兼容性问题 |
| 隔离手段 | 分散部署、跨AZ调度 | 版本控制、流量路由、熔断降级 |
| 升级影响范围 | 按机架/AZ逐批升级 | 按版本/部署组灰度切换 |
| Envoy 感知方式 | locality 字段(region/zone/sub_zone) |
metadata 字段(version/canary) |
2.5 故障域在 Envoy 中的表达
Envoy 通过 Locality 和 Metadata 两个维度承载故障域信息,用于流量调度和升级隔离。
# Envoy 端点示例:物理 + 逻辑故障域
hosts:
- socket_address:
address: 10.0.1.5
port_value: 8080
locality:
region: us-east-1
zone: us-east-1a
sub_zone: rack-12
metadata:
filter_metadata:
envoy.lb:
version: "v2.3.1"
canary: "false"
deployment_group: "stable"
关键设计: 升级控制器在滚动升级时,应同时检查
locality 确保不跨物理域并行升级,检查 metadata.version 确保版本切换顺序正确。Envoy 的 locality_weighted_lb 和 metadata_match 配置可精确控制流量在故障域间的分布。
2.6 故障域隔离架构图
2.7 故障域设计最佳实践
- 最小故障域原则:将故障域粒度控制在“单机架”或“单个部署组”,避免过大的故障域导致升级爆炸半径失控。
- 物理与逻辑交叉映射:确保每个逻辑故障域(如版本 v1.0)的实例均匀分布在多个物理故障域中,避免单点物理故障导致整个版本不可用。
- Envoy 故障域感知路由:配置
locality_weighted_lb使流量优先在本地 AZ 内闭环,减少跨 AZ 延迟和带宽成本;升级期间通过metadata_match将流量逐步切至新版本。 - 升级顺序编排:先升级一个物理故障域(如 AZ A),观察无异常后再升级下一个;在每个物理域内,按逻辑故障域(如金丝雀→稳定)逐步切换。
升级检查清单: 每次升级前,确认 (1) 当前集群的故障域拓扑是否清晰;(2) Envoy 端点元数据是否准确标记了版本和部署组;(3) 升级控制器是否按故障域分批执行,且每批之间有足够的观察窗口。