滚动更新
学习目标
- 理解滚动更新的工作原理
- 掌握触发滚动更新的方法
- 掌握更新策略的配置
核心概念
什么是滚动更新
滚动更新:逐步用新版本替换旧版本
旧版本 (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 |
| minReadySeconds | Pod 就绪后等待时间 |
| 查看历史 | kubectl rollout history |
练习编辑器
bash
Loading...