Kubernetes滚动更新介绍及使用

我们 k8s集群使用的是1.7.7版本的,该版本中官方已经推荐使用 Deployment代替 Replication Controller(rc)了, Deployment继承了rc的全部功能外,还可以查看升级详细进度和状态,当升级出现问题的时候,可以使用回滚操作回滚到指定的版本,每一次对Deployment的操作,都会保存下来,变能方便的进行回滚操作了,另外对于每一次升级都可以随时暂停和启动,拥有多种升级方案: Recreate删除现在的 Pod,重新创建; RollingUpdate滚动升级,逐步替换现有 Pod,对于生产环境的服务升级,显然这是一种最好的方式。

创建Deployment

Deployment结构

可以看出一个Deployment拥有多个Replica Set,而一个Replica Set拥有一个或多个Pod。一个Deployment控制多个rs主要是为了支持回滚机制,每当Deployment操作时,Kubernetes会重新生成一个Replica Set并保留,以后有需要的话就可以回滚至之前的状态。 下面创建一个Deployment,它创建了一个Replica Set来启动3个nginx pod,yaml文件如下:

将上面内容保存为: nginx-deployment.yaml,执行命令:

然后执行一下命令查看刚刚创建的Deployment:

隔一会再次执行上面命令:

我们可以看到Deployment已经创建了3个Replica Set了,执行下面的命令查看rs和pod:

上面的Deployment的yaml文件中的 replicas:3将会保证我们始终有3个POD在运行。

滚动升级Deployment

现在我们将刚刚保存的yaml文件中的nginx镜像修改为 nginx:1.13.3,然后在spec下面添加滚动升级策略:

  • minReadySeconds:
    • Kubernetes在等待设置的时间后才进行升级
    • 如果没有设置该值,Kubernetes会假设该容器启动起来后就提供服务了
    • 如果没有设置该值,在某些极端情况下可能会造成服务服务正常运行
  • maxSurge:
    • 升级过程中最多可以比原先设置多出的POD数量
    • 例如:maxSurage=1,replicas=5,则表示Kubernetes会先启动1一个新的Pod后才删掉一个旧的POD,整个升级过程中最多会有5 1个POD。
  • maxUnavaible:
    • 升级过程中最多有多少个POD处于无法提供服务的状态
    • maxSurge不为0时,该值也不能为0
    • 例如:maxUnavaible=1,则表示Kubernetes整个升级过程中最多会有1个POD处于无法服务的状态。

然后执行命令:

然后我们可以使用 rollout命令:

  • 查看状态:

  • 暂停升级

  • 继续升级

升级结束后,继续查看rs的状态:

根据AGE我们可以看到离我们最近的当前状态是:3,和我们的yaml文件是一致的,证明升级成功了。用 describe命令可以查看升级的全部信息:

回滚Deployment

我们已经能够滚动平滑的升级我们的Deployment了,但是如果升级后的POD出了问题该怎么办?我们能够想到的最好最快的方式当然是回退到上一次能够提供正常工作的版本,Deployment就为我们提供了回滚机制。

首先,查看Deployment的升级历史:

从上面的结果可以看出在执行Deployment升级的时候最好带上 record参数,便于我们查看历史版本信息。同样我们可以使用下面的命令查看单个REVISION的信息:

假如现在要直接回退到当前版本的前一个版本:

当然也可以用 revision回退到指定的版本:

现在可以用命令查看Deployment现在的状态了。

注意清除机制

前面在用 apply命令滚动升级Deployment后,无意间在 Dashboard中发现了 Replica Sets下面有很多Pods为 0/0的RS,由于本人有轻微的强迫症,眼里是容不下 0/0这种东西的,然后就给 删除了,结果后面更新的时候又出现了,以为是yaml脚本有误,结果到现在才清楚这个是用于Deployment回滚用的,不能随便删除的(感觉自己就是个棒槌啊~~~)。RS不能随便删除

Kubernetes默认是会将Deployments的每次改动操作生成一个新的RS,并保存下来的。不过你可以设置参数 .spec.revisonHistoryLimit来来指定Deployment最多保留多少revision 历史记录。如果将该项设置为0,Deployment就不允许回退了

 

 

参考链接:

https://blog.qikqiak.com/post/kubernetes-rollout-update/

https://tachingchen.com/tw/blog/kubernetes-rolling-update-with-deployment/

https://blog.csdn.net/WaltonWang/article/details/77461697

 

 

 

Leave a Reply

Your email address will not be published.