2. Kubernetes 故障域基础:节点、可用区、区域(Region)的定义与层级关系

在构建高可用 Helm Deployment 滚动更新策略之前,必须理解 Kubernetes 集群底层的物理与逻辑故障边界。故障域(Failure Domain)定义了当某一组件失效时,受影响资源的最小范围。Kubernetes 的故障域模型从下至上分为三个层级:节点(Node)、可用区(Availability Zone, AZ)、区域(Region)。每一层级的故障相互隔离,上层依赖下层提供容错基础。

2.1 节点(Node):最小故障单元

节点是 Kubernetes 集群中的工作机器(物理机或虚拟机),是运行 Pod 的最小计算单元。一个节点故障通常由硬件损坏、操作系统崩溃、内核 Panic、网络中断或 kubelet 失联引起。

  • 故障影响范围:仅该节点上的 Pod 不可用,其他节点不受影响。
  • Kubernetes 抽象:通过 Node 对象管理,kubelet 定期上报心跳;若心跳超时(默认 40s),Controller Manager 标记节点为 NotReady,并触发 Pod 驱逐。
  • 滚动更新中的意义:单节点故障不应中断更新流程。Helm 应配置 podAntiAffinity 确保同一 Deployment 的 Pod 分布在不同节点上。
关键指标:节点故障恢复时间(MTTR)通常由云厂商或运维团队控制,建议控制在 5 分钟以内,避免影响滚动更新的 maxUnavailable 预算。

2.2 可用区(Availability Zone):独立基础设施单元

可用区是同一区域内一个或多个数据中心的集合,拥有独立的电力、冷却和网络。可用区之间通过低延迟(通常 < 2ms)光纤互联,但故障完全隔离:一个可用区的电力中断不会扩散到另一个可用区。

特性 节点级 可用区级
故障范围 单台机器 整个数据中心集群
网络延迟 < 0.1ms < 2ms(同区域)
K8s 标签 kubernetes.io/hostname topology.kubernetes.io/zone
滚动更新策略 PodAntiAffinity 分散 topologySpreadConstraints 跨 AZ 分布

在 Helm Chart 中,通过 topologySpreadConstraints 实现跨可用区分布:

topologySpreadConstraints:
  - maxSkew: 1
    topologyKey: topology.kubernetes.io/zone
    whenUnsatisfiable: DoNotSchedule
    labelSelector:
      matchLabels:
        app: my-app
常见陷阱:部分云厂商(如 AWS)的可用区名称(us-east-1a、us-east-1b)在不同账号下可能映射到不同的物理可用区。务必使用 topology.kubernetes.io/zone 标签,而非硬编码名称。

2.3 区域(Region):地理隔离边界

区域是地理上独立的完整云服务区域,由多个可用区组成。区域之间通过公共互联网或专用骨干网连接,延迟通常在 10-100ms 级别。区域故障极为罕见(如大规模地震、政治事件),但一旦发生,整个区域的所有服务均不可用。

  • 故障隔离:区域间完全独立,无共享控制面或数据面。
  • Kubernetes 多集群:跨区域部署通常需要多个独立集群,通过 Global Load Balancer 或 Service Mesh 进行流量调度。
  • Helm 部署策略:跨区域场景下,Helm 本身不直接管理区域级故障;需结合 GitOps(ArgoCD)或 Cluster API 实现多集群同步。

2.4 故障域层级关系图

下图展示了从节点到区域的完整故障域层级,以及每个层级对应的 Kubernetes 拓扑标签和故障隔离特性:

Kubernetes 故障域层级关系 区域(Region) 地理隔离边界,完全独立控制面 标签:无(跨集群) 故障影响:整个区域服务不可用 可用区 A(AZ-A) 独立电力/冷却/网络 标签:topology.kubernetes.io/zone 故障影响:该 AZ 内所有节点 可用区 B(AZ-B) 独立电力/冷却/网络 标签:topology.kubernetes.io/zone 故障影响:该 AZ 内所有节点 节点 1 hostname: node-1 节点 2 hostname: node-2 节点 3 hostname: node-3 节点 4 hostname: node-4 说明:节点故障仅影响单机;可用区故障影响该区所有节点;区域故障影响整个集群。 滚动更新策略应逐层设置 PodAntiAffinity(节点)→ topologySpreadConstraints(可用区)→ 多集群(区域)。

2.5 故障域在 Helm 滚动更新中的映射

理解故障域层级后,可以将其直接映射到 Helm Deployment 的滚动更新配置中:

故障域层级 K8s 原生机制 Helm values 配置示例 滚动更新保护目标
节点 podAntiAffinity affinity.podAntiAffinity.requiredDuringScheduling 单节点故障不中断更新
可用区 topologySpreadConstraints topologyKey: topology.kubernetes.io/zone AZ 故障时仍有 Pod 提供服务
区域 多集群 + Global Load Balancer ArgoCD ApplicationSet + Helm 区域灾难时流量切换
设计原则:Helm Chart 应默认提供节点级和可用区级的故障域配置模板,并通过 .Values.global.topologySpread 开关控制是否启用。区域级故障域通常由基础设施层解决,Chart 本身不强制实现。