在 Kubernetes 中,Deployment 是最常用的工作负载(Workload)控制器之一,用于声明式地管理无状态应用的 Pod 副本集(ReplicaSet)。它的核心价值在于:确保指定数量的 Pod 始终健康运行,并支持滚动更新与回滚。
功能 | 说明 |
|---|---|
✅ 副本管理 | 始终维持指定数量的 Pod(如 replicas: 3) |
✅ 自愈能力 | Pod 崩溃、节点故障 → 自动重建新 Pod |
✅ 滚动更新 | 无缝升级镜像或配置,零停机 |
✅ 版本回滚 | 一键回退到上一个稳定版本 |
✅ 暂停/恢复更新 | 支持分阶段发布 |
💡 适用场景:Web 服务、API 网关、缓存代理等无状态应用(Stateless) ❌ 不适用:数据库、ZooKeeper、Kafka 等有状态应用(应使用
StatefulSet)
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 并不直接管理 Pod,而是通过 两层控制器 实现:
1Deployment
2 ↓ (控制)
3ReplicaSet (v1) ← 当前活跃版本
4 ↓ (管理)
5Pods (3个)
6
7当你更新镜像 → Deployment 创建 ReplicaSet (v2),逐步替换 v1 的 Podkubectl rollout history deployment/nginx-deployment 可查看历史版本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-deployment1kubectl rollout status deployment/nginx-deployment1kubectl rollout undo deployment/nginx-deployment1kubectl rollout history deployment/nginx-deployment # 查看 REVISION
2kubectl rollout undo deployment/nginx-deployment --to-revision=2RollingUpdate(默认)maxUnavailable: 更新过程中允许不可用的最大 Pod 数(默认 25%)maxSurge: 允许超出期望副本数的最大 Pod 数(默认 25%)🌰 例:
replicas: 4,maxUnavailable: 1,maxSurge: 1更新时:最多 3 个可用(4-1),最多 5 个 Pod(4+1)
Recreate(重建)1strategy:
2 type: Recreate1kubectl get deployment
2# 输出:READY 列显示 "3/3" 表示 3 个期望,3 个就绪1kubectl get rs
2# 会看到 nginx-deployment-6b4d9f7c8c 等带 hash 的名称1kubectl rollout history deployment/nginx-deployment1kubectl 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 | 无状态应用(Nginx, Web API) | 副本管理、滚动更新 |
StatefulSet | 有状态应用(MySQL, ZooKeeper) | 固定网络标识、有序部署/扩展 |
DaemonSet | 每节点运行一个(日志、监控 agent) | 自动覆盖新加入节点 |
Job | 一次性任务(数据迁移、批处理) | 完成后自动终止 |
“你只管声明想要什么(3个 nginx:1.25 Pod),剩下的交给 Kubernetes。”