Google托管VM实例组创建/替换时无法获取最新镜像问题
问题诊断与解决方案
你的问题核心是Cloud Build流程的时序错误:当前配置中,镜像推送操作是在所有steps执行完成后才触发的,但你在第二个step就执行了实例组滚动替换。这时候新构建的镜像还没上传到GCR,实例拉取的还是旧版本镜像。等Cloud Build跑完完成镜像推送后,手动再触发一次触发器,此时新镜像已经存在,替换才会生效,所以出现了“滞后一个版本”的现象。
修复方案:调整镜像推送时机
修改Cloud Build配置,在steps中手动完成镜像推送,确保新镜像上传完成后再执行滚动替换:
steps: - name: gcr.io/cloud-builders/docker args: [ build, -t, gcr.io/$PROJECT_ID/$_APP_NAME, . ] # 新增手动推送步骤,确保镜像上传完成后再执行替换 - name: gcr.io/cloud-builders/docker args: [ push, gcr.io/$PROJECT_ID/$_APP_NAME ] - name: gcr.io/cloud-builders/gcloud args: [ compute, instance-groups, managed, rolling-action, replace, $_INSTANCE_GROUP_NAME, --region=$_INSTANCE_GROUP_REGION, --max-unavailable=0, --max-surge=3 ] # 可选:保留images字段不影响,也可以删除 images: - gcr.io/$PROJECT_ID/$_APP_NAME
额外优化:避免标签覆盖的缓存问题
如果希望彻底避免镜像标签覆盖导致的缓存或同步问题,可以给每个构建的镜像添加唯一标签(比如Git提交哈希),同时更新实例模板使用该标签后再执行替换:
steps: - name: gcr.io/cloud-builders/docker args: [ build, -t, gcr.io/$PROJECT_ID/$_APP_NAME:$COMMIT_SHA, . ] - name: gcr.io/cloud-builders/docker args: [ push, gcr.io/$PROJECT_ID/$_APP_NAME:$COMMIT_SHA ] # 更新实例模板,使用最新构建的镜像 - name: gcr.io/cloud-builders/gcloud args: [ compute, instance-templates, set-disk, $_INSTANCE_TEMPLATE_NAME, --disk, name=YOUR_DISK_NAME, source-image=gcr.io/$PROJECT_ID/$_APP_NAME:$COMMIT_SHA, --region=$_INSTANCE_GROUP_REGION ] # 执行滚动替换 - name: gcr.io/cloud-builders/gcloud args: [ compute, instance-groups, managed, rolling-action, replace, $_INSTANCE_GROUP_NAME, --region=$_INSTANCE_GROUP_REGION, --max-unavailable=0, --max-surge=3 ] images: - gcr.io/$PROJECT_ID/$_APP_NAME:$COMMIT_SHA
注意:需要将$_INSTANCE_TEMPLATE_NAME替换为你的实例模板名称,YOUR_DISK_NAME替换为模板中对应的磁盘名称。
补充说明
你之前添加的sleep 60无效,是因为镜像推送根本还没开始——Cloud Build的images字段推送操作是在所有steps执行完毕后才进行的,无论sleep多久,执行替换时新镜像都还没上传到GCR,所以无法解决问题。
内容的提问来源于stack exchange,提问作者Besart101
相关产品推荐
相关产品推荐

