2. K8s 升级基础:节点升级的常见策略及其资源占用模型
在容量规划视角下,理解不同升级策略的资源占用模型是成本优化的前提。K8s 节点升级本质上是将集群中的工作负载从旧节点迁移至新节点(或原地替换),这一过程会临时占用额外的计算、内存和网络资源。本节将剖析三种主流策略:原地升级、滚动升级和蓝绿部署,并建立各自的资源占用数学模型。
2.1 原地升级(In-Place Upgrade)
原地升级直接对节点操作系统或 kubelet 组件进行原地更新,Pod 在节点上被驱逐并重新调度。该策略资源占用最小,但风险最高。
- 操作流程:节点标记为不可调度(cordon)→ 驱逐 Pod(drain)→ 升级节点组件 → 节点重新加入集群。
- 资源占用模型:仅需为被驱逐的 Pod 在集群其他节点上提供等价资源。假设节点容量为 \(C\),已用资源为 \(U\),则临时资源需求为 \(U\)(需集群剩余资源 ≥ \(U\))。
- 适用场景:测试环境、单节点集群、对中断容忍度高的批处理任务。
容量规划警示:原地升级期间,若集群剩余资源不足 \(U\),Pod 将处于 Pending 状态,导致服务降级。务必在升级前通过
kubectl describe node 确认集群资源余量。
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 个节点的资源。
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 资源占用模型的核心参数
无论采用哪种策略,以下参数直接影响临时资源预留量:
- 节点已用资源(U):通过
kubectl top node或 Prometheus 监控获取。 - 节点容量(C):节点总资源(CPU、内存、磁盘、网络带宽)。
- 每批升级节点数(B):滚动升级中
maxUnavailable的值。 - Pod 调度策略:PodDisruptionBudget(PDB)和反亲和性规则会影响实际可驱逐 Pod 数量。
- 升级窗口:业务低峰期升级可降低资源竞争风险。
容量规划检查清单:
✅ 确认集群剩余资源 ≥ 临时资源需求
✅ 设置合理的 PDB(如 minAvailable: 2)防止关键服务中断
✅ 使用
✅ 监控升级期间的资源水位,设置告警阈值(如 CPU > 80%)
✅ 确认集群剩余资源 ≥ 临时资源需求
✅ 设置合理的 PDB(如 minAvailable: 2)防止关键服务中断
✅ 使用
kubectl drain --ignore-daemonsets 排除系统组件✅ 监控升级期间的资源水位,设置告警阈值(如 CPU > 80%)