K8s 滚动升级与回退

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

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 版本升级/回滚的详细流程。


### Kubernetes 中执行滚动删除的命令 在 Kubernetes 集群中,`rolling update` 和 `rolling delete` 是用于平滑升级和回滚的重要操作。虽然 Kubernetes 并未直接提供名为 `rolling delete` 的命令,但可以通过组合其他命令实现类似功能。 #### 使用 `kubectl rollout undo` 进行版本回退 如果需要撤销最近的一次更新并恢复到之前的版本,可以使用以下命令: ```bash kubectl rollout undo deployment/<deployment-name> -n <namespace> ``` 此命令会将指定 Deployment 回滚到前一版本[^4]。 #### 手动模拟滚动删除 为了实现类似于滚动删除的效果,可以先缩放 Deployment 到零副本数,然后再重新扩展它: ```bash # 将 Pod 数量缩减至 0 kubectl scale deployment/<deployment-name> --replicas=0 -n <namespace> # 等待所有 Pod 被终止后再恢复副本数量 kubectl scale deployment/<deployment-name> --replicas=<desired-replicas> -n <namespace> ``` #### 删除特定资源对象 对于单个 Pod 或其他类型的资源,可以直接使用 `delete` 命令完成删除工作: ```bash [root@master ~]# kubectl delete -f nginxpod.yaml namespace "dev" deleted pod "nginxpod" deleted ``` 上述例子展示了如何基于 YAML 文件定义批量移除多个关联资源的操作方法[^1]。 需要注意的是,在实际生产环境中应谨慎处理此类敏感指令以免误删重要数据或服务中断风险增加。 ### 日志过滤技巧 当排查问题时可能遇到大量无意义的日志干扰分析效率,这时可借助管道符配合正则表达式筛选有用信息出来比如排除掉健康检查请求记录等噪声项: ```bash $ kubectl logs cherry-chart-88d49478c-dmcfv -n charts | grep -vie kube-probe 127.0.0.1 - - [10/Apr/2020:23:01:55 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:75.0) Gecko/20100101 Firefox/75.0" ``` 这里演示了怎样利用简单的 shell 工具有效减少冗余输出提升诊断速度[^3]。 最后提醒一下关于 Service 类型的选择方面考虑到长期维护成本以及灵活性建议优先考虑 Ingress 控制器方案而非传统意义上的 NodePort 或 LoadBalancer 方式除非确实存在特殊场景需求才例外对待[^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

云计算-Security

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

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

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

打赏作者

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

抵扣说明:

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

余额充值