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 拓扑标签和故障隔离特性:
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 本身不强制实现。