GitHub触发Cloud Build后,如何部署多容器服务至Cloud Run?
解决Cloud Run多容器服务自动部署的几种方案
不用手动更新service.yaml,这几个高效方法可以帮你搞定:
方案1:用环境变量替换service.yaml中的镜像标签
先在service.yaml里把镜像标签换成占位符,比如:
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: multi-container-service spec: template: spec: containers: - image: gcr.io/your-project/main:${COMMIT_SHA} name: main - image: gcr.io/your-project/sidecar:${COMMIT_SHA} name: sidecar
然后在Cloud Build的cloudbuild.yaml中,用envsubst工具替换占位符后再部署:
steps: # 构建两个容器镜像,标签用COMMIT_SHA - name: 'gcr.io/cloud-builders/docker' args: ['build', '-t', 'gcr.io/your-project/main:$COMMIT_SHA', './main'] - name: 'gcr.io/cloud-builders/docker' args: ['build', '-t', 'gcr.io/your-project/sidecar:$COMMIT_SHA', './sidecar'] # 替换service.yaml中的占位符并部署 - name: 'gcr.io/cloud-builders/gcloud' entrypoint: 'bash' args: - '-c' - | envsubst < service.yaml > updated-service.yaml && \ gcloud run services replace updated-service.yaml --region=us-central1
Cloud Build会自动把$COMMIT_SHA注入构建环境,无需额外配置。
方案2:直接用gcloud run deploy命令指定多容器
不用维护service.yaml,直接在cloudbuild.yaml里用--set-container参数逐个定义容器:
steps: # 构建并推送镜像 - name: 'gcr.io/cloud-builders/docker' args: ['build', '-t', 'gcr.io/your-project/main:$COMMIT_SHA', './main'] - name: 'gcr.io/cloud-builders/docker' args: ['build', '-t', 'gcr.io/your-project/sidecar:$COMMIT_SHA', './sidecar'] # 部署多容器服务 - name: 'gcr.io/cloud-builders/gcloud' args: - 'run' - 'deploy' - 'multi-container-service' - '--region=us-central1' - '--set-container=main=gcr.io/your-project/main:$COMMIT_SHA' - '--set-container=sidecar=gcr.io/your-project/sidecar:$COMMIT_SHA' # 可添加其他配置参数 - '--port=8080' - '--set-env-vars=ENV=production'
这种方式适合配置不复杂的场景,省去维护yaml的麻烦。
方案3:用Kustomize管理复杂配置
如果服务配置较多,推荐用Kustomize动态替换镜像标签:
- 新建kustomization.yaml:
apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - service.yaml images: - name: gcr.io/your-project/main newTag: ${COMMIT_SHA} - name: gcr.io/your-project/sidecar newTag: ${COMMIT_SHA}
- 原始service.yaml保持固定镜像名(不带标签):
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: multi-container-service spec: template: spec: containers: - image: gcr.io/your-project/main name: main - image: gcr.io/your-project/sidecar name: sidecar
- 在cloudbuild.yaml中用Kustomize生成最终配置并部署:
steps: # 构建并推送镜像 - name: 'gcr.io/cloud-builders/docker' args: ['build', '-t', 'gcr.io/your-project/main:$COMMIT_SHA', './main'] - name: 'gcr.io/cloud-builders/docker' args: ['build', '-t', 'gcr.io/your-project/sidecar:$COMMIT_SHA', './sidecar'] # 安装Kustomize(若Cloud Build镜像未预装) - name: 'alpine' entrypoint: 'ash' args: - '-c' - | wget https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize%2Fv5.1.1/kustomize_v5.1.1_linux_amd64.tar.gz && \ tar xzf kustomize_v5.1.1_linux_amd64.tar.gz && \ chmod +x kustomize && mv kustomize /usr/local/bin/ # 替换镜像标签并部署 - name: 'gcr.io/cloud-builders/gcloud' entrypoint: 'bash' args: - '-c' - | kustomize edit set image gcr.io/your-project/main:$COMMIT_SHA gcr.io/your-project/sidecar:$COMMIT_SHA && \ kustomize build . | gcloud run services replace --region=us-central1 -
每次构建都会自动把镜像标签替换为当前的COMMIT_SHA,全程无需手动修改配置。
内容的提问来源于stack exchange,提问作者DaveW
相关产品推荐
相关产品推荐

