如何用Cloud Build与Compute Engine实现Google Cloud部署自动化及解决更新报错
解决Cloud Build报错并实现Managed Instance Group滚动更新
一、解决Docker拉取权限报错
你遇到的pull access denied for gcloud报错,原因是Cloud Build步骤中使用了错误的镜像名:name: 'gcloud'。Docker会默认去Docker Hub拉取这个镜像,但官方的gcloud Cloud Builder镜像托管在Google Container Registry,正确的镜像地址是gcr.io/cloud-builders/gcloud。
二、实现Managed Instance Group滚动更新
你之前尝试直接更新单个VM实例的方式不适用于Managed Instance Group(MIG)。MIG的滚动更新需要通过更新实例模板再触发实例组更新的方式实现,具体步骤如下:
- 基于现有实例模板创建新模板,替换为Artifact Registry中的新镜像
- 让MIG使用新模板执行滚动更新,逐步替换旧实例
修改后的完整cloudbuild.yaml
steps: # Step 0: Install packages - name: 'gcr.io/cloud-builders/npm' args: ['install'] # Step 1: Build the Nest.js application - name: 'gcr.io/cloud-builders/npm' args: ['run', 'build'] # Step 2: Build the Docker image - name: 'gcr.io/cloud-builders/docker' args: - 'build' - '-t' - 'asia-south2-docker.pkg.dev/${PROJECT_ID}/core-apis/core-apis:latest' - '.' # Step 3: Push the Docker image to the Artifact Registry - name: 'gcr.io/cloud-builders/docker' args: - 'push' - 'asia-south2-docker.pkg.dev/${PROJECT_ID}/core-apis/core-apis:latest' # Step 4: 创建新的实例模板(基于原有模板,替换镜像) - name: 'gcr.io/cloud-builders/gcloud' args: - 'compute' - 'instance-templates' - 'create' - '${_NAME}-template-v$(date +%Y%m%d%H%M%S)' - '--source-instance-template' - '${_NAME}-template' # 替换为你现有的实例模板名称 - '--container-image' - 'asia-south2-docker.pkg.dev/${PROJECT_ID}/core-apis/core-apis:latest' - '--zone' - 'us-central1-c' # Step 5: 更新Managed Instance Group,触发滚动更新 - name: 'gcr.io/cloud-builders/gcloud' args: - 'compute' - 'instance-groups' - 'managed' - 'set-instance-template' - '${_NAME}-mig' # 替换为你的MIG名称 - '--template' - '${_NAME}-template-v$(date +%Y%m%d%H%M%S)' - '--zone' - 'us-central1-c' - '--min-ready' - '30s' # 可选:设置新实例就绪等待时间 - '--max-surge' - '20%' # 可选:滚动更新时允许超出的实例比例 - '--max-unavailable' - '10%' # 可选:滚动更新时允许不可用的实例比例 options: logging: CLOUD_LOGGING_ONLY substitutions: _NAME: 'core-apis'
关键说明
- 实例模板命名:用时间戳后缀确保每次构建生成唯一的模板,避免冲突
- 滚动更新参数:
--max-surge和--max-unavailable可以根据你的业务需求调整,控制更新的容错性和速度 - 变量替换:确保
${_NAME}-template和${_NAME}-mig与你现有的实例模板、MIG名称一致 - Cloud Build权限:确保Cloud Build服务账号拥有
compute.instanceTemplates.create和compute.instanceGroups.setInstanceTemplate的权限
内容的提问来源于stack exchange,提问作者Lavneesh Jaggi
相关产品推荐
相关产品推荐

