3. 故障域基础概念:节点故障域定义、可用区、地域与拓扑分布约束
在多租户 Kubernetes 集群中,故障域(Fault Domain)是定义基础设施故障隔离边界的基础概念。理解故障域是设计高可用 Pod 驱逐与租户重调度策略的前提。本节将系统性地介绍节点故障域的定义、云厂商的可用区与地域模型,以及 Kubernetes 原生的拓扑分布约束机制。
3.1 节点故障域定义
故障域是指一组共享单一故障点的物理或逻辑资源集合。当该故障点失效时,集合内的所有资源都会受到影响。在 Kubernetes 中,节点故障域通常通过标签(Label)来标识,常见的故障域层级包括:
- 节点(Node):单台物理机或虚拟机,故障域最小单元。
- 机架(Rack):共享电源、网络交换机的节点组。
- 可用区(Availability Zone, AZ):独立电力、冷却和网络的物理区域。
- 地域(Region):由多个可用区组成的较大地理区域。
最佳实践: 在集群初始化时,应为每个节点打上完整的故障域标签,例如
topology.kubernetes.io/zone 和 topology.kubernetes.io/region。这为后续的 Pod 调度和驱逐策略提供了基础数据。
3.2 可用区(Availability Zone)与地域(Region)
可用区和地域是云原生环境中最核心的故障域概念。下表对比了二者的关键差异:
| 维度 | 可用区(AZ) | 地域(Region) |
|---|---|---|
| 隔离级别 | 物理隔离(独立电力、冷却、网络) | 地理隔离(跨城市/国家) |
| 延迟 | 低延迟(通常 < 2ms) | 较高延迟(通常 10-100ms) |
| 故障影响范围 | 单个 AZ 故障不影响其他 AZ | 单个 Region 故障不影响其他 Region |
| Kubernetes 标签 | topology.kubernetes.io/zone |
topology.kubernetes.io/region |
| 典型用途 | 跨 AZ 部署实现高可用 | 跨 Region 部署实现容灾 |
注意: 在自建机房或边缘场景中,可用区和地域的概念可能被替换为“机架”和“数据中心”。无论命名如何,核心原则不变:故障域层级越高,隔离性越强,但跨域通信代价也越大。
3.3 拓扑分布约束(TopologySpreadConstraints)
拓扑分布约束是 Kubernetes 内置的调度机制,用于控制 Pod 在故障域之间的分布均匀性。它通过 spec.topologySpreadConstraints 字段定义,确保租户的 Pod 不会集中部署在同一个故障域内。
以下是一个典型的拓扑分布约束配置示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: tenant-app
spec:
replicas: 6
template:
spec:
topologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app: tenant-app
关键参数说明:
- maxSkew:允许的最大 Pod 分布偏差。值为 1 表示每个可用区之间的 Pod 数量差不超过 1。
- topologyKey:指定故障域标签键,如
topology.kubernetes.io/zone。 - whenUnsatisfiable:约束不满足时的行为,可选
DoNotSchedule(不调度)或ScheduleAnyway(尽量调度)。 - labelSelector:用于匹配需要约束的 Pod 集合。
多租户场景提示: 在租户重调度时,拓扑分布约束可以防止驱逐后的 Pod 全部涌入同一个可用区,避免造成新的单点故障。建议为每个租户的 Deployment 设置独立的拓扑分布约束。
3.4 故障域与拓扑分布约束的关系
下面的 SVG 图展示了故障域层级与拓扑分布约束的协同工作方式:
3.5 故障域在 Pod 驱逐与重调度中的应用
在 Pod 驱逐与租户重调度场景中,故障域信息用于以下关键决策:
- 驱逐优先级:优先驱逐故障域内冗余 Pod,保留跨域副本。
- 重调度目标选择:将 Pod 调度到未受影响的可用区,避免二次故障。
- 租户隔离:确保同一租户的 Pod 分布在多个故障域,提高容错性。
- 资源均衡:结合拓扑分布约束,防止重调度后 Pod 分布不均。
实战建议: 在集群中启用
PodTopologySpread 特性门控(Kubernetes v1.19+ 默认启用),并为每个租户的 Deployment 配置 topologySpreadConstraints。这可以在 Pod 驱逐和重调度过程中自动维持故障域内的均匀分布,减少人工干预。