将Cloud Run镜像部署到Kubernetes集群:变量替换失败求助
GKE部署时镜像地址变量未替换导致解析失败的解决办法
问题描述
已通过cloudbuild.yaml成功构建Docker镜像,但使用deployment.yaml部署到GKE集群时,镜像地址中的$PROJECT_ID、${_DEPLOYMENT_TYPE}、$COMMIT_SHA变量未被正确替换,触发以下报错:
Error: failed to prepare deployment: failed to update container of objects: failed to parse reference from image "us-west1-docker.pkg.dev/$PROJECT_ID/abc/abc-server-${_DEPLOYMENT_TYPE}:$COMMIT_SHA": could not parse reference: us-west1-docker.pkg.dev/$PROJECT_ID/abc/abc-server-${_DEPLOYMENT_TYPE}:$COMMIT_SHA
根本原因
Cloud Build仅会替换cloudbuild.yaml自身参数中的变量,不会自动修改deployment.yaml文件内的占位符;而gke-deploy的--image参数作用是直接替换部署配置中的镜像地址,并非解析文件内的变量。原配置中deployment.yaml的镜像地址始终保留未替换的变量,导致Kubernetes无法解析无效的镜像引用。
解决方案
方案1:利用gke-deploy自动替换镜像地址
修改deployment.yaml中的镜像地址为任意占位值,让gke-deploy通过--image参数自动替换该字段:
spec: containers: - name: idr-server-k8ts-test image: placeholder-image # 占位值,会被gke-deploy自动替换 ports: - containerPort: 8080
cloudbuild.yaml中的部署步骤保持不变,--image参数已正确拼接变量后的镜像地址,gke-deploy会自动找到deployment中的容器并替换镜像地址。
方案2:先替换deployment.yaml变量再部署
在Cloud Build步骤中添加变量替换操作,先处理deployment.yaml中的占位符,再执行部署:
- 添加变量替换步骤:
- id: "替换deployment变量" name: "alpine" args: ["sh", "-c", "envsubst < deployment.yaml > deployment-temp.yaml"] env: - "PROJECT_ID=$PROJECT_ID" - "_DEPLOYMENT_TYPE=${_DEPLOYMENT_TYPE}" - "COMMIT_SHA=$COMMIT_SHA"
- 修改部署步骤的配置文件路径为替换后的临时文件:
- id: "deploy container image to GKE" name: "gcr.io/cloud-builders/gke-deploy" args: [ "--cluster", "${_CLUSTER_NAME}", "run", "--filename", "deployment-temp.yaml", "--location", "${_COMPUTE_ZONE}" ]
内容的提问来源于stack exchange,提问作者Salad.Guyo
相关产品推荐
相关产品推荐

