K8s 滚动升级与回退

本文详细介绍了Kubernetes中的Rolling Update功能,通过实例展示了如何升级Nginx镜像并确保业务连续性。同时,讲解了回滚机制,包括如何查看历史版本、记录变更和进行版本回退,确保在出现问题时能够快速恢复服务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

k8s-cert



前言

Rolling Update 即滚动更新,先更新一部分副本,成功后再继续更新更多副本,最终完成所有的副本更新。前面说到动态伸缩容并不会触发上线,仅当 Deployment Pod 模板(即 .spec.template)发生改变时才会触发上线。且上线实现了滚动特点,其好处就是无需停服的状态下即可完成服务升级,从而保证了业务的连续性。

接下来以更新 Nginx 容器镜像的版本号为例进行演示与验证。

一、升级

刚刚把副本数从 2 ——> 3,执行 kubectl apply -f nginx.yml 启动服务,可看到并没有触发上线/滚动更新:

image-20221220143311821

接着修改镜像的版本号,从 1.20.0 ——> 1.21.4

image-20221220143737833

再次启动服务,看看镜像版本是否已更新:

image-20221220144111103

看看 Pod 是否正常运行:

image-20221220144225750

小结:可看到,原来 ReplicaSet nginx-6b6cf7569 的三个 nginx:1.20.0 Pod已经被ReplicaSet nginx-7bfd89cc74的三个nginx:1.21.4 Pod替换了。

再来看看 deployment 的详情,看看具实现过程:

image-20221220144900690

其流程就是:

  • ReplicaSet nginx-7bfd89cc74 新增一个 Pod,总数为 1;
  • ReplicaSet nginx-6b6cf7569 减少一个 Pod,总数为 2(也就是说至少还有两个 Pod 是正常对外提供服务的);
  • ReplicaSet nginx-7bfd89cc74 新增一个 Pod,总数为 2;
  • ReplicaSet nginx-6b6cf7569 减少一个 Pod,总数为 2(也就是说至少还有一个 Pod 是正常对外提供服务的);
  • ReplicaSet nginx-7bfd89cc74 新增一个 Pod,总数为 3;
  • ReplicaSet nginx-6b6cf7569 减少一个 Pod,总数为 0(此时 ReplicaSet nginx-6b6cf7569 已经没有 Pod 了)。

可看到,其更新方式是以滚动的形式实现的,从而保证了业务的连续性。

二、回滚

K8s 在每次 kubectl apply 更新应用时,都会记录当前的配置,比如我原本的 Nginx 镜像为 1.20.0,那这个 1.20.0 及其其他信息都会被记录下来,其目的就是方便我们上线失败后可以回到正常的那个镜像版本。

默认情况下,K8s 只会保留近 10 个的 revision,我们可以在 Deployment 配置文件中使用 revisionHistoryLimit 字段来指定 revision 的保留数量。

kubectl edit deployment nginx

image-20221220150436717

看看可回滚的历史版本:

kubectl rollout history deployment nginx

image-20221220151203399

虽然可看到有 2、3、4 这三个可会退的版本,但是 CHANGE-CAUSE 这个字段均为 <none>,这就不太利于我们进行版本会退,想要显示CHANGE-CAUSE 值,需要在 kubectl apply 时添加 --record 参数。所以这里重新在写两个 Deployment 的 YML 文件再来启动服务。

  • nginx-a.yml

    image-20221220151707689

  • nginx-b.yml

    image-20221220151801454

分别进行 kubectl apply 更新应用:

kubectl apply -f nginx-a.yml --record
kubectl apply -f nginx-b.yml --record

image-20221220152324505

这样就能看到你是指定的哪个 YAML 文件启动的,但是这个 --record 已经被弃用了,除了这种方法之外,我们可以通过指定具体的 revision 编号来查看其详细信息,这样你就可以根据实际情况会退到具体版本,比如我们查看 revision 为 4 的版本信息。

kubectl rollout history deployment nginx --revision=4

image-20221220153002310

版本会退验证:

  • 先看看当前的 Pod 的 image 版本

    kubectl get deployment nginx -o wide
    

    image-20221220153136787

  • 比如就回到我们 revision 为 4 的版本

    kubectl rollout undo deployment nginx --to-revision=4
    

    image-20221220153805798

  • 会退完成,再次验证当前 image 镜像

    kubectl get deployment nginx -o wide
    

    image-20221220154136759

    可看到版本会退成功!

以上就是 K8s Pod 版本升级/回滚的详细流程。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云计算-Security

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值