暂停部署
学习目标
- 理解暂停部署的用途
- 掌握暂停和恢复部署的方法
- 掌握批量更新的技巧
核心概念
为什么需要暂停部署
场景:需要同时更新多个配置
问题:
1. 更新镜像 → 触发滚动更新
2. 更新环境变量 → 再次触发滚动更新
3. 更新资源限制 → 又触发滚动更新
每次修改都触发一次更新,产生多个 Revision
解决:暂停部署,批量修改,然后恢复
暂停部署
# 暂停 Deployment
$ kubectl rollout pause deployment/nginx-deployment
# 查看状态
$ kubectl get deployment nginx-deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 0 3 5m
# 状态显示 Paused
在暂停期间修改
# 暂停后修改不会触发更新
$ kubectl set image deployment/nginx-deployment nginx=nginx:1.25
$ kubectl set resources deployment/nginx-deployment -c=nginx --limits=cpu=200m
$ kubectl set env deployment/nginx-deployment ENV=production
# 查看 Pod(没有变化)
$ kubectl get pods
# 查看 Deployment 状态
$ kubectl get deployment nginx-deployment
# 仍然显示 Paused
恢复部署
# 恢复 Deployment
$ kubectl rollout resume deployment/nginx-deployment
# 现在会触发一次更新(包含所有修改)
$ kubectl get pods -w
# 查看状态
$ kubectl rollout status deployment/nginx-deployment
暂停期间的行为
暂停前:
[ v1 ] [ v1 ] [ v1 ]
暂停期间(修改镜像和环境变量):
[ v1 ] [ v1 ] [ v1 ] ← Pod 没有变化
恢复后:
[ v2 ] [ v2 ] [ v2 ] ← 一次性应用所有修改
使用场景
1. 批量更新
- 同时修改镜像、环境变量、资源限制
- 只产生一个 Revision
2. 准备阶段
- 先暂停,准备好所有修改
- 确认无误后恢复
3. 调试
- 暂停更新,检查中间状态
检查暂停状态
# 查看 Deployment 详情
$ kubectl describe deployment nginx-deployment
# 关键信息:
# Conditions:
# Type Status
# Progressing True
# Available True
# Paused True ← 暂停状态
# 查看 YAML
$ kubectl get deployment nginx-deployment -o yaml | grep paused
paused: true
实践练习
练习 1:批量更新
# 1. 创建 Deployment
$ kubectl create deployment web --image=nginx:1.24 --replicas=3
# 2. 暂停部署
$ kubectl rollout pause deployment/web
# 3. 批量修改
$ kubectl set image deployment/web nginx=nginx:1.25
$ kubectl set env deployment/web APP_ENV=production
$ kubectl set resources deployment/web -c=nginx --limits=cpu=200m,memory=256Mi
# 4. 查看 Pod(应该没有变化)
$ kubectl get pods
# 5. 恢复部署
$ kubectl rollout resume deployment/web
# 6. 观察更新
$ kubectl get pods -w
# 7. 查看历史(只有一个新 Revision)
$ kubectl rollout history deployment/web
练习 2:对比暂停和不暂停
# 不暂停的情况
$ kubectl create deployment no-pause --image=nginx:1.24 --replicas=3
$ kubectl set image deployment/no-pause nginx=nginx:1.25
$ kubectl set env deployment/no-pause ENV=prod
$ kubectl rollout history deployment/no-pause
# 会有多个 Revision
# 暂停的情况
$ kubectl create deployment with-pause --image=nginx:1.24 --replicas=3
$ kubectl rollout pause deployment/with-pause
$ kubectl set image deployment/with-pause nginx=nginx:1.25
$ kubectl set env deployment/with-pause ENV=prod
$ kubectl rollout resume deployment/with-pause
$ kubectl rollout history deployment/with-pause
# 只有一个新 Revision
练习 3:检查暂停状态
# 1. 暂停 Deployment
$ kubectl rollout pause deployment/web
# 2. 使用不同方式检查状态
$ kubectl get deployment web
$ kubectl describe deployment web
$ kubectl get deployment web -o yaml | grep paused
# 3. 尝试修改
$ kubectl set image deployment/web nginx=nginx:1.26
# 4. 再次检查(Pod 应该没变化)
$ kubectl get pods
# 5. 恢复
$ kubectl rollout resume deployment/web
常见问题
1. 忘记恢复部署
# 检查是否有暂停的 Deployment
$ kubectl get deployments --all-namespaces -o json | jq '.items[] | select(.spec.paused == true) | .metadata.name'
# 恢复
$ kubectl rollout resume deployment/<name>
2. 暂停期间想取消修改
# 暂停期间修改不会生效
# 直接恢复会应用修改
# 如果想取消,需要手动恢复原配置
$ kubectl rollout undo deployment/web
3. 暂停状态影响扩缩容
# 暂停期间可以手动扩缩容
$ kubectl scale deployment web --replicas=5
# 但 HPA 可能不会生效
小结
| 要点 | 说明 |
|---|---|
| 暂停 | kubectl rollout pause |
| 恢复 | kubectl rollout resume |
| 用途 | 批量更新,只产生一个 Revision |
| 暂停期间 | 修改不会触发更新 |
| 恢复后 | 所有修改一次性应用 |
练习编辑器
bash
Loading...