有时我们可能需要将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
再查看创建的Pod,会发现新的ReplicaSet创建的1个Pod被卡在镜像拉取过程中。
为了解决上面这个问题,我们需要回滚到之前稳定版本的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=<N>参数:
kubectl rollout history deployment/nginx-deployment --revision=3
现在我们决定撤销本次发布并回滚到上一个部署版本:
kubectl rollout undo deployment/nginx-deployment
当然也可以使用 --to--revision 参数指定回滚到的部署版本号:
kubectl rollout undo deployment/nginx-deployment --to-revision=1
这样,该Deployment就回滚到之前的稳定版本了,可以从Deployment的事件信息中查看到回滚到版本1的操作过程。
暂停和恢复Deployment的部署操作,已完成复杂的修改
对于一次复杂的Deployment配置修改,为了避免频繁触发Deployment的更新操作,可以先暂停Deployment的更新操作,然后进行配置修改,再恢复Deployment,一次性触发完整的更新操作,就可以避免不必要的Deployment更新操作了。
以之前创建的Nginx为例:
kubectl get deployment
通过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被创建出来
查看Deployment的事件信息,可以看到Deployment完成了更新:
注意,在恢复暂停的Deployment之前,无法回滚该Deployment。
小结:
今天我们讲解的内容就到这里了,谢谢大家的支持,多多点关注哦。