如何滚动部署?
在 Kubernetes 中,滚动部署(Rolling Update) 是一种无中断地逐步更新应用的方式。它可以保证我们的服务在升级过程中依然保持可用。
什么是滚动部署?
滚动部署是指:逐个(或按比例)替换旧的 Pod,使用新版本镜像启动新 Pod,在所有新 Pod 成功运行后再删除旧 Pod。
适用于大多数 Web 应用、API 服务、微服务等更新场景。
如何使用滚动部署?
方式 1:修改 Deployment(最常见)
如果是用 Deployment
管理的应用,只需更新镜像版本,Kubernetes 就会自动触发滚动更新。
示例:使用 kubectl set image
命令
kubectl set image deployment/my-app my-app-container=myapp:v2
解释:
• my-app 是 Deployment 名
• my-app-container 是容器名(在 Pod template 中定义)
• myapp:v2 是新镜像 这条命令会触发滚动更新,旧 Pod 被逐个替换成新版本。
方式 2:直接编辑 Deployment YAML
你也可以执行以下命令,修改镜像:
kubectl edit deployment my-app
找到镜像行:
containers:
- name: my-app-container
image: myapp:v1
改成新版本 myapp:v2,保存退出,滚动部署自动开始。
查看滚动部署状态
可以用以下命令查看部署进度
kubectl rollout status deployment my-app
如果输出是:
deployment "my-app" successfully rolled out
说明升级完成。
回滚到旧版本
如果新版本有问题,可以一键回滚:
kubectl rollout undo deployment my-app
还可以回滚到某一个历史版本
kubectl rollout history deployment my-app
kubectl rollout undo deployment my-app --to-revision=2
设置滚动更新策略
你可以在 Deployment YAML 中指定滚动更新策略:
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1 # 更新期间最多允许多少个 Pod 不可用
maxSurge: 1 # 超出期望 Pod 数量,最多能创建几个新 Pod
例如,如果你有 3 个副本:
maxUnavailable=1 表示可以有一个 Pod 暂时不工作
maxSurge=1 表示可以临时增加一个新 Pod,加快替换
其他高级技巧
目标 | 方法 |
---|---|
控制升级节奏 | 配置 readinessProbe ,让 K8s 等待容器健康后再替换下一个 |
查看升级历史 | kubectl rollout history deployment xxx |
暂停升级 | kubectl rollout pause deployment xxx |
手动恢复升级 | kubectl rollout resume deployment xxx |
配合 CI/CD | 使用 GitOps、Jenkins、ArgoCD、Tekton 等工具 |
总结
操作 | 命令 |
---|---|
触发滚动部署 | kubectl set image 或更新 YAML |
查看部署状态 | kubectl rollout status deployment xxx |
查看历史 | kubectl rollout history deployment xxx |
回滚 | kubectl rollout undo deployment xxx |
设置滚动策略 | 修改 strategy.rollingUpdate |
如何手动控制滚动升级的过程?
虽然 Kubernetes 默认的 滚动部署(RollingUpdate)是自动进行的,但还可以通过 “手动控制滚动过程” 的方式来做到。
目标:4 个 Pod,一个一个手动更新
实现方式可以选下面几种:
方式 1:暂停 Deployment 滚动更新,手动控制更新每个 Pod
这种方式用得最多,也很灵活,流程如下:
步骤:
1. 暂停滚动更新
现在新镜像已经写入模板,但因为暂停了,不会自动滚动。
3. 一个一个手动删除 Pod(Kubernetes 会自动用新镜像重建)
如果是用的rancher管理,点开deployment,点开右上角的三个点,找到"暂停部署",如图
验证是否关闭"滚动更新"
在rancher中对deployment进行"暂停编排"后,在命令行执行:
kubectl get deployment my-app -n szsh-dev -o yaml | grep paused
nginx-dev02是我要操作的deployment
如果输出如下:
root@master:~# kubectl get deployment my-app -n szsh-dev -o yaml | grep paused
paused: true
message: Deployment is paused
paused: true 表示已暂停"滚动更新"
方式 2:使用 maxUnavailable: 0
+ maxSurge: 1
限制自动并发为 1
这个方式可以做到“自动滚动,但一次只更新一个”,然后你可以通过 pause
和 resume
做阶段控制:
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 0
maxSurge: 1
这个配置意味着:
- 更新过程中 不会有旧 Pod 下线
- 会先启动一个新 Pod,等新 Pod Ready,旧 Pod 才删除
- 所以是 一个一个替换
可以再配合:
kubectl rollout pause deployment my-app
以一个 4 个副本的服务为例:
1. 暂停编排(Rancher 中点击「暂停编排」)
2. 编辑 Deployment 镜像 v1 → v2
3. 手动删除第 1 个 Pod → 新 Pod(v2)被自动拉起
4. 重复删除第1、 2、3、4 个旧 Pod
所有 Pod 都换成新版本后
你可以:
✅ 保持暂停(不影响运行)
✅ 或点击「恢复编排」,Deployment 恢复控制(推荐)
建议:
✅ 更新完全部 Pod 后恢复编排,避免未来你再修改配置,Deployment 没有生效你还以为挂了。
🛑 不要在更新中途点“恢复”,否则 Kubernetes 会一次性更新剩余所有 Pod,打乱你“一个个控制”的节奏。
暂停编排 的本质含义
当点击 暂停编排 后,Rancher 会让该 Deployment
:
-
不再根据 Pod Template 自动触发更新
-
镜像等配置变更时,也不会立即创建新 Pod
-
你必须手动「删除旧 Pod」或「恢复编排」才会继续更新
手动滚动更新流程(Rancher 实战版)
比如你有一个 4 副本的 Java 服务:
步骤:
-
进入 Rancher > 工作负载 > Deployment
-
点击由上角⋮ 暂停编排
-
然后编辑该 Deployment 的镜像(比如从
v1
改成v2
),保存后:-
Pod 不会自动重建
-
模板镜像其实已经变了
-
-
手动删除每个 Pod,Pod 被重建时会使用新镜像
-
等一个个 Pod 都换完后,再点击 恢复编排,Deployment 状态就恢复为自动控制了。
验证是否真的暂停了?
这个上面已经说过了,再强调一下
可以用 kubectl 查看 Deployment 状态:
总结
操作 | Rancher 中文按钮 | 实际行为 |
---|---|---|
暂停滚动更新 | 暂停编排 | Deployment 进入 paused 状态 |
手动更新 Pod | 删除 Pod | 重建新 Pod 使用新镜像 |
恢复滚动更新 | 恢复编排 | 继续执行更新计划 |