25·Deployment进阶

滚动更新

kubernetesdeploymentupdaterolling-update

滚动更新

学习目标

  1. 理解滚动更新的工作原理
  2. 掌握触发滚动更新的方法
  3. 掌握更新策略的配置

核心概念

什么是滚动更新

滚动更新:逐步用新版本替换旧版本

旧版本 (v1)          更新中              新版本 (v2)
┌───┐ ┌───┐ ┌───┐  ┌───┐ ┌───┐ ┌───┐  ┌───┐ ┌───┐ ┌───┐
│ v1│ │ v1│ │ v1│  │ v1│ │ v2│ │ v2│  │ v2│ │ v2│ │ v2│
└───┘ └───┘ └───┘  └───┘ └───┘ └───┘  └───┘ └───┘ └───┘

好处:
- 零停机更新
- 逐步验证新版本
- 可随时回滚

触发滚动更新

# 方式一:修改镜像(最常用)
$ kubectl set image deployment/nginx-deployment nginx=nginx:1.25

# 方式二:编辑 YAML
$ kubectl edit deployment nginx-deployment
# 修改 spec.template.spec.containers[0].image

# 方式三:修改 YAML 后 apply
$ kubectl apply -f deployment.yaml

# 方式四:使用 patch
$ kubectl patch deployment nginx-deployment -p '{"spec":{"template":{"spec":{"containers":[{"name":"nginx","image":"nginx:1.25"}]}}}}'

查看更新过程

# 实时查看 Pod 变化
$ kubectl get pods -w

# 查看 Deployment 状态
$ kubectl get deployment nginx-deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     1            2           5m

# UP-TO-DATE: 已更新到新版本的数量
# AVAILABLE: 可用的 Pod 数量

# 查看更新状态
$ kubectl rollout status deployment/nginx-deployment

# 查看更新历史
$ kubectl rollout history deployment/nginx-deployment

更新过程详解

步骤 1: 创建新 ReplicaSet
  Deployment → ReplicaSet (v2) → 创建 1 个新 Pod

步骤 2: 新 Pod 就绪后,删除旧 Pod
  新 Pod Running → 删除 1 个旧 Pod

步骤 3: 重复直到所有 Pod 更新完成
  继续创建新 Pod → 删除旧 Pod → ...

步骤 4: 旧 ReplicaSet 保留(用于回滚)
  ReplicaSet (v1) 保留,副本数为 0

更新策略配置

spec:
  strategy:
    type: RollingUpdate        # 滚动更新(默认)
    rollingUpdate:
      maxUnavailable: 1        # 更新时最多有几个 Pod 不可用
      maxSurge: 1              # 更新时最多多出几个 Pod

maxUnavailable 和 maxSurge

假设 replicas=3, maxUnavailable=1, maxSurge=1

更新过程:
1. 总 Pod 数: 3 (旧) + 1 (新) = 4 个(最多多 1 个)
2. 旧 Pod 数: 3, 新 Pod 数: 1
3. 新 Pod 就绪后,删除 1 个旧 Pod
4. 旧 Pod 数: 2, 新 Pod 数: 1
5. 继续创建新 Pod...
6. 直到 3 个新 Pod 都就绪

maxUnavailable:
- 值越大,更新越快,但可用性越低
- 可以是数字或百分比

maxSurge:
- 值越大,更新越快,但资源占用越多
- 可以是数字或百分比

不同更新策略示例

# 快速更新(资源充足)
spec:
  strategy:
    rollingUpdate:
      maxUnavailable: 0
      maxSurge: 3

# 保守更新(资源有限)
spec:
  strategy:
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 0

# 平衡更新(默认)
spec:
  strategy:
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%

minReadySeconds

spec:
  minReadySeconds: 10  # Pod 就绪后等待 10 秒才认为可用

用途:

  • 防止有问题的 Pod 被认为可用
  • 给应用预热时间
  • 更安全的更新

实践练习

练习 1:执行滚动更新

# 1. 创建 Deployment
$ kubectl create deployment web --image=nginx:1.24 --replicas=3

# 2. 查看当前状态
$ kubectl get pods -o wide

# 3. 更新镜像
$ kubectl set image deployment/web nginx=nginx:1.25

# 4. 观察更新过程
$ kubectl get pods -w

# 5. 查看更新历史
$ kubectl rollout history deployment/web

练习 2:配置更新策略

编写 Deployment YAML,要求:

  • 镜像:nginx:1.24
  • 副本数:4
  • 更新策略:maxUnavailable=1, maxSurge=2
  • minReadySeconds: 5

练习 3:使用 kubectl set

# 更新镜像
$ kubectl set image deployment/web nginx=nginx:1.25

# 更新资源限制
$ kubectl set resources deployment/web -c=nginx --limits=cpu=200m,memory=256Mi

# 查看变更
$ kubectl rollout history deployment/web

常见问题

1. 更新卡住

# 查看状态
$ kubectl rollout status deployment/web

# 可能原因:
# - 新镜像拉取失败
# - 新 Pod 启动失败
# - 就绪探针失败

# 查看事件
$ kubectl describe deployment/web

# 查看 Pod 状态
$ kubectl get pods | grep web

2. 更新太快导致服务中断

# 调整策略
spec:
  strategy:
    rollingUpdate:
      maxUnavailable: 0      # 确保始终有足够可用 Pod
      maxSurge: 1
  minReadySeconds: 30        # 等待更长时间确认可用

3. 想要更快的更新

# 增加并发度
spec:
  strategy:
    rollingUpdate:
      maxUnavailable: 50%
      maxSurge: 50%

小结

要点说明
滚动更新逐步替换旧 Pod,零停机
触发方式kubectl set image 或修改 YAML apply
maxUnavailable更新时最多有几个不可用
maxSurge更新时最多多出几个 Pod
minReadySecondsPod 就绪后等待时间
查看历史kubectl rollout history

练习编辑器

bash
Loading...

继续学习

完成本课后,建议继续学习下一课「回滚」 以巩固所学知识。