文章目录

  • Kubernetes POD 容器升级实战
  • 1、查看各pod容器组的容器更新情况
  • 2、查看pod组运行情况
  • 3、查看部署的信息效果
  • 4、容器升级更新
  • 5、查看容器升级更新进程
  • 6、滚动更新过程详解
  • 7、容器版本回滚
  • 8、查看是否回滚
  • 9、pod容器组采用的镜像历史版本
  • (1)查看曾经部署过的版本
  • (2)查看某个版本详细信息
  • (3)k8s完美支持回滚至某个版本
  • 10、设置每次更新的容器数目
  • 11、删除不正常状态的容器



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


高并发、高可用系统普及的今天,

服务的升级更新至少要做到“业务不中断”。而滚动更新(Rolling-update)恰是满足这一需求的一种系统更新升级方案。


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

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

Kubernetes POD 容器升级实战

1、查看各pod容器组的容器更新情况

注:这个命令一般在滚动更新时,会时刻使用查看。

kubectl get deployment -n default
#default为默认的命名空间,一般来说企业中会指定地域作为命名空间

kubernetes 不从本地拉取镜像 kubectl更新镜像_tomcat





指定命名空间:

kubernetes 不从本地拉取镜像 kubectl更新镜像_kubernetes 不从本地拉取镜像_02

kubernetes 不从本地拉取镜像 kubectl更新镜像_kubernetes_03

可以编辑yaml文件修改上面的参数值,然后kubectl创建。还可以:

kubernetes 不从本地拉取镜像 kubectl更新镜像_新版本_04

点击创建,点击高级选项,可以创建命名空间。

2、查看pod组运行情况
kubectl get pod -n default

kubernetes 不从本地拉取镜像 kubectl更新镜像_kubernetes 不从本地拉取镜像_05

3、查看部署的信息效果
kubectl describe deployment registry-wujincheng-com -n default

kubernetes 不从本地拉取镜像 kubectl更新镜像_新版本_06

4、容器升级更新

仓库源中提前制作最新更新的镜像,执行如下指令,升级镜像版本即可;(升级之前一定要保证仓库源中有最新提交的镜像)

kubectl set image deployment/tomcat-wujincheng-com tomcat-wujincheng-com=docker.io/nginx  -n default
5、查看容器升级更新进程
kubectl -n default rollout status deployment/tomcat-wujincheng-com

kubernetes 不从本地拉取镜像 kubectl更新镜像_新版本_07

注:一般来说我们更新默认都是一个一个更新的。注:首先说明tomcat这个pod组里只有4个容器,DESIRED从更新开始到结束都等于pod组里的容器数,表示最终应该有多少个容器处于READY状态,当前更新完成的容器为2,当前可用容器数为3,一个一个更新,所以只会有一个处于不可用状态,所以更新过程中,这个状态一直都为3.

kubernetes 不从本地拉取镜像 kubectl更新镜像_回滚_08


kubernetes 不从本地拉取镜像 kubectl更新镜像_回滚_09

kubernetes 不从本地拉取镜像 kubectl更新镜像_新版本_10

kubernetes 不从本地拉取镜像 kubectl更新镜像_kubernetes 不从本地拉取镜像_11

kubernetes 不从本地拉取镜像 kubectl更新镜像_新版本_12

kubernetes 不从本地拉取镜像 kubectl更新镜像_tomcat_13

上面我把更新过程中的各个状态的变化都表达出来了。

下一点注意一下为啥CURRENT超出了4,变成了5。

6、滚动更新过程详解

结合下图理解下方过程详解:

kubernetes 不从本地拉取镜像 kubectl更新镜像_新版本_14

kubernetes 不从本地拉取镜像 kubectl更新镜像_tomcat_15

2+3等于当前副本总数5.

kubernetes 不从本地拉取镜像 kubectl更新镜像_tomcat_16

kubernetes 不从本地拉取镜像 kubectl更新镜像_回滚_17

滚动更新的过程:

