ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
有的时候由于升级后的 Deployment 不稳定,我们需要将 Deployment 回滚到旧的版本。默认情况下,kubernetes 会在系统中保存所有 Deployment 的 rollout 历史记录,方便随时回退。 这里需要注意的是,只有更新 Deployment template 中的 label 和 image,才会创建一个新的 revision,而扩缩容不会创建 revision,所以回退历史 revision 时,只有 Deployment 中的 template 部分才会回退。 比如我们先进行一次升级,要修改容器的镜像,但是不小心手误写成了`nginx:1.91`,这是一个不存在的版本镜像,所以 Deployment 不会更新成功: ~~~bash $ kubectl set image deployment/nginx-deployment nginx=nginx:1.91 deployment.extensions/nginx-deployment image updated ~~~ 查看 Deployment 的部署过程以及 RS 的状态: ~~~bash # 可以看到部署过程卡住了,按 Ctrl+C 终止查看 $ kubectl rollout status deployments nginx-deployment Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated... ^C # 新创建的 nginx-deployment-5b4b548d5f RS 也卡在了第一个 Pod 的创建过程中,主要是镜像拉取不成功 $ kubectl get rs NAME DESIRED CURRENT READY AGE nginx-deployment-5754944d6c 0 0 0 4h23m nginx-deployment-5b4b548d5f 1 1 0 52s nginx-deployment-7448597cd5 3 3 3 126m nginx-deployment-8ff4cd577 3 3 3 26m ~~~ 使用`kubectl rollout history`命令查看部署的历史记录,由于我们在创建 Deployment 的时候没有使用`--record`参数,CHANGE-CAUSE 中没有记录下更新每个版本使用的命令,大家在创建的时候可以把这个参数加上: ~~~bash $ kubectl rollout history deployment/nginx-deployment deployment.extensions/nginx-deployment REVISION CHANGE-CAUSE 1 <none> 2 <none> ~~~ 使用`--revision=<N>`参数可以查看特定版本的详细信息: ~~~bash $ kubectl rollout history deployment/nginx-deployment --revision=2 deployment.extensions/nginx-deployment with revision #2 Pod Template: Labels: app=nginx k8s=nginx-pod pod-template-hash=5b4b548d5f Containers: nginx: Image: nginx:1.91 Port: 80/TCP Host Port: 0/TCP Environment: <none> Mounts: <none> Volumes: <none> ~~~ 撤销本次发布并回滚到上一个部署版本: ~~~bash $ kubectl rollout undo deployment/nginx-deployment deployment.extensions/nginx-deployment rolled back # 也可以使用参数 --to-revision 指定回滚到的部署版本 $ kubectl rollout undo deployment/nginx-deployment --to-revision=1 ~~~ 现在检查 Deployment 是否回滚到了上一个版本: ~~~bash $ kubectl describe deployment/nginx-deployment ... Pod Template: Labels: app=nginx k8s=nginx-pod Containers: nginx: Image: nginx:1.9.1 ... NewReplicaSet: nginx-deployment-8ff4cd577 (3/3 replicas created) Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ScalingReplicaSet 30m deployment-controller Scaled up replica set nginx-deployment-8ff4cd577 to 3 Normal ScalingReplicaSet 4m50s deployment-controller Scaled up replica set nginx-deployment-5b4b548d5f to 1 Normal ScalingReplicaSet 22s deployment-controller Scaled down replica set nginx-deployment-5b4b548d5f to 0 ~~~ 从 Events 事件中可以看到 Deployment 回滚的过程是:先创建一个新 RS(nginx-deployment-8ff4cd577)扩容到 3 个 Pod,然后旧的 RS(nginx-deployment-5b4b548d5f)的 Pod 从 1 缩减为 0。