文章目录
传统的网站升级更新,一般是将服务所有下线,业务中止后再更新版本和配置,而后从新启动并提供服务。这样的模式已经彻底不能知足发展需求了。
高并发、高可用系统普及的今天, 服务的升级更新至少要作到“业务不中断”。而滚动更新(Rolling-update)恰是知足这一需求的一种系统更新升级方案。
滚动更新就是针对多实例服务的一种不中断服务的更新升级方式。通常状况,对于多实例服务,滚动更新采用对各个实例逐个进行单独更新而非同一时刻对全部实例进行所有更新的方式。
kubernetes在kubectl cli工具中仅提供了对Replication Controller的rolling-update支持,经过kubectl -help查看指令信息;nginx
Kubernetes POD 容器升级实战
一、查看各pod容器组的容器更新状况
注:这个命令通常在滚动更新时,会时刻使用查看。docker
kubectl get deployment -n default #default为默认的命名空间,通常来讲企业中会指定地域做为命名空间
- DESIRED 最终指望处于READY状态的副本数;
- CURRENT 当前的副本总数;
- UP-TO-DATE 当前完成更新的副本数;
- AVAILABLE 当前可用的副本数;
指定命名空间:
能够编辑yaml文件修改上面的参数值,而后kubectl建立。还能够:
点击建立,点击高级选项,能够建立命名空间。shell
二、查看pod组运行状况
kubectl get pod -n default
三、查看部署的信息效果
kubectl describe deployment registry-wujincheng-com -n default
四、容器升级更新
仓库源中提早制做最新更新的镜像,执行以下指令,升级镜像版本便可;(升级以前必定要保证仓库源中有最新提交的镜像)tomcat
kubectl set image deployment/tomcat-wujincheng-com tomcat-wujincheng-com=docker.io/nginx -n default
五、查看容器升级更新进程
kubectl -n default rollout status deployment/tomcat-wujincheng-com
注:通常来讲咱们更新默认都是一个一个更新的。并发
注:首先说明tomcat这个pod组里只有4个容器,DESIRED从更新开始到结束都等于pod组里的容器数,表示最终应该有多少个容器处于READY状态,当前更新完成的容器为2,当前可用容器数为3,一个一个更新,因此只会有一个处于不可用状态,因此更新过程当中,这个状态一直都为3.
上面我把更新过程当中的各个状态的变化都表达出来了。
下一点注意一下为啥CURRENT超出了4,变成了5。高并发
六、滚动更新过程详解
结合下图理解下方过程详解:
2+3等于当前副本总数5.
滚动更新的过程:
注意这里说的是每次更新一个容器的状况。工具
- 建立了一个新的副本集,并为其分配2个新版本的容器,销毁1个旧版本的容器,使副本总数达到5,一切正常。
- 通知新副本集,建立并运行一个容器,使可用副本总数保持到3,一块儿正常。
- 当1个旧副本又销毁成功后,通知新副本集,建立并运行一个新版本容器,使新版本容器总数达到4,一切正常。
- 当新版本容器总数达到DESIRED数时,便再也不建立容器,销毁一个旧副本容器,便运行一个新版本容器便可。
总结:其实滚动更新,就是原来那个副本集不断销毁容器,直到销毁完。建立新的副本集不断增长容器(副本),直到达到DESIRED数。只是销毁和建立运行之间相关联
而已!网站
七、容器版本回滚
回滚到更新前的版本(上一个版本):spa
kubectl rollout undo deployments/tomcat-wujincheng-com -n default
八、查看是否回滚
kubectl -n default rollout status deployments/nginx-v1
最开始咱们是把tomcat变nginx,回滚后应该就是tomcat了。
kubectl describe pod/tomcat-wujincheng-com-3184522042-0jh7q -n default
回滚成功!
重点命令搭配总结:.net
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
九、pod容器组采用的镜像历史版本
(1)查看曾经部署过的版本
kubectl rollout history deploy/tomcat-wujincheng-com
(2)查看某个版本详细信息
kubectl rollout history deployment/tomcat-wujincheng-com --revision=8
(3)k8s完美支持回滚至某个版本
kubectl rollout undo deployment/tomcat-wujincheng-com --to-revision=2 -n default
十、设置每次更新的容器数目
k8s精确地控制着整个发布过程,分批次有序地进行着滚动更新,直到把全部旧的副本所有更新到新版本。实际上k8s是经过两个参数来精确地控制着每次滚动的pod数量:
- maxSurge,滚动更新过程当中运行操做指望副本数的最大pod数,能够为绝对数值(eg:5),但不能为0,也能够为百分数(eg:10%),默认为25%;
- maxUnavailable,滚动更新过程当中不可用的最大pod数,能够为绝对数值(eg:5),但不能为0,也能够为百分数(eg:10%),默认为25%;
注:通常这两个值相同!
若是未指定这两个可选参数,则k8s会使用默认配置,查找默认配置指令以下:
kubectl get deployment tomcat-wujincheng-com -o yaml -n default
修改maxSurge、maxUnavailable值:
成功!
十一、删除不正常状态的容器
怎样删除?
这样子删除不掉的!
kubectl delete pod tomcat-wujincheng-com-4175885076-j1vnz –grace-period=0 --force -n default
一条命令搞定:
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界面上点击删除按钮便可,只有删除容器组中的容器才须要命令,才能完全删除。
注意:照上面作了还有该容器组的容器起来的话,继续疯狂执行上条命令!
成功删除tomcat-wujincheng-com容器组!