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 进行,否则声明式状态会与控制器循环冲突。
1.3 声明式更新机制
声明式更新是 Deployment 的核心设计哲学。用户只需在 YAML 中描述“期望状态”,控制器循环(Controller Loop)自动驱动实际状态向期望状态收敛。
更新流程
- 提交新版本:修改 Deployment 的 YAML(如镜像版本 v1 → v2),通过
kubectl apply提交。 - 创建新 ReplicaSet:Deployment 控制器检测到 spec 变更,创建新 ReplicaSet(RS-v2),初始副本数为 0。
- 滚动升级:逐步增加 RS-v2 的副本数,同时减少旧 RS-v1 的副本数,确保总 Pod 数不变。
- 完成迁移:当 RS-v2 副本数达到期望值,RS-v1 副本数缩至 0,更新完成。
- 保留历史:旧 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 流水线 | 快速调试、临时测试 |
1.4 小结
Deployment 通过“声明式期望状态 + 控制器循环”实现了生产级的应用管理。ReplicaSet 作为中间层承担副本保障职责,Pod 是最终运行单元。滚动更新策略在保证可用性的前提下完成版本迁移,是集群节点扩容和 CRI 资源调度配置的基础支撑。