1. Deployment 基础概念

Deployment 是 Kubernetes 中用于管理无状态工作负载的核心资源对象。它通过声明式配置驱动集群达到期望状态,是生产环境中部署应用的“标准入口”。理解 Deployment 的作用、ReplicaSet 与 Pod 的关系以及声明式更新机制,是掌握集群节点扩容与 CRI 接口调度的前提。

1.1 Deployment 的作用

Deployment 为 Pod 和 ReplicaSet 提供声明式更新能力,主要职责包括:

  • 定义期望状态:通过 YAML/JSON 声明副本数、镜像版本、资源限制等。
  • 自动维护副本数:当 Pod 因故障或节点压力被驱逐时,Deployment 自动创建新 Pod 补足。
  • 滚动更新与回滚:支持零停机更新,并保留历史版本用于快速回退。
  • 扩缩容:手动或基于 HPA 调整副本数,适配业务负载。
  • 暂停与恢复:允许暂停更新过程,分批验证后再继续。
关键原则:Deployment 不直接管理 Pod,而是通过控制 ReplicaSet 间接管理。这种分层设计实现了更新策略与副本维护的解耦。

1.2 ReplicaSet 与 Pod 的关系

ReplicaSet 是 Deployment 与 Pod 之间的中间层,其核心关系如下表所示:

组件 职责 与上层关系 与下层关系
Deployment 声明式更新、版本管理、扩缩容策略 — 创建并管理 ReplicaSet
ReplicaSet 确保指定数量的 Pod 副本始终运行 被 Deployment 控制 通过标签选择器管理 Pod
Pod 运行容器化应用的最小单元 被 ReplicaSet 监控和调度 —

每次 Deployment 更新(如镜像版本变更)会创建一个新的 ReplicaSet,并逐步将流量从旧 ReplicaSet 迁移到新 ReplicaSet。旧 ReplicaSet 的副本数被缩至 0,但保留在集群中以便回滚。

生产建议:不要直接操作 ReplicaSet。所有副本管理、更新操作都应通过 Deployment 进行,否则声明式状态会与控制器循环冲突。
Deployment、ReplicaSet、Pod 三层关系架构图 Deployment → ReplicaSet → Pod 三层关系 Deployment 声明式更新 · 版本管理 · 扩缩容 创建/控制 ReplicaSet 确保副本数 · 标签选择器 管理 Pod 实例 1 Pod 实例 2 Pod 实例 N 说明 Deployment 不直接管理 Pod,而是通过 ReplicaSet 间接控制。更新时创建新 RS,旧 RS 缩至 0 但保留。

1.3 声明式更新机制

声明式更新是 Deployment 的核心设计哲学。用户只需在 YAML 中描述“期望状态”,控制器循环(Controller Loop)自动驱动实际状态向期望状态收敛。

更新流程

  1. 提交新版本:修改 Deployment 的 YAML(如镜像版本 v1 → v2),通过 kubectl apply 提交。
  2. 创建新 ReplicaSet:Deployment 控制器检测到 spec 变更,创建新 ReplicaSet(RS-v2),初始副本数为 0。
  3. 滚动升级:逐步增加 RS-v2 的副本数,同时减少旧 RS-v1 的副本数,确保总 Pod 数不变。
  4. 完成迁移:当 RS-v2 副本数达到期望值,RS-v1 副本数缩至 0,更新完成。
  5. 保留历史:旧 RS-v1 保留在集群中(可通过 revisionHistoryLimit 控制数量),用于回滚。
常见误区:声明式更新不是“替换”,而是“渐进式迁移”。如果新版本 Pod 启动失败(如镜像拉取错误、健康检查不通过),滚动更新会自动暂停,避免全部 Pod 不可用。

更新策略参数

参数 默认值 说明
strategy.type RollingUpdate 滚动更新(推荐);可选 Recreate(先删后建,有停机)
strategy.rollingUpdate.maxUnavailable 25% 更新过程中最多允许不可用的 Pod 比例
strategy.rollingUpdate.maxSurge 25% 更新过程中最多允许超出期望副本数的 Pod 比例
revisionHistoryLimit 10 保留的历史 ReplicaSet 版本数量

声明式 vs 指令式对比

维度 声明式(Declarative) 指令式(Imperative)
操作方式 kubectl apply -f deploy.yaml kubectl run / kubectl scale
状态管理 集群自动收敛到期望状态 手动执行每一步操作
可审计性 YAML 文件可作为版本控制依据 操作记录分散,难以追溯
回滚能力 原生支持 kubectl rollout undo 需手动恢复旧配置
适用场景 生产环境、CI/CD 流水线 快速调试、临时测试
声明式滚动更新流程示意图 滚动更新流程:从 v1 迁移到 v2 RS-v1: 5 副本 全部 Running RS-v2: 0 副本 创建中 RS-v1: 3 → RS-v2: 2 逐步迁移 RS-v2: 5 完成 关键行为 maxUnavailable=25% 时,最多允许 1 个 Pod 不可用(5*0.25=1.25,向下取整)。 maxSurge=25% 时,最多允许 6 个 Pod 同时运行(5+1)。 滚动更新期间 Pod 状态变化示例 初始:RS-v1 有 Pod-A、B、C、D、E(全部 Ready) 步骤1:创建 Pod-F(v2),等待 Ready → 缩容 Pod-A(v1) 步骤2:创建 Pod-G(v2),等待 Ready → 缩容 Pod-B(v1)…… 直至全部替换

1.4 小结

Deployment 通过“声明式期望状态 + 控制器循环”实现了生产级的应用管理。ReplicaSet 作为中间层承担副本保障职责,Pod 是最终运行单元。滚动更新策略在保证可用性的前提下完成版本迁移,是集群节点扩容和 CRI 资源调度配置的基础支撑。