注意这里说的是每次更新一个容器的情况。





总结:其实滚动更新,就是原来那个副本集不断销毁容器,直到销毁完。创建新的副本集不断增加容器(副本),直到达到DESIRED数。只是销毁和创建运行之间相关联
而已!

7、容器版本回滚

回滚到更新前的版本(上一个版本):

kubectl rollout undo deployments/tomcat-wujincheng-com -n default
8、查看是否回滚
kubectl -n default rollout status deployments/nginx-v1

kubernetes 不从本地拉取镜像 kubectl更新镜像_回滚_18


最开始我们是把tomcat变nginx,回滚后应该就是tomcat了。

kubernetes 不从本地拉取镜像 kubectl更新镜像_新版本_19

kubectl describe pod/tomcat-wujincheng-com-3184522042-0jh7q -n default

kubernetes 不从本地拉取镜像 kubectl更新镜像_tomcat_20

回滚成功!

重点命令搭配总结:

kubectl get pod -n default
kubectl describe pod/tomcat-wujincheng-com-3184522042-0jh7q -n default
kubectl get deployment -n default
kubectl describe deployment/tomcat-wujincheng-com -n default
kubectl get svc -n default
kubectl describe svc/kubernetes -n default
9、pod容器组采用的镜像历史版本
(1)查看曾经部署过的版本
kubectl rollout history deploy/tomcat-wujincheng-com

kubernetes 不从本地拉取镜像 kubectl更新镜像_tomcat_21

(2)查看某个版本详细信息

kubectl rollout history deployment/tomcat-wujincheng-com --revision=8

kubernetes 不从本地拉取镜像 kubectl更新镜像_kubernetes 不从本地拉取镜像_22

(3)k8s完美支持回滚至某个版本
kubectl rollout undo deployment/tomcat-wujincheng-com  --to-revision=2  -n default

kubernetes 不从本地拉取镜像 kubectl更新镜像_kubernetes_23

10、设置每次更新的容器数目

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



注:一般这两个值相同!
如果未指定这两个可选参数,则k8s会使用默认配置,查找默认配置指令如下:

kubectl get deployment tomcat-wujincheng-com -o yaml  -n default

kubernetes 不从本地拉取镜像 kubectl更新镜像_kubernetes 不从本地拉取镜像_24

修改maxSurge、maxUnavailable值:

kubernetes 不从本地拉取镜像 kubectl更新镜像_回滚_25

kubernetes 不从本地拉取镜像 kubectl更新镜像_新版本_26


成功!

11、删除不正常状态的容器

kubernetes 不从本地拉取镜像 kubectl更新镜像_tomcat_27

怎样删除?

kubernetes 不从本地拉取镜像 kubectl更新镜像_kubernetes_28

这样子删除不掉的!

kubectl delete pod tomcat-wujincheng-com-4175885076-j1vnz –grace-period=0 --force -n default

kubernetes 不从本地拉取镜像 kubectl更新镜像_kubernetes 不从本地拉取镜像_29

一条命令搞定:

for i in `kubectl get pod -n default|awk '{print $1}'|grep tomcat-wujincheng-com-4175885076`;do kubectl delete pod $i –grace-period=0 --force -n default;done

如果这个容器组还有用的话,这样删除之后,会重新起来相应台容器。

删除容器组名为tomcat-wujincheng-com里的所有容器命令:

for i in `kubectl get pod -n default|awk '{print $1}'|grep tomcat-wujincheng-com`;do kubectl delete pod $i –grace-period=0 --force -n default;done

彻底删除这个容器组的话,需要先把对应的部署、服务、副本集全部删除,这个在k8s界面上点击删除按钮即可,只有删除容器组中的容器才需要命令,才能彻底删除。

注意:照上面做了还有该容器组的容器起来的话,继续疯狂执行上条命令!

kubernetes 不从本地拉取镜像 kubectl更新镜像_kubernetes 不从本地拉取镜像_30

成功删除tomcat-wujincheng-com容器组!