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 图展示了故障域层级与拓扑分布约束的协同工作方式:

故障域层级与拓扑分布约束示意图 故障域层级与拓扑分布约束 地域 (Region) — topology.kubernetes.io/region 跨地域容灾,延迟较高,通常用于多活或灾备场景 可用区 A 独立电力/网络 可用区 B 独立电力/网络 可用区 C 独立电力/网络 Node 1 Node 2 Node 3 Node 4 Node 5 Node 6 Pod 分布:每个可用区 2 个 Pod,maxSkew=1 拓扑分布约束确保 Pod 在可用区之间均匀分布,避免单点故障 当某个可用区故障时,仅影响该区内的 Pod,其他区 Pod 继续提供服务

3.5 故障域在 Pod 驱逐与重调度中的应用

在 Pod 驱逐与租户重调度场景中,故障域信息用于以下关键决策:

  1. 驱逐优先级:优先驱逐故障域内冗余 Pod,保留跨域副本。
  2. 重调度目标选择:将 Pod 调度到未受影响的可用区,避免二次故障。
  3. 租户隔离:确保同一租户的 Pod 分布在多个故障域,提高容错性。
  4. 资源均衡:结合拓扑分布约束,防止重调度后 Pod 分布不均。
实战建议: 在集群中启用 PodTopologySpread 特性门控(Kubernetes v1.19+ 默认启用),并为每个租户的 Deployment 配置 topologySpreadConstraints。这可以在 Pod 驱逐和重调度过程中自动维持故障域内的均匀分布,减少人工干预。