在 Kubernetes 中,Deployment 是最常用的工作负载(Workload)控制器之一,用于声明式地管理无状态应用的 Pod 副本集(ReplicaSet)。它的核心价值在于:确保指定数量的 Pod 始终健康运行,并支持滚动更新与回滚。
🎯 一、Deployment 的核心作用
| 功能 | 说明 |
| ✅ 副本管理 |
始终维持指定数量的 Pod(如 replicas: 3) |
| ✅ 自愈能力 |
Pod 崩溃、节点故障 → 自动重建新 Pod |
| ✅ 滚动更新 |
无缝升级镜像或配置,零停机 |
| ✅ 版本回滚 |
一键回退到上一个稳定版本 |
| ✅ 暂停/恢复更新 |
支持分阶段发布 |
💡 适用场景:Web 服务、API 网关、缓存代理等无状态应用(Stateless)
❌ 不适用:数据库、ZooKeeper、Kafka 等有状态应用(应使用 StatefulSet)
📦 二、Deployment 基本结构(YAML 示例)
1apiVersion: apps/v1
2kind: Deployment
3metadata:
4 name: nginx-deployment
5spec:
6 replicas: 3 # 期望的 Pod 副本数
7 selector:
8 matchLabels:
9 app: nginx # 必须匹配 template.metadata.labels
10 strategy:
11 type: RollingUpdate # 更新策略
12 rollingUpdate:
13 maxUnavailable: 1 # 更新时最多不可用 1 个
14 maxSurge: 1 # 最多可超配 1 个(临时)
15 template: # Pod 模板(核心!)
16 metadata:
17 labels:
18 app: nginx # 必须包含 selector 中的标签
19 spec:
20 containers:
21 - name: nginx
22 image: nginx:1.25
23 ports:
24 - containerPort: 80
25 resources:
26 requests:
27 memory: "64Mi"
28 cpu: "100m"
🔁 三、Deployment 如何工作?(内部机制)
Deployment 并不直接管理 Pod,而是通过 两层控制器 实现:
1Deployment
2 ↓ (控制)
3ReplicaSet (v1) ← 当前活跃版本
4 ↓ (管理)
5Pods (3个)
6
7当你更新镜像 → Deployment 创建 ReplicaSet (v2),逐步替换 v1 的 Pod
- 每次更新都会创建新的 ReplicaSet
- 旧 ReplicaSet 保留(用于回滚)
kubectl rollout history deployment/nginx-deployment 可查看历史版本
🔄 四、关键操作:更新与回滚
1. 触发更新
1# 方法1:修改 YAML 后 apply
2kubectl apply -f deployment.yaml
3
4# 方法2:直接 set 镜像
5kubectl set image deployment/nginx-deployment nginx=nginx:1.26
6
7# 方法3:edit 在线编辑
8kubectl edit deployment/nginx-deployment
2. 监控滚动更新
1kubectl rollout status deployment/nginx-deployment
3. 回滚到上一版本
1kubectl rollout undo deployment/nginx-deployment
4. 回滚到指定版本
1kubectl rollout history deployment/nginx-deployment # 查看 REVISION
2kubectl rollout undo deployment/nginx-deployment --to-revision=2
⚙️ 五、更新策略详解
RollingUpdate(默认)
- 逐个替换 Pod,保证服务不中断
- 通过两个参数精细控制:
maxUnavailable: 更新过程中允许不可用的最大 Pod 数(默认 25%)
maxSurge: 允许超出期望副本数的最大 Pod 数(默认 25%)
🌰 例:replicas: 4, maxUnavailable: 1, maxSurge: 1
更新时:最多 3 个可用(4-1),最多 5 个 Pod(4+1)
Recreate(重建)
- 先删除所有旧 Pod,再创建新 Pod
- 会导致短暂服务中断
- 适用于无法并行运行新旧版本的应用
1strategy:
2 type: Recreate
🔍 六、调试与排查技巧
1. 查看 Deployment 状态
1kubectl get deployment
2# 输出:READY 列显示 "3/3" 表示 3 个期望,3 个就绪
2. 查看关联的 ReplicaSet
1kubectl get rs
2# 会看到 nginx-deployment-6b4d9f7c8c 等带 hash 的名称
3. 查看更新历史
1kubectl rollout history deployment/nginx-deployment
4. 暂停/恢复更新(用于分阶段发布)
1kubectl rollout pause deployment/nginx-deployment
2# 修改资源限制、环境变量等
3kubectl rollout resume deployment/nginx-deployment
⚠️ 七、常见陷阱与最佳实践
| 问题 | 解决方案 |
忘记设置 resources |
导致节点资源耗尽 → 始终设置 requests/limits |
| 标签不匹配 |
selector.matchLabels 必须与 template.metadata.labels 完全一致 |
| 就绪探针缺失 |
新 Pod 未就绪就被加入流量 → 添加 readinessProbe |
| 滚动更新卡住 |
检查新 Pod 是否 CrashLoopBackOff → kubectl logs --previous |
| 直接操作 Pod |
手动删 Pod 会被自动重建 → 应通过缩容或更新 Deployment |
🆚 Deployment vs 其他控制器
| 控制器 | 适用场景 | 特点 |
| Deployment |
无状态应用(Nginx, Web API) |
副本管理、滚动更新 |
| StatefulSet |
有状态应用(MySQL, ZooKeeper) |
固定网络标识、有序部署/扩展 |
| DaemonSet |
每节点运行一个(日志、监控 agent) |
自动覆盖新加入节点 |
| Job |
一次性任务(数据迁移、批处理) |
完成后自动终止 |
✅ 总结:Deployment 的核心价值
“你只管声明想要什么(3个 nginx:1.25 Pod),剩下的交给 Kubernetes。”
- 自动扩缩容(配合 HPA)
- 自愈(Pod 死了自动拉起)
- 无损升级(滚动更新)
- 版本可控(回滚无忧)