2. K8s 升级基础:节点升级的常见策略及其资源占用模型

在容量规划视角下,理解不同升级策略的资源占用模型是成本优化的前提。K8s 节点升级本质上是将集群中的工作负载从旧节点迁移至新节点(或原地替换),这一过程会临时占用额外的计算、内存和网络资源。本节将剖析三种主流策略:原地升级、滚动升级和蓝绿部署,并建立各自的资源占用数学模型。

2.1 原地升级(In-Place Upgrade)

原地升级直接对节点操作系统或 kubelet 组件进行原地更新,Pod 在节点上被驱逐并重新调度。该策略资源占用最小,但风险最高。

  • 操作流程:节点标记为不可调度(cordon)→ 驱逐 Pod(drain)→ 升级节点组件 → 节点重新加入集群。
  • 资源占用模型:仅需为被驱逐的 Pod 在集群其他节点上提供等价资源。假设节点容量为 \(C\),已用资源为 \(U\),则临时资源需求为 \(U\)(需集群剩余资源 ≥ \(U\))。
  • 适用场景:测试环境、单节点集群、对中断容忍度高的批处理任务。
容量规划警示:原地升级期间,若集群剩余资源不足 \(U\),Pod 将处于 Pending 状态,导致服务降级。务必在升级前通过 kubectl describe node 确认集群资源余量。
原地升级资源占用模型 节点 A(升级前) 已用资源 U 容量 C 驱逐 Pod 集群剩余资源 需 ≥ U 临时占用 U 升级完成 节点 A(升级后) Pod 重新调度 资源释放 关键指标 • 临时资源需求 = 节点已用资源 U(需集群剩余资源 ≥ U) • 无额外节点开销,资源利用率最高,但中断风险最大

2.2 滚动升级(Rolling Upgrade)

滚动升级是生产环境最常用的策略。它逐个(或逐批)替换节点,确保集群始终有一定数量的可用节点。该策略在资源占用和风险之间取得平衡。

  • 操作流程:逐个节点 cordon → drain → 升级 → 恢复调度 → 处理下一个节点。
  • 资源占用模型:设节点数为 \(N\),每批升级节点数为 \(B\)(通常 \(B=1\)),节点平均已用资源为 \(U_{avg}\)。则临时资源需求为 \(B \times U_{avg}\),且集群需保持至少 \(N - B\) 个节点可用。
  • 关键参数:maxUnavailable(最大不可用节点数)和 maxSurge(最大额外节点数)直接影响资源占用。
容量规划公式:滚动升级期间,集群总资源需求 = 正常负载资源 + \(B \times U_{avg}\)(临时缓冲)。若 maxSurge > 0,还需额外预留 maxSurge 个节点的资源。
滚动升级资源占用模型(B=1) 阶段 1:升级前 节点 1(运行中) 节点 2(运行中) 节点 3(运行中) 资源占用:3 × U_avg 开始升级 阶段 2:升级中 节点 1(升级中) 节点 2(运行中) 节点 3(运行中) 临时资源:1 × U_avg 继续 阶段 3:升级后 节点 1(已升级) 节点 2(已升级) 节点 3(已升级) 资源恢复:3 × U_avg 资源占用模型详解 • 临时资源需求 = B × U_avg(B 为每批升级节点数,通常为 1) • 集群可用节点数 = N - B(需保证服务容量不降级) • 若设置 maxSurge=1,则需额外预留 1 个节点的资源(临时扩容) • 总升级时间 = N × (单节点升级时间),资源占用呈阶梯状

2.3 蓝绿部署(Blue-Green Deployment)

蓝绿部署通过维护两套完整的节点池(蓝池和绿池),实现零中断升级。该策略资源占用最高,但风险最低。

  • 操作流程:准备绿池(新版本节点)→ 切换流量至绿池 → 销毁蓝池(旧版本节点)。
  • 资源占用模型:需要额外一整套节点池的资源。设原集群节点数为 \(N\),则临时资源需求为 \(N \times C\)(整池容量)。
  • 成本影响:升级期间资源成本翻倍,但切换时间极短(秒级)。
容量规划建议:蓝绿部署适合关键生产服务。可通过 cluster-autoscaler 临时扩容绿池,升级完成后缩容蓝池,避免长期持有双倍资源。

2.4 三种策略资源占用对比

策略 临时资源需求 中断时间 资源成本系数 适用场景
原地升级 \(U\)(节点已用资源) 分钟级(Pod 重建) 1.0x(无额外开销) 测试、批处理、容忍中断
滚动升级 \(B \times U_{avg}\)(每批资源) 秒级(Pod 迁移) 1.1x ~ 1.3x(少量缓冲) 生产环境通用
蓝绿部署 \(N \times C\)(整池容量) 秒级(流量切换) 2.0x(双倍资源) 关键生产、金融、医疗

2.5 资源占用模型的核心参数

无论采用哪种策略,以下参数直接影响临时资源预留量:

  1. 节点已用资源(U):通过 kubectl top node 或 Prometheus 监控获取。
  2. 节点容量(C):节点总资源(CPU、内存、磁盘、网络带宽)。
  3. 每批升级节点数(B):滚动升级中 maxUnavailable 的值。
  4. Pod 调度策略:PodDisruptionBudget(PDB)和反亲和性规则会影响实际可驱逐 Pod 数量。
  5. 升级窗口:业务低峰期升级可降低资源竞争风险。
容量规划检查清单:
✅ 确认集群剩余资源 ≥ 临时资源需求
✅ 设置合理的 PDB(如 minAvailable: 2)防止关键服务中断
✅ 使用 kubectl drain --ignore-daemonsets 排除系统组件
✅ 监控升级期间的资源水位,设置告警阈值(如 CPU > 80%)