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 故障域隔离架构图

故障域隔离架构示意 故障域隔离架构示意 物理故障域:Region us-east-1 可用区 A (us-east-1a) 机架 A1 服务 v1.0 机架 A2 服务 v1.1 可用区 B (us-east-1b) 机架 B1 服务 v1.0 机架 B2 服务 v1.1 逻辑故障域:服务版本与部署组 版本 v1.0(稳定) 部署组: stable 实例: 机架A1 + 机架B1 Envoy metadata: version=v1.0 版本 v1.1(金丝雀) 部署组: canary 实例: 机架A2 + 机架B2 Envoy metadata: version=v1.1 升级隔离策略 1. 按AZ逐批升级 2. 按版本灰度切换 3. Envoy流量权重控制 物理故障域边界 逻辑故障域边界 策略说明

2.7 故障域设计最佳实践

  1. 最小故障域原则:将故障域粒度控制在“单机架”或“单个部署组”,避免过大的故障域导致升级爆炸半径失控。
  2. 物理与逻辑交叉映射:确保每个逻辑故障域(如版本 v1.0)的实例均匀分布在多个物理故障域中,避免单点物理故障导致整个版本不可用。
  3. Envoy 故障域感知路由:配置 locality_weighted_lb 使流量优先在本地 AZ 内闭环,减少跨 AZ 延迟和带宽成本;升级期间通过 metadata_match 将流量逐步切至新版本。
  4. 升级顺序编排:先升级一个物理故障域(如 AZ A),观察无异常后再升级下一个;在每个物理域内,按逻辑故障域(如金丝雀→稳定)逐步切换。
升级检查清单: 每次升级前,确认 (1) 当前集群的故障域拓扑是否清晰;(2) Envoy 端点元数据是否准确标记了版本和部署组;(3) 升级控制器是否按故障域分批执行,且每批之间有足够的观察窗口。