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 集群中的分层对应关系:

物理故障域与逻辑故障域分层映射 物理故障域 可用区 A 可用区 B 可用区 C 逻辑故障域 命名空间:prod Service: api-gateway Deployment: user-svc ConfigMap: app-config 命名空间:staging Service: api-gateway Deployment: user-svc ConfigMap: app-config 命名空间:monitoring Service: prometheus DaemonSet: node-exporter ConfigMap: alert-rules
常见误区:不要将命名空间等同于物理故障域。即使两个 Pod 位于不同命名空间,如果它们被调度到同一节点,该节点宕机时两个命名空间的服务会同时中断。逻辑隔离 ≠ 物理隔离。

1.4 划分原则与排错决策树

在架构设计中,故障域划分遵循以下原则:

  1. 最小共享原则:每个故障域内共享的组件越少,爆炸半径越小。例如,每个可用区应有独立的 etcd 成员和 API Server 实例。
  2. 正交性原则:物理故障域与逻辑故障域应尽量正交。将关键服务的 Pod 通过 podAntiAffinity 分散到不同节点和可用区。
  3. 可观测性原则:每个故障域边界必须暴露可观测性指标(如可用区级别的请求成功率、P99 延迟),否则无法快速定位故障域。

基于故障域划分的排错决策树:

基于故障域的排错决策树 服务不可用 物理故障域? 检查节点状态 kubectl get nodes -o wide 查看可用区分布 逻辑故障域? 检查命名空间与服务 kubectl get svc -n <ns> 查看 Endpoint 与 Pod 状态
实战建议:在集群初始化时,通过 kubectl label nodes 为每个节点打上 topology.kubernetes.io/zone 和 topology.kubernetes.io/rack 标签。后续使用 kubectl debug node/<node-name> 时,可以快速确认该节点所属的物理故障域,从而判断故障是否跨域传播。