如何滚动部署?

在 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. 暂停滚动更新

kubectl rollout pause deployment my-app   # my-app 是deployment的名称

2. 更新 Deployment 的镜像(只会更新 template,不触发滚动)

kubectl set image deployment/my-app my-app-container=myapp:v2

现在新镜像已经写入模板,但因为暂停了,不会自动滚动。

3. 一个一个手动删除 Pod(Kubernetes 会自动用新镜像重建)

kubectl delete pod my-app-xxxx # 等新 pod 运行正常,再删除下一个 kubectl delete pod my-app-yyyy

4. 最后恢复滚动更新(可选)

kubectl rollout resume deployment my-app

这种方式适合你手动“确认新版本是否没问题”后再继续更新下一个 Pod

如果是用的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
这个方式可以做到“自动滚动,但一次只更新一个”,然后你可以通过 pauseresume 做阶段控制:

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 服务:

步骤:

  1. 进入 Rancher > 工作负载 > Deployment

  2. 点击由上角⋮ 暂停编排

  3. 然后编辑该 Deployment 的镜像(比如从 v1 改成 v2),保存后:

    • Pod 不会自动重建

    • 模板镜像其实已经变了

  4. 手动删除每个 Pod,Pod 被重建时会使用新镜像

  5. 等一个个 Pod 都换完后,再点击 恢复编排,Deployment 状态就恢复为自动控制了。

验证是否真的暂停了?

这个上面已经说过了,再强调一下

可以用 kubectl 查看 Deployment 状态:

kubectl get deployment <name> -o yaml | grep paused
如果出现 paused: true 说明它真的暂停了。

总结

操作Rancher 中文按钮实际行为
暂停滚动更新 暂停编排 Deployment 进入 paused 状态
手动更新 Pod 删除 Pod 重建新 Pod 使用新镜像
恢复滚动更新 恢复编排 继续执行更新计划
posted @ 2025-07-01 15:18  羊脂玉净瓶  阅读(24)  评论(0)    收藏  举报