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 集群通常无法跨区域管理,因为控制面延迟和网络分区风险过高。
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 绑定到特定节点,但会降低故障域隔离效果。
3.2.2 集群(Cluster)
集群是最高层级的逻辑故障域。一个 Kubernetes 集群包含控制面节点和工作节点,以及 etcd、API Server、Scheduler、Controller Manager 等核心组件。集群故障通常由控制面组件崩溃、etcd 集群脑裂、证书过期或网络策略配置错误引起。
- 故障影响范围:整个集群内的所有工作负载均受影响。
- 跨集群容灾:通过多集群管理工具(如 Karmada、Federation v2)实现跨集群 Deployment 分发。
- 黄金路径边界:Deployment 的故障域隔离策略应在集群边界内设计,跨集群场景需引入额外的服务网格或全局负载均衡。
3.3 物理故障域与逻辑故障域的映射关系
在实际生产环境中,物理故障域与逻辑故障域并非孤立存在,而是形成多层嵌套的映射关系。一个 Kubernetes 节点必然运行在某个机架、可用区和区域内;一个集群则可能跨多个可用区,但通常不跨区域。
下表总结了常见的映射组合及其对 Deployment 故障域隔离策略的影响:
| 映射组合 | 典型场景 | 故障域隔离策略 | 风险提示 |
|---|---|---|---|
| 单集群 × 单可用区 | 开发/测试环境 | 仅节点级反亲和 | 可用区故障导致集群完全不可用 |
| 单集群 × 多可用区 | 生产环境(标准高可用) | PodTopologySpread + 节点反亲和 | 控制面需跨可用区部署,etcd 延迟增加 |
| 多集群 × 单可用区 | 多团队隔离/合规要求 | 集群级故障域隔离 + 服务网格 | 跨集群流量调度复杂度高 |
| 多集群 × 多可用区 × 多区域 | 全球级容灾部署 | 联邦集群 + 全局负载均衡 | 运维成本极高,需自动化编排 |
3.4 故障域隔离的黄金路径原则
基于上述故障域概念,在 Deployment 设计中应遵循以下黄金路径原则:
- 最小故障域原则:始终将 Pod 副本分布到至少两个不同的最小故障域(节点或机架)中。
- 层级递进原则:从节点 → 可用区 → 区域逐层扩大故障域范围,每层至少保证 N+1 冗余。
- 拓扑约束优先原则:优先使用
PodTopologySpread而非硬亲和/反亲和,保持调度灵活性。 - 控制面与工作负载分离原则:控制面组件应分布在更高级别的故障域中,避免与工作负载共享同一故障域。
- 可观测性原则:为每个故障域层级打上明确的拓扑标签,便于故障定位和调度策略验证。
kubectl get pods -o wide --all-namespaces | sort -k7 查看 Pod 分布情况,结合 kubectl describe node 确认节点拓扑标签是否完整。