如何将Google Cloud Run配置为单例应用服务?新版本就绪即终止旧版本
解决方案
针对你的Cloud Run后台服务部署时新旧实例共存的问题,可以通过调整旧修订版的最小实例数+分步部署的方式解决,既保证新版本就绪后立刻终止旧实例,又保留旧修订版用于回滚:
核心思路
旧修订版之所以持续运行,是因为你设置了最小实例数=1,即便流量切换到新版本,旧实例仍会保持运行。通过将旧修订版的最小实例数临时设为0,可触发Cloud Run立即终止旧实例,且旧修订版本身不会被删除,随时可以回滚。
具体步骤(使用gcloud CLI)
无流量部署新版本
先部署新版本但不分配流量,确保它完全就绪后再进行后续操作:gcloud run deploy YOUR_SERVICE_NAME \ --image YOUR_NEW_IMAGE_URL \ --no-traffic \ --min-instances 1 \ --max-instances 1 \ --cpu-always-allocated确认新版本就绪
获取新版本的名称,并验证其状态为就绪:# 获取最新部署的修订版名称 NEW_REVISION=$(gcloud run revisions list --service YOUR_SERVICE_NAME --sort-by="metadata.creationTimestamp" --format="value(metadata.name)" | tail -n 1) # 检查是否就绪 gcloud run revisions describe $NEW_REVISION --service YOUR_SERVICE_NAME | grep "Ready: True"调整旧修订版的最小实例数为0
获取旧修订版名称(即当前运行的版本),将其最小实例设为0,触发立即终止:# 获取旧修订版名称(排除刚部署的新版本) OLD_REVISION=$(gcloud run revisions list --service YOUR_SERVICE_NAME --sort-by="metadata.creationTimestamp" --format="value(metadata.name)" | head -n 1) # 设置旧版本最小实例为0 gcloud run revisions update $OLD_REVISION --service YOUR_SERVICE_NAME --min-instances 0将全量流量切换到新版本
完成实例切换后,把流量全部分配给新版本(即便你的后台服务不依赖HTTP流量,这一步可确保路由规则正确):gcloud run services update-traffic YOUR_SERVICE_NAME --to-revisions $NEW_REVISION=100
回滚操作(若新版本出现问题)
如果新版本有bug,只需将旧修订版的最小实例改回1,并切换流量即可:
# 恢复旧版本最小实例 gcloud run revisions update $OLD_REVISION --service YOUR_SERVICE_NAME --min-instances 1 # 切回旧版本流量 gcloud run services update-traffic YOUR_SERVICE_NAME --to-revisions $OLD_REVISION=100
自动化建议
可以把上述步骤封装成Shell脚本,或者使用Cloud Build来自动化部署流程,确保每一步按顺序执行,避免手动操作的失误。
内容的提问来源于stack exchange,提问作者Stewart Bracken
相关产品推荐
相关产品推荐

