3. 故障域概念:故障域定义、常见故障域类型与租户映射
3.1 故障域定义
故障域(Failure Domain)是云基础设施中一组共享单一故障点的资源集合。当该故障点失效时,集合内的所有资源将同时不可用。故障域是进行多租户隔离设计的基础逻辑单元,其粒度决定了故障爆炸半径。
核心原则: 故障域边界越细,租户隔离度越高,但资源调度和运维复杂度也相应增加。SRE 需要在隔离粒度与资源利用率之间取得平衡。
3.2 常见故障域类型
从物理到逻辑,故障域通常分为以下三个层级,每一层对应不同的故障场景和隔离策略:
| 故障域层级 | 典型故障点 | 故障影响范围 | MTTR 参考 |
|---|---|---|---|
| 可用区(AZ) | 数据中心电力、骨干网络、冷却系统 | 整个可用区内的所有租户实例 | 分钟~小时级 |
| 机架(Rack) | ToR 交换机、机架 PDU、上联光缆 | 该机架内所有宿主机及租户 Pod | 分钟级 |
| 宿主机(Host) | 物理硬件故障、宿主机内核 Panic、磁盘损坏 | 该宿主机上所有租户容器/虚拟机 | 秒~分钟级 |
SRE 建议: 在故障域隔离演练中,应优先验证宿主机级故障的自动迁移能力,因为该层级故障发生频率最高,对租户体验影响最直接。
3.3 故障域与租户的映射关系
多租户平台需要将租户的工作负载(Pod、VM、存储卷)合理分布到不同的故障域中,避免多个租户实例集中在同一故障域内。映射策略通常分为静态分配和动态调度两种:
- 静态分配: 租户创建时指定故障域约束(如
topology.kubernetes.io/zone),调度器按约束放置。 - 动态调度: 基于实时故障域容量和租户反亲和规则,由调度器自动选择最优故障域。
以下 SVG 图展示了从可用区到宿主机三层故障域与租户实例的映射关系:
3.4 故障域映射策略对比
不同的映射策略直接影响故障隔离效果和资源利用率。以下表格对比了三种常见策略:
| 策略 | 实现方式 | 隔离强度 | 资源碎片 | 适用场景 |
|---|---|---|---|---|
| 硬亲和/反亲和 | Pod 必须/必须不调度到同一故障域 | 高 | 高 | 关键业务、金融级租户 |
| 软亲和/反亲和 | 调度器优先满足,资源不足时可降级 | 中 | 中 | 普通生产租户 |
| 无约束 | 仅按资源水位调度,不感知故障域 | 低 | 低 | 开发测试环境 |
风险提示: 在演练中如果发现租户 Pod 集中在同一宿主机或同一机架,说明故障域映射策略失效或调度器配置错误。此时应立即标记为高风险项,并触发重新调度流程。
3.5 故障域隔离的验证方法
在演练前,SRE 需要通过以下步骤验证故障域映射是否正确:
- 导出租户实例分布清单: 使用
kubectl get pods -o wide --all-namespaces获取每个 Pod 所在的节点和可用区。 - 计算故障域密度: 统计每个故障域内同一租户的实例数量,密度超过阈值(如 3 个)则告警。
- 模拟故障域失效: 在非生产环境通过
kubectl cordon或网络策略模拟宿主机/机架故障,观察租户实例是否被正确迁移。 - 复核指标面板: 检查故障域维度的租户实例分布图、故障域容量水位、以及跨故障域流量比例。
以下 SVG 图展示了故障域映射验证的流程:
3.6 故障域隔离的常见风险
- 故障域过载: 单个故障域内租户实例过多,一旦故障影响面过大。
- 映射漂移: 由于节点维护或扩缩容,租户实例逐渐偏离初始故障域约束。
- 调度器忽略约束: 资源紧张时调度器可能绕过反亲和规则,导致租户实例聚集。
- 跨故障域流量成本: 过度分散可能导致跨 AZ 流量增加,带来延迟和费用问题。
最佳实践: 在指标面板中设置故障域密度告警(如单故障域内同一租户实例数 > 2),并定期执行故障域映射合规扫描,确保租户隔离策略持续有效。