1. 故障域基础:定义与划分原则
故障域(Failure Domain)是系统架构中一个共享单点故障风险的资源集合。当集合内任意组件失效,集合内所有资源都会受到影响;而不同故障域之间则具备故障隔离能力。在 Kubernetes 和云原生架构中,正确划分故障域是设计高可用系统、制定排错策略的基石。
1.1 物理故障域:硬件与基础设施边界
物理故障域由数据中心、机架、电源、网络交换机的物理拓扑决定。常见的物理故障域层级包括:
| 层级 | 故障范围 | 典型失效场景 | Kubernetes 映射 |
|---|---|---|---|
| 可用区(AZ) | 独立数据中心或电力区域 | 区域断电、光缆中断 | topology.kubernetes.io/zone |
| 机架(Rack) | 共享 PDU 与 ToR 交换机 | 交换机故障、电源跳闸 | topology.kubernetes.io/rack(自定义) |
| 节点(Node) | 单台物理机或虚拟机 | 内核崩溃、磁盘损坏 | kubernetes.io/hostname |
关键原则:物理故障域之间必须通过独立的网络、电源和冷却系统实现物理隔离。同一可用区内的机架共享同一电力回路,因此可用区是云原生架构中最基本的物理故障隔离单元。
1.2 逻辑故障域:软件与业务边界
逻辑故障域通过软件抽象层定义,不依赖物理拓扑。Kubernetes 原生提供的逻辑故障域包括:
- 命名空间(Namespace):资源隔离边界,同一命名空间内的 Pod、Service、ConfigMap 共享网络策略和 RBAC 权限。命名空间故障不会影响其他命名空间。
- 服务(Service):通过标签选择器聚合 Pod,服务级别的故障(如 DNS 解析失败)仅影响该服务的客户端。
- 工作负载(Deployment / StatefulSet):Pod 副本集,单个 Pod 崩溃由 ReplicaSet 自动修复,属于工作负载内部的故障自愈域。
- 集群(Cluster):控制平面(etcd、API Server)是整个集群的故障域,etcd 集群失效会导致整个集群不可用。
排错启示:当使用
kubectl debug 排查问题时,首先判断故障是物理域(节点宕机、网络分区)还是逻辑域(命名空间配额不足、Service 选择器错误)。物理域故障通常需要跨可用区迁移,逻辑域故障则优先检查配置与 RBAC。
1.3 物理域与逻辑域的映射关系
下图展示了物理故障域与逻辑故障域在 Kubernetes 集群中的分层对应关系:
常见误区:不要将命名空间等同于物理故障域。即使两个 Pod 位于不同命名空间,如果它们被调度到同一节点,该节点宕机时两个命名空间的服务会同时中断。逻辑隔离 ≠ 物理隔离。
1.4 划分原则与排错决策树
在架构设计中,故障域划分遵循以下原则:
- 最小共享原则:每个故障域内共享的组件越少,爆炸半径越小。例如,每个可用区应有独立的 etcd 成员和 API Server 实例。
- 正交性原则:物理故障域与逻辑故障域应尽量正交。将关键服务的 Pod 通过
podAntiAffinity分散到不同节点和可用区。 - 可观测性原则:每个故障域边界必须暴露可观测性指标(如可用区级别的请求成功率、P99 延迟),否则无法快速定位故障域。
基于故障域划分的排错决策树:
实战建议:在集群初始化时,通过
kubectl label nodes 为每个节点打上 topology.kubernetes.io/zone 和 topology.kubernetes.io/rack 标签。后续使用 kubectl debug node/<node-name> 时,可以快速确认该节点所属的物理故障域,从而判断故障是否跨域传播。