3. 故障域概念:故障域(Failure Domain)定义
故障域(Failure Domain)是分布式系统与云原生架构中描述故障传播边界的核心抽象。它定义了一组共享同一故障风险源的资源集合——当该风险源失效时,集合内的所有资源将同时或级联失去可用性。在 Kubernetes 与微服务架构中,正确识别与划分故障域是设计高可用、弹性系统的前提。
核心原则:故障域是“共因失效”的边界。同一故障域内的资源共享相同的电源、网络交换机、物理机架、可用区或集群控制面;跨故障域的资源则具备独立的失效概率。
3.1 故障域的三层模型
在生产环境中,故障域通常按物理与逻辑层级划分为三个层次:节点故障域、可用区故障域、集群故障域。每一层对应不同的故障半径与恢复策略。
| 故障域层级 | 故障范围 | 典型失效场景 | 恢复手段 |
|---|---|---|---|
| 节点故障域 | 单台物理机/虚拟机 | 硬件故障、内核 Panic、OOM、磁盘损坏 | Pod 自动迁移至其他节点(kubelet 健康检查 + 控制器) |
| 可用区故障域 | 单个数据中心可用区(AZ) | 机架断电、TOR 交换机故障、区域网络抖动 | 跨 AZ 调度 + 反亲和性规则 + 负载均衡故障转移 |
| 集群故障域 | 整个 Kubernetes 集群 | 控制面崩溃、etcd 集群脑裂、API Server 不可用 | 多集群联邦、备份恢复、异地容灾切换 |
实践提示:在 CrashLoop 场景中,节点故障域是最常见的根因定位起点。但若 CrashLoop 模式在多个节点上同时出现,则需立即将排查范围提升至可用区或集群故障域。
3.2 节点故障域(Node Failure Domain)
节点故障域是最小粒度的故障隔离单元。在 Kubernetes 中,一个节点(Node)对应一台物理机或虚拟机,承载多个 Pod。节点故障域内的所有 Pod 共享该节点的内核、kubelet 进程、容器运行时、本地存储与网络栈。
- 故障特征:节点宕机、kubelet 失联、节点 NotReady 状态、本地磁盘 I/O 挂起。
- CrashLoop 关联:若 Pod 因节点级资源争抢(如 CPU 节流、内存 OOM)而反复重启,则 CrashLoop 的根因在节点故障域内。
- 划分方法:通过
kubernetes.io/hostname标签或topology.kubernetes.io/zone区分不同节点。
# 查看节点故障域标签
kubectl get nodes --show-labels | grep -E "kubernetes.io/hostname|topology.kubernetes.io/zone"
3.3 可用区故障域(Availability Zone Failure Domain)
可用区(AZ)是云提供商或自建数据中心内独立的物理区域,拥有独立的电力、冷却和网络基础设施。可用区故障域包含多个节点,这些节点共享同一组基础设施风险源。
- 故障特征:整个 AZ 网络延迟升高、AZ 级电源中断、区域负载均衡器失效。
- CrashLoop 关联:当 CrashLoop 模式在同一个 AZ 内的多个节点上同时出现时,应怀疑 AZ 级故障(如区域 DNS 解析失败、共享存储挂载点异常)。
- 划分方法:使用
topology.kubernetes.io/zone标签标识,Pod 反亲和性规则中指定topologyKey: topology.kubernetes.io/zone。
常见误区:不要将“节点故障域”与“可用区故障域”混为一谈。节点故障域是单点失效,可用区故障域是区域共因失效。在 CrashLoop 排查中,若单节点出现 CrashLoop 则优先查节点;若跨节点同 AZ 出现 CrashLoop,则必须查 AZ 基础设施。
3.4 集群故障域(Cluster Failure Domain)
集群故障域是整个 Kubernetes 集群的失效边界。当集群控制面(API Server、Controller Manager、Scheduler、etcd)出现不可恢复的故障时,集群内所有工作负载将失去调度与自愈能力。
- 故障特征:API Server 不可达、etcd 集群仲裁丢失、所有节点同时失联、集群证书过期。
- CrashLoop 关联:集群故障域通常不会直接导致 Pod CrashLoop,但会阻止 CrashLoop 的自动恢复(如 Deployment 控制器无法创建新 Pod)。
- 划分方法:通过集群名称、集群 ID 或联邦集群中的
cluster标签区分。多集群部署时,每个集群是一个独立的故障域。
3.5 故障域层次结构(SVG)
下图展示了从节点到集群的三层故障域层次结构,以及 CrashLoop 场景中故障传播的典型路径。
3.6 故障域划分的工程意义
在 CrashLoop 场景的资源模型优化中,故障域划分直接决定以下三个关键决策:
- Pod 调度策略:通过
podAntiAffinity将同一工作负载的副本分散到不同节点故障域和可用区故障域,避免单点或单 AZ 故障导致全部副本 CrashLoop。 - 资源预留与限流:在节点故障域内设置合理的
requests与limits,防止资源争抢引发级联 CrashLoop。 - 监控与告警阈值:按故障域层级设置告警——单节点 CrashLoop 触发 P2 告警,跨节点同 AZ CrashLoop 触发 P1 告警,集群级故障触发 P0 告警。
关键结论:故障域划分不是理论概念,而是 CrashLoop 排查与资源模型优化的第一性原理。每一次 CrashLoop 事件,都应先定位其所属的故障域层级,再选择对应的恢复策略。