如何在GCP生产部署失败时快速回滚至之前的可用镜像?
嘿,我完全懂你现在的焦虑——生产部署时构建炸了,还有一堆用户在正常用着,得赶紧切回之前的稳定版本对吧?别担心,咱们用GCP自带的工具就能快速搞定,不用绕弯路去拉取再推送镜像然后执行gcloud build submit(你之前踩的坑很正常,因为这条命令本来就是用来从本地文件夹构建新镜像的,不是部署已有镜像)。
下面分两种最常用的场景给你解决方案:
场景1:你用的是Google Cloud Deploy流水线(即平时用gcloud deploy的方式)
这是最直接的回滚方式,因为Cloud Deploy本身就保留了所有历史部署记录:
先找到之前成功的版本
运行这条命令列出你的流水线所有发布记录,找到那个你想回滚到的、状态为成功的release ID:gcloud deploy releases list --delivery-pipeline=你的流水线名称 --region=你的GCP区域替换里面的
你的流水线名称和你的GCP区域(比如us-central1),执行后你会看到类似这样的输出,重点找STATE为SUCCESS的条目:NAME STATE TARGETS release-20240520 SUCCESS prod release-20240519 FAILURE prod release-20240518 SUCCESS prod执行回滚操作
用找到的成功release ID,运行这条命令把它重新推送到生产目标:gcloud deploy releases promote --release=你要回滚的release ID --delivery-pipeline=你的流水线名称 --region=你的GCP区域 --to-target=你的生产环境目标名比如你的生产目标叫
prod,release ID是release-20240518,那命令就是:gcloud deploy releases promote --release=release-20240518 --delivery-pipeline=my-app-pipeline --region=us-central1 --to-target=prod这条命令会直接把之前成功的版本重新部署到生产环境,全程不用重新构建,速度很快。
场景2:你直接部署到Cloud Run/GKE这类服务(未通过Cloud Deploy流水线)
如果你的应用是直接部署到Cloud Run或者GKE,那可以直接指定已有的镜像版本进行部署:
针对Cloud Run:
运行这条命令,直接指定你之前的稳定镜像地址:
gcloud run deploy 你的服务名称 --image=gcr.io/你的GCP项目ID/你的镜像名:稳定版本标签 --region=你的GCP区域
比如你的镜像标签是v1.0.0,那命令就是:
gcloud run deploy my-app-service --image=gcr.io/my-project-12345/my-app:v1.0.0 --region=us-central1
针对GKE:
用kubectl直接更新部署的镜像:
kubectl set image deployment/你的部署名称 你的容器名称=gcr.io/你的GCP项目ID/你的镜像名:稳定版本标签 -n 你的命名空间
额外建议
为了以后回滚更顺畅,建议你每次成功构建后,给镜像打上明确的、可追溯的标签(比如Git commit hash、版本号v1.0.1这类),而不是只用latest标签,这样你能快速定位到要回滚的版本,避免混乱。
内容的提问来源于stack exchange,提问作者Rakhi

