1. 课程导论:为什么需要关注 Deployment 升级时的资源预留?资源画像与临时预留的核心概念

1.1 升级时的“隐形风险”:资源争抢与 Pod 驱逐

在 Kubernetes 集群中,Deployment 滚动升级是最常见的变更操作。然而,升级过程中 新 Pod 创建 与 旧 Pod 销毁 并非瞬间完成,而是存在一段短暂的“共存期”。这段窗口期内,集群资源(CPU、内存)面临双重压力:

  • 新 Pod 启动峰值:新副本启动时,应用初始化、JVM 预热、缓存加载等操作往往产生远高于稳态运行的资源消耗。
  • 旧 Pod 残留占用:旧 Pod 在优雅终止期间仍持有部分资源,尤其是内存,不会立即释放。

若未预留足够的“缓冲资源”,极易触发 节点资源紧张 → kubelet 驱逐 Pod → 服务中断 的连锁反应。以下表格对比了有无资源预留的升级表现:

对比维度 无资源预留 有临时资源预留
升级期间资源水位 接近或超过节点容量 始终低于安全阈值
Pod 驱逐风险 高(尤其内存密集型应用) 低
升级速度 被迫降速或卡死 平稳滚动
对同节点其他 Pod 影响 明显(资源争抢) 几乎无影响
⚠️ 常见误区: 很多团队认为“只要设置了 requests/limits 就安全了”。实际上,requests 仅保证调度阶段的资源预留,无法阻止升级过程中因新旧 Pod 共存导致的瞬时超分。

1.2 核心概念:资源画像与临时预留

要解决上述问题,需要引入两个核心概念:资源画像 和 临时资源预留。它们分别回答“需要多少资源”和“如何临时锁定资源”两个关键问题。

1.2.1 资源画像:从“静态配置”到“动态感知”

资源画像是指通过分析 Pod 的历史运行数据(CPU 使用率、内存 RSS、网络 I/O 等),建立其在不同生命周期阶段(启动、稳态、峰值)的资源需求模型。传统做法是运维人员凭经验设置 requests/limits,往往导致:

  • 过度预留:requests 设置过高,集群利用率低下。
  • 预留不足:低估启动峰值,升级时触发 OOMKill。

资源画像的目标是输出 精细化资源基线,例如:

  • 启动阶段:CPU 2.5 核 / 内存 1.8 GiB(持续 90 秒)
  • 稳态阶段:CPU 0.8 核 / 内存 1.2 GiB
  • 峰值阶段:CPU 3.0 核 / 内存 2.1 GiB(持续 30 秒)

1.2.2 临时资源预留:升级期间的“资源保险”

临时资源预留是指在 Deployment 升级期间,临时性地 在目标节点上为即将创建的新 Pod 预留出足够的资源空间,确保其启动阶段不会因资源不足而失败。它与永久性 requests 的区别如下:

特性 永久性 requests 临时资源预留
生效时间 Pod 整个生命周期 仅升级窗口期(秒~分钟级)
资源量 基于稳态需求 基于启动峰值需求
释放机制 Pod 删除后释放 新 Pod 就绪后自动释放
对集群利用率影响 长期占用 短期占用,几乎无影响
💡 类比理解: 永久性 requests 相当于“长期租房”,临时资源预留相当于“酒店钟点房”——只在需要时(升级启动阶段)临时占用,用完即退。

1.3 核心流程:资源画像驱动的升级预留

下图展示了从资源画像到临时预留的完整闭环流程:

资源画像驱动的升级临时预留流程 历史数据采集 Prometheus / Metrics Server 资源画像生成 启动/稳态/峰值基线 Deployment 升级触发 kubectl rollout 临时预留量计算 启动峰值 - 当前可用资源 节点资源锁定 临时 Reservation CRD 新 Pod 创建 & 就绪 启动峰值资源保障 临时预留释放 新 Pod Ready 后自动回收 关键收益 零驱逐 · 零中断 · 高利用率

1.4 本课程的核心收益

通过本课程的学习,你将掌握以下能力:

  1. 精准画像:基于生产数据生成 Pod 启动/稳态/峰值资源基线,告别“拍脑袋”配置。
  2. 动态预留:在升级触发时自动计算并锁定临时资源,保障新 Pod 启动安全。
  3. 零成本释放:新 Pod 就绪后立即回收预留资源,不浪费集群容量。
  4. 可观测性:通过监控面板实时查看预留状态与资源水位。
📌 课程定位: 本课程面向 Kubernetes 平台工程师、SRE、运维开发人员,要求学员具备基本的 Deployment 操作经验和 Pod 资源管理概念。课程将提供完整的 资源画像算法 + Operator 实现 + 生产部署方案,可直接落地到现有集群。