背景
- 在日常开发特别是测试过程中,由于发布版本经常需要对pods进行升级,由于是采用Deployment的方式部署,则本身就支持RollingUpdate的方式来进行滚动升级了
滚动升级命令
- 先确认下 <namespace>下对应<deployment>下有那些pods,并且执行是否正式。
kubectl -n <namespace> get deployment | grep <your_deployment>
- 滚动升级的流程
- 通过set image + rollout pause让pods滚动升级过程进行暂停(仅有类型为deployment的pods控制器支持,rs不支持)。
- 若灰度过程符合预期,则执行rollout resume继续执行
- 若灰度过程不符合预期,则需先继续执行后回滚到上个版本(rollout resume+ rollout undo),此时会牺牲掉一个老pod!
--关于灰度升级的过程
kubectl -n <namespace> set image deployment <your_deploy> <containers.name>=<containers.image> && kubectl -n <namespace> rollout pause deployment <your_deploy>
--- 如果升级顺利的话,就点击继续
kubectl -n <namespace> rollout resume deployment <your_deploy>
--- 如果升级需要回滚的话,先继续,后回滚
kubectl -n <namespace> rollout resume deployment <your_deploy> && kubectl -n <namespace> rollout undo deployment <your_deploy>
- 执行后就看到老的pods任务变成Terminating,等新的pods PodInitializing成功后即可服务
回滚命令介绍
- 查看image的回滚列表:kubectl -n <namespace> rollout history deployment/<deployment_name>,比如可以看到以下的历史版本清单:
REVISION CHANGE-CAUSE
2 <none>
3 <none>
-查看image的详情:kubectl -n <namespace> rollout history deployment/<deployment_name> --revision=2
-回滚到对应image: kubectl -n <namespace> rollout undo deployment/<deployment_name> --to-revision=1
关于更新
- 常用部署方式如滚动发布/蓝绿部署/金丝雀部署(灰度)
- 其中金丝雀部署可见文章:https://kuboard.cn/learning/k8s-intermediate/workload/wl-deployment/canary.html