2. Kubernetes 节点滚动升级基础:节点池概念、滚动升级策略、升级流程与状态

在深入 Policy as Code 的差异化准入实现之前,必须首先理解 Kubernetes 节点滚动升级的核心基础。本章将围绕节点池(Node Pool)的概念、滚动升级策略的配置、升级流程的完整阶段以及节点状态转换展开,为后续策略注入点分析奠定基础。

2.1 节点池概念与作用

节点池是集群中一组具有相同配置(如实例类型、操作系统、标签、污点)的节点集合。在托管 Kubernetes 环境(如 AKS、EKS、GKE)中,节点池是管理节点生命周期的最小单元。

特性 说明
同质化 同一节点池内的节点共享相同的虚拟机规格、系统镜像、数据盘配置
独立扩缩 每个节点池可独立设置最小/最大节点数,支持手动或自动扩缩容
升级隔离 滚动升级仅影响目标节点池内的节点,不干扰其他池的工作负载
标签继承 节点池定义的标签和污点会自动传播到池内所有节点
实践要点:建议将不同工作负载类型(如在线服务、批处理任务、有状态应用)分配到独立的节点池,以便在滚动升级时实现差异化策略控制。

2.2 滚动升级策略参数

滚动升级策略通过 upgradeStrategy 字段定义,控制节点替换的速率和容错边界。以下为典型参数及其含义:

参数 默认值 作用描述
maxSurge 1 升级过程中允许超出目标节点数的最大额外节点数(值或百分比)
maxUnavailable 0 升级过程中允许同时不可用的最大节点数(值或百分比)
drainTimeout 5m 节点排水(drain)操作的最大等待时间,超时后标记为失败
nodeStartupTimeout 10m 新节点从创建到就绪的最大等待时间
# 节点池滚动升级策略配置示例(AKS 节点池)
apiVersion: management.azure.com/v1
kind: AgentPool
spec:
  upgradeSettings:
    maxSurge: "33%"
    maxUnavailable: "10%"
    drainTimeoutInMinutes: 10
    nodeStartupTimeoutInMinutes: 15

2.3 升级流程与阶段状态

一次完整的节点滚动升级包含以下五个阶段,每个阶段对应明确的集群状态转换:

  1. 准备阶段(Preparing):验证节点池配置、镜像版本、配额是否充足;锁定节点池防止并发操作。
  2. 排水阶段(Draining):对旧节点执行 kubectl drain,驱逐 Pod 并设置 node.kubernetes.io/unschedulable:NoSchedule 污点。
  3. 替换阶段(Replacing):创建新节点(基于新镜像),等待节点注册并变为 Ready 状态。
  4. 就绪阶段(Readying):新节点通过健康检查后,调度器允许 Pod 调度到新节点。
  5. 清理阶段(Cleaning):删除旧节点,释放底层资源,更新节点池状态为 Succeeded。
关键状态转换:节点在升级过程中会经历 Ready → Unschedulable → Draining → Deleted 的完整生命周期。新节点则从 Pending → NotReady → Ready 过渡。
节点滚动升级流程状态机 Preparing Draining Replacing Readying Cleaning 说明 每个阶段都可能因超时或错误进入 Failed 状态,触发回滚或人工介入

2.4 节点状态转换与监控指标

在滚动升级过程中,单个节点的状态转换是判断升级健康度的关键。以下为节点状态转换矩阵:

当前状态 触发事件 下一状态 说明
Ready 升级开始 Unschedulable 节点被标记为不可调度,停止接收新 Pod
Unschedulable 排水完成 Draining 开始驱逐已有 Pod
Draining Pod 驱逐完毕 Deleted 节点从集群中移除
Pending 新节点创建 NotReady 节点注册但未通过健康检查
NotReady kubelet 就绪 Ready 节点可正常调度
注意:如果节点排水超时(drainTimeout),升级流程不会自动终止,而是跳过该节点继续处理下一个。这可能导致部分旧节点残留,需要后续手动清理或通过策略强制终止。
节点状态转换图(升级上下文) Ready Unschedulable Draining Deleted Pending NotReady Ready 旧节点:Ready → Unschedulable → Draining → Deleted 新节点:Pending → NotReady → Ready

2.5 升级过程中的关键风险点

  • Pod 中断预算(PDB)冲突:如果节点排水导致可用副本数低于 PDB 阈值,排水操作会阻塞,升级卡在 Draining 阶段。
  • 节点启动超时:新节点因镜像拉取慢、初始化脚本失败等原因未在 nodeStartupTimeout 内就绪,升级标记为部分失败。
  • 存储卷挂载残留:旧节点删除时,如果存在未卸载的 PersistentVolume,可能导致卷挂载点残留,影响新节点挂载。
  • 网络策略不一致:新节点加入后,网络插件(如 Calico、Cilium)可能需要重新同步策略规则,造成短暂网络中断。
策略注入时机:上述风险点正是 Policy as Code 的差异化准入切入点。例如,在 Draining 阶段前注入 PDB 合规检查策略,在 Replacing 阶段注入节点标签一致性校验策略。