带你玩转kubernetes-k8s(第22篇:k8s-深入掌握Pod-Deployment的回滚,暂停和恢复)

    有时我们可能需要将Deployment回滚到旧版本。在默认情况下,所有Deployment的发布历史记录都被保留在系统中,以便于我们随时进行回滚(可以配置你是记录数量)。

   假设在更新Deployment镜像时,将容器镜像名误设置成Nginx:1.91(一个不存在的镜像),此时Deployment的部署过程会卡住:

kubectl set image deployment/nginx-deployment nginx=nginx:1.91
kubectl rollout status deployments nginx-deployment

 

由于执行过程卡住,所以需要执行Ctrl-C命令来终止这个查看命令。
查看ReplicaSet,可以看到新建的ReplicaSet

带你玩转kubernetes-k8s(第22篇:k8s-深入掌握Pod-Deployment的回滚,暂停和恢复)_第1张图片

再查看创建的Pod,会发现新的ReplicaSet创建的1个Pod被卡在镜像拉取过程中。

带你玩转kubernetes-k8s(第22篇:k8s-深入掌握Pod-Deployment的回滚,暂停和恢复)_第2张图片

为了解决上面这个问题,我们需要回滚到之前稳定版本的Deployment。
首先,用kubectl rollout history命令检查这个Deployment部署的历史记录:

kubectl rollout history deployment/nginx-deployment

注意,在创建Deployment时使用--record参数,就可以在CHANGE-CAUSE列看到每个版本使用的命令了。另外,Deployment的更新操作是在Deployment进行部署(Rollout)时被触发的,这意味着当且仅当Deployment的Pod模板(即spec.template)被更改时才会创建新的修订版本,例如更新模板标签或容器镜像。其他更新操作(如扩展副本数)将不会触发Deployment的更新操作,这也意味着我们将Deployment回滚到之前的版本时,只有Deployment的Pod模板部分会被修改。
如果需要查看特定版本的详细信息,则可以加上--revision=参数:

kubectl rollout history deployment/nginx-deployment --revision=3

带你玩转kubernetes-k8s(第22篇:k8s-深入掌握Pod-Deployment的回滚,暂停和恢复)_第3张图片

现在我们决定撤销本次发布并回滚到上一个部署版本:

kubectl rollout undo deployment/nginx-deployment

当然也可以使用 --to--revision 参数指定回滚到的部署版本号:

kubectl rollout undo deployment/nginx-deployment --to-revision=1

带你玩转kubernetes-k8s(第22篇:k8s-深入掌握Pod-Deployment的回滚,暂停和恢复)_第4张图片

这样,该Deployment就回滚到之前的稳定版本了,可以从Deployment的事件信息中查看到回滚到版本1的操作过程。

带你玩转kubernetes-k8s(第22篇:k8s-深入掌握Pod-Deployment的回滚,暂停和恢复)_第5张图片

 

暂停和恢复Deployment的部署操作,已完成复杂的修改

      对于一次复杂的Deployment配置修改,为了避免频繁触发Deployment的更新操作,可以先暂停Deployment的更新操作,然后进行配置修改,再恢复Deployment,一次性触发完整的更新操作,就可以避免不必要的Deployment更新操作了。

     以之前创建的Nginx为例:

kubectl get deployment

带你玩转kubernetes-k8s(第22篇:k8s-深入掌握Pod-Deployment的回滚,暂停和恢复)_第6张图片

通过kubectl rollout pause命令暂停deployment的更新操作

kubectl rollout pause deployment/nginx-deployment

之后修改Deployment的镜像信息:

kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1

查看Deployment的历史记录,并发现没有触发新的Deployment部署操作

kubectl rollout history deployment/nginx-deployment

在暂停Deployment不是之后,可以根据需要进行任意次数的配置更新。例如,再次更新容器的资源限制:

kubectl set resources deployment nginx-deployment -c=nginx --limits=cpu=200m,memory=512Mi

最后,恢复这个Deployment的部署操作:

kubectl rollout resume deploy nginx-deployment

可以看到一个新的ReplicaSet被创建出来

带你玩转kubernetes-k8s(第22篇:k8s-深入掌握Pod-Deployment的回滚,暂停和恢复)_第7张图片

查看Deployment的事件信息,可以看到Deployment完成了更新:

带你玩转kubernetes-k8s(第22篇:k8s-深入掌握Pod-Deployment的回滚,暂停和恢复)_第8张图片

 

注意,在恢复暂停的Deployment之前,无法回滚该Deployment。

小结:

     今天我们讲解的内容就到这里了,谢谢大家的支持,多多点关注哦。

你可能感兴趣的:(kubernetes)