产品部署完成上线之后,经常遇到需要升级服务的要求(只考虑更新镜像),以往操作流程大致如下:

# 方式一:找到 master具体调度到的所有目标node,删除其对应的镜像文件
# 方式二:修改 file.yaml中镜像拉取策略为Always

# 删掉旧pod,并重新创建
kubectl delete -f /path/file.yaml
kubectl create -f /path/file.yaml

但是这样有一个比较棘手的问题,就是如果升级失败的回滚策略。

 

因此我们利用kubernetes自身的滚动升级的工具,部署及升级流程如下:

1. 在初次创建的时候,尽量加入参数 --record,这样k8s会记录下本次启动的脚本 。

# --record
kubectl create -f /path/file.yaml --record

2.执行查看发布的历史记录,会显示现在已经记录的脚本及其序号。

# 查看历史记录
kubectl rollout history deployment deploy-apigw

3.升级命令执行后会输出:xxx   image updated

# 升级镜像
kubectl set image deployment/deploy-name containerName=newIMG:version

# kubectl set image controllerType/controllerInstanceName underInstanceContainerName=image:version

4.查看pod状态,如果失败需要回滚操作

# 回滚到上一个操作版本
kubectl rollout undo deployment/deploy-name
# 回滚到指定版本,版本号由第二步查看获得
kubectl rollout undo deployment/deploy-name --to-revision=3

Notice:

  1. k8s 1.15版本,目前支持 pod (po), replicationcontroller (rc), deployment (deploy), daemonset (ds), replicaset (rs)
  2. 执行rollout undo操作之后,版本号会移动,需要确认版本号无误再undo

Logo

开源、云原生的融合云平台

更多推荐