3. 故障域概念详解:物理故障域与逻辑故障域

故障域(Failure Domain)是分布式系统与云原生架构中的核心抽象概念,它定义了当某一组件或基础设施单元发生故障时,受影响的资源范围。在 Kubernetes 集群设计与 Deployment 编排中,正确识别并利用故障域是实现高可用与弹性调度的前提。

故障域按性质可分为物理故障域与逻辑故障域两大类。物理故障域由硬件与基础设施的物理边界决定,逻辑故障域则由软件抽象与集群管理边界定义。下表从多个维度对比两类故障域的核心差异:

对比维度 物理故障域 逻辑故障域
定义基础 硬件、电力、网络、机房设施 软件抽象、进程边界、集群管理单元
典型粒度 机架 → 可用区 → 区域 节点 → 集群 → 联邦集群
故障影响范围 物理设备级联失效 进程/控制面/网络策略隔离
Kubernetes 原生支持 topology.kubernetes.io/zone, region nodeName, kubernetes.io/hostname
调度约束方式 PodTopologySpread, nodeAffinity nodeSelector, taint/toleration
故障恢复难度 高(需物理修复或迁移) 中(可快速重建或重调度)

3.1 物理故障域

物理故障域以基础设施的物理边界为划分依据,故障通常由硬件损坏、电力中断、网络割接或自然灾害引发。在 Kubernetes 集群中,物理故障域自上而下分为三个层级:机架(Rack)、可用区(Availability Zone, AZ)、区域(Region)。

3.1.1 机架(Rack)

机架是物理故障域的最小单元。同一机架内的服务器共享电源分配单元(PDU)、架顶交换机(ToR)和冷却系统。当 PDU 跳闸、ToR 交换机故障或机架级网络链路中断时,该机架内的所有节点将同时失联。

  • 共享风险组:同一机架内的节点属于同一个共享风险组(Shared Risk Group, SRG)。
  • Kubernetes 标签:通常使用 topology.kubernetes.io/rack 或自定义标签标识机架拓扑。
  • 调度策略:通过 PodTopologySpread 的 topologyKey 设置为机架标签,确保 Pod 副本分布在不同机架。
最佳实践:在自建机房或裸金属集群中,务必为每个节点打上机架标签。云环境通常由云厂商自动注入机架拓扑信息,但部分场景仍需手动确认。

3.1.2 可用区(Availability Zone, AZ)

可用区是同一区域内独立的物理数据中心或数据中心子单元。每个可用区拥有独立的电力、网络和冷却系统,可用区之间通过低延迟光纤互联。可用区故障通常由区域级电力事故、火灾或大规模网络中断引起。

  • 隔离级别:可用区之间物理隔离,故障不会跨区传播。
  • Kubernetes 标签:topology.kubernetes.io/zone。
  • 调度约束:使用 nodeAffinity 的 requiredDuringSchedulingIgnoredDuringExecution 将关键工作负载固定到特定可用区,或使用 PodTopologySpread 实现跨可用区均匀分布。
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
spec:
  replicas: 6
  template:
    spec:
      topologySpreadConstraints:
        - maxSkew: 1
          topologyKey: topology.kubernetes.io/zone
          whenUnsatisfiable: DoNotSchedule
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchLabels:
                  app: web
              topologyKey: topology.kubernetes.io/zone

3.1.3 区域(Region)

区域是物理故障域的最高层级,由多个可用区组成。区域之间地理距离通常超过数百公里,通过公网或专线互联。区域级故障极为罕见,但一旦发生(如大地震、区域电网瘫痪),整个区域内的所有可用区都将不可用。

  • 跨区域容灾:需要多集群部署,配合全局负载均衡(GSLB)或 DNS 故障切换。
  • Kubernetes 标签:topology.kubernetes.io/region。
  • 限制:单个 Kubernetes 集群通常无法跨区域管理,因为控制面延迟和网络分区风险过高。
注意:跨区域部署时,Pod 间网络延迟可能超过 10ms,且数据同步需考虑最终一致性。不要将强一致性有状态工作负载直接跨区域部署,除非使用专门的跨区域同步方案。
物理故障域层级结构 区域(Region) 地理隔离 > 100km | 独立电力/网络基础设施 | 跨区域容灾需多集群 标签:topology.kubernetes.io/region 可用区 A 独立数据中心 标签:zone 可用区 B 独立数据中心 标签:zone 可用区 C 独立数据中心 标签:zone 机架 1 PDU/ToR 标签:rack 机架 2 PDU/ToR 标签:rack 机架 3 PDU/ToR 标签:rack 机架 4 PDU/ToR 标签:rack 机架 5 PDU/ToR 标签:rack 机架 6 PDU/ToR 标签:rack

3.2 逻辑故障域

逻辑故障域以软件抽象和管理边界为划分依据,故障通常由进程崩溃、配置错误、控制面组件异常或资源耗尽引发。在 Kubernetes 中,逻辑故障域主要包含节点(Node)和集群(Cluster)两个层级。

3.2.1 节点(Node)

节点是 Kubernetes 集群中最小的逻辑故障域。一个节点对应一台物理机或虚拟机,运行着 kubelet、容器运行时和若干 Pod。节点故障可能由操作系统内核崩溃、kubelet 失联、磁盘满、内存耗尽或网络插件异常引起。

  • 故障检测:kube-controller-manager 中的 node-lifecycle-controller 通过 NodeLease 和节点状态更新检测节点失联,默认超时时间为 40 秒。
  • Pod 驱逐:节点被标记为 NotReady 超过 pod-eviction-timeout(默认 5 分钟)后,控制面将驱逐该节点上的 Pod。
  • 调度约束:使用 nodeName 或 nodeSelector 将 Pod 绑定到特定节点,但会降低故障域隔离效果。
关键指标:节点故障恢复时间(Node Recovery Time)应控制在 2 分钟以内,否则可能触发大规模 Pod 重调度,造成控制面压力。

3.2.2 集群(Cluster)

集群是最高层级的逻辑故障域。一个 Kubernetes 集群包含控制面节点和工作节点,以及 etcd、API Server、Scheduler、Controller Manager 等核心组件。集群故障通常由控制面组件崩溃、etcd 集群脑裂、证书过期或网络策略配置错误引起。

  • 故障影响范围:整个集群内的所有工作负载均受影响。
  • 跨集群容灾:通过多集群管理工具(如 Karmada、Federation v2)实现跨集群 Deployment 分发。
  • 黄金路径边界:Deployment 的故障域隔离策略应在集群边界内设计,跨集群场景需引入额外的服务网格或全局负载均衡。
逻辑故障域:节点与集群 集群 A(逻辑故障域) 控制面(API Server / etcd / Scheduler) 节点 1 Pod-A-1 Pod-B-1 节点 2 Pod-A-2 Pod-B-2 节点 3 Pod-A-3 Pod-C-1 节点 4 Pod-B-3 Pod-C-2 集群 B(逻辑故障域) 控制面(API Server / etcd / Scheduler) 节点 5 Pod-A-4 Pod-D-1 节点 6 Pod-A-5 Pod-D-2 节点 7 Pod-A-6 Pod-E-1 节点 8 Pod-D-3 Pod-E-2 Pod-A 跨集群分布(6 副本),Pod-B/C 在集群 A 内跨节点分布,Pod-D/E 在集群 B 内跨节点分布

3.3 物理故障域与逻辑故障域的映射关系

在实际生产环境中,物理故障域与逻辑故障域并非孤立存在,而是形成多层嵌套的映射关系。一个 Kubernetes 节点必然运行在某个机架、可用区和区域内;一个集群则可能跨多个可用区,但通常不跨区域。

下表总结了常见的映射组合及其对 Deployment 故障域隔离策略的影响:

映射组合 典型场景 故障域隔离策略 风险提示
单集群 × 单可用区 开发/测试环境 仅节点级反亲和 可用区故障导致集群完全不可用
单集群 × 多可用区 生产环境(标准高可用) PodTopologySpread + 节点反亲和 控制面需跨可用区部署,etcd 延迟增加
多集群 × 单可用区 多团队隔离/合规要求 集群级故障域隔离 + 服务网格 跨集群流量调度复杂度高
多集群 × 多可用区 × 多区域 全球级容灾部署 联邦集群 + 全局负载均衡 运维成本极高,需自动化编排

3.4 故障域隔离的黄金路径原则

基于上述故障域概念,在 Deployment 设计中应遵循以下黄金路径原则:

  1. 最小故障域原则:始终将 Pod 副本分布到至少两个不同的最小故障域(节点或机架)中。
  2. 层级递进原则:从节点 → 可用区 → 区域逐层扩大故障域范围,每层至少保证 N+1 冗余。
  3. 拓扑约束优先原则:优先使用 PodTopologySpread 而非硬亲和/反亲和,保持调度灵活性。
  4. 控制面与工作负载分离原则:控制面组件应分布在更高级别的故障域中,避免与工作负载共享同一故障域。
  5. 可观测性原则:为每个故障域层级打上明确的拓扑标签,便于故障定位和调度策略验证。
验证命令:使用 kubectl get pods -o wide --all-namespaces | sort -k7 查看 Pod 分布情况,结合 kubectl describe node 确认节点拓扑标签是否完整。