理解K8S RollingUpdate

2021-08-19  本文已影响0人  Tommy1989

前言

一直以来,知道K8S具有滚动更新的策略,能支持我们发布的应用实时切换上线,不用停机发布,这个本身也是趋势,但是没有好好的了解过K8S是怎么去实现的,今天正好有人问了我这个问题,所以趁着有时间了解了一下。

常用的部署方式

在了解Rolling Update之前,先说下我们的部署方式,在通常情况下,我们不会直接创建一个Pod或者一个Replica Set,而是通过Deployment去发布一个应用,虽然Deployment跟RS的主要职责是一样的,都是保证Pod的数量和监控,二者大部分功能都是完全一致的,可以把Deployment看成是一个升级版的RS,官方也推荐使用Deployment来管理Pod。具体的区别如下。

Rolling Update

本身Rolling Update是支持RS和Deployment,这里以Deployment Rolling Update为例,当我们更新了Deployment中的应用镜像号后,滚动更新是如何工作的呢?我们可以尝试用命令 $ kubectl get rs -w -n namespace |grep Replica Set Name 来监控整个过程,如下图:

image.png

可以看到执行新的部署后,Deployment会创建一个新的RS(每个RS具有一个hash Id ),上图中的New RS是:7bbc459bdb ,Old RS是:777458cb8d。从监控过程中看到,一开始创建的时候New RS的Pod副本数是0 ,当RS创建完毕后,会更新成Pod数量为1,当创建的pod ready后,在更新Old

RS的Pod副本数量量为1,随后更新New RS Pod副本数量为2,最后在更新Old RS pod数量为0。 这样就实现了Rolling Update策略(rolling update 可以设置滚动升级百分比)。

那么,每个Replica Set 是怎么知道哪些Pod是由自己去控制的呢?

这个就要说到强大的标签管理了,在创建Pod时,有一个pod-template-hash,通过当前RS创建的Pod,这个hash值是一样的,这样就可以分辨新旧版本的Pod,不会出无法分辨的情况了。至此,相信大家已经搞明白Rolling Update是如何工作了。

PS:另外在K8S中 RS的会默认保存10个历史记录加上一个当前的RS,总共11个RS记录(可以调整)方便我们去做回滚。例如,order service的RS的数量如下。

image.png
上一篇 下一篇

猜你喜欢

热点阅读