28·Deployment进阶

暂停部署

kubernetesdeploymentpause

暂停部署

学习目标

  1. 理解暂停部署的用途
  2. 掌握暂停和恢复部署的方法
  3. 掌握批量更新的技巧

核心概念

为什么需要暂停部署

场景:需要同时更新多个配置

问题:
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...

继续学习

完成本课后,建议继续学习下一课「查看部署状态」 以巩固所学知识。