一、Kubernetes 容器升级概念

传统的网站升级更新,通常是将服务全部下线,业务停止后再更新版本和配置,然后重新启动并提供服务。这样的模式已经完全不能满足发展需求了。

高并发、高可用系统普及的今天,服务的升级更新至少要做到“业务不中断”。而滚动更新(Rolling-update)恰是满足这一需求的一种系统更新升级方案。

滚动更新就是针对多实例服务的一种不中断服务的更新升级方式。一般情况,对于多实例服务,滚动更新采用对各个实例逐个进行单独更新而非同一时刻对所有实例进行全部更新的方式。

对于Kubernetes集群部署的Service来说,Rolling update就是指一次仅更新一个Pod,然后逐个进行更新,而不是在同一时刻将该Service下面的所有Pod shutdown,然后去更新,逐个更新可以避免将业务中断;

kubernetes在kubectl cli工具中仅提供了对Replication Controller的rolling-update支持,通过kubectl -help查看指令信息。

二、Kubernetes 容器升级实战

1、Kubernetes容器升级

1、查看部署列表,获取部署应用名称

kubectl get deployments -n default

滚动升级Java版本 什么是滚动升级_回滚

2、查看正在运行的pod

kubectl get pods -n default

滚动升级Java版本 什么是滚动升级_回滚_02

3、通过pod描述,查看部署程序的当前映像版本

kubectl describe pods -n default

滚动升级Java版本 什么是滚动升级_滚动升级Java版本_03

4、仓库源中提前制作最新更新的镜像,执行如下指令,升级镜像版本即可;(升级之前一定要保证仓库源中有最新提交的镜像),在更新之前要做好镜像,并上传到私有仓库。

私有仓库镜像为(测试使用的镜像):

滚动升级Java版本 什么是滚动升级_滚动升级Java版本_04

2、Kubernetes 容器升级测试

kubectl -n default set image deployments/nginx nginx=192.168.124.20/library/nginx

#其中deployments/nginx    表示部署名称,有上面的命令得到
#nginx=library/tomcat     表示nginx应用部署更新到哪个容器

滚动升级Java版本 什么是滚动升级_副本集_05

Nginx原始容器列表:

滚动升级Java版本 什么是滚动升级_副本集_06

 更新后nginx列表:

滚动升级Java版本 什么是滚动升级_副本集_07

3、Kubernetes 容器升级验证

1)检查K8s更新rollout状态

kubectl -n default rollout status deployments/nginx

滚动升级Java版本 什么是滚动升级_滚动升级Java版本_08

2)检查pod详情

kubectl describe pods -n default

滚动升级Java版本 什么是滚动升级_回滚_09

 三、Kubernetes 容器升级回滚

1、  K8S滚动升级&回滚原理

k8s精确地控制着整个发布过程,分批次有序地进行着滚动更新,直到把所有旧的副本全部更新到新版本。实际上k8s是通过两个参数来精确地控制着每次滚动的pod数量:

  • maxSurge ,滚动更新过程中运行操作期望副本数的最大pod数,可以为绝对数值(eg:5),但不能为0,也可以为百分数(eg:10%),默认为25%;
  • maxUnavailable ,滚动更新过程中不可用的最大pod数,可以为绝对数值(eg:5),但不能为0,也可以为百分数(eg:10%),默认为25%;

1)如果未指定这两个可选参数,则k8s会使用默认配置,查找默认配置指令如下:

kubectl -n default get deployment nginx -o yaml

滚动升级Java版本 什么是滚动升级_nginx_10

查看服务部署概况:

kubectl get deployments -n default

滚动升级Java版本 什么是滚动升级_滚动升级Java版本_11

  • DESIRED 最终期望处于READY状态的副本数;
  • CURRENT 当前的副本总数;
  • UP-TO-DATE 当前完成更新的副本数;
  • AVAILABLE 当前可用的副本数;

 2)查看部署的信息效果:

kubectl -n default describe deployment nginx

整个滚动过程是通过控制两个副本集来完成的:

新副本集:nginx-3359105734;

旧副本集:none

滚动升级Java版本 什么是滚动升级_回滚_12

 

 

滚动升级Java版本 什么是滚动升级_副本集_13

3)理想状态下的滚动过程

  • 创建了一个新的副本集,并为其分配3个新版本的pod,使副本总数达到11,一切正常。
  • 通知旧副本集,销毁2个旧版本的pod,使可用副本总数保持到8,一起正常。
  • 当两个副本销毁成功后,通知新副本集,再新增2个新版本的pod,使副本总数达到11,一切正常。
  • 只要销毁成功,新副本集就会创造新的pod,一直循环,直到旧的副本集pod数量为0。

滚动升级一个服务,实际是创建一个新的RS,然后逐渐将新RS中副本数增加到理想状态,将旧RS中的副本数减小到0的复合操作;

无论理想还是不理想,k8s最终都会使应用程序全部更新到期望状态,都会始终保持最大的副本总数和可用副本总数的不变性

2、Kubernetes 容器升级回滚

K8S容器回滚指令如下(回滚到上一次):

kubectl -n default rollout undo deployments/nginx

滚动升级Java版本 什么是滚动升级_滚动升级Java版本_14

回滚前:

滚动升级Java版本 什么是滚动升级_滚动升级Java版本_15

回滚后:

滚动升级Java版本 什么是滚动升级_nginx_16

2)查看已经部署的版本

kubectl rollout history deploy/nginx

滚动升级Java版本 什么是滚动升级_滚动升级Java版本_17

3)查看某个版本详细信息

kubectl rollout history deployment/nginx --revision=6

滚动升级Java版本 什么是滚动升级_副本集_18

4)k8s完美支持回滚至某个版本,并且还可以通过资源文件进行配置保留的历史版次量。K8S回滚某个版本命令如下:

kubectl -n default rollout undo deployment/nginx  --to-revision=6

滚动升级Java版本 什么是滚动升级_回滚_19

回滚前:

滚动升级Java版本 什么是滚动升级_副本集_20

回滚后:

滚动升级Java版本 什么是滚动升级_回滚_21