GCP Cloud Build中Helm步骤如何正确引用Secret Manager密钥
问题根因
两种配置失效分别对应两个逻辑误区:
- 直接在helm启动参数里传
secret.var3=$$VAR3时,GCP Secret Manager注入的密钥是存到容器环境变量里的,环境变量的占位符解析只有shell程序会执行,直接把带$VAR3的字符串传给helm二进制,程序不会主动替换环境变量,最终传入的就是字面量$VAR3。 - 手动把entrypoint改成helm后出现本地8080端口连接拒绝,是因为你用的自定义Helm镜像默认自带入口脚本,会自动读取
CLOUDSDK_COMPUTE_ZONE、CLOUDSDK_CONTAINER_CLUSTER环境变量,执行gcloud命令拉取GKE集群凭据、生成可用的kubeconfig文件。手动覆盖entrypoint为helm后,这个前置初始化流程被直接跳过,helm找不到集群连接配置,就会默认请求本地8080端口的Kubernetes API服务,自然连接失败。
可用配置
直接用bash作为入口的写法是可行的,只需要补全集群凭据拉取步骤,在shell上下文中完成变量解析即可,参考配置如下:
steps: - name: gcr.io/$PROJECT_ID/helm entrypoint: 'bash' args: - -c - | # 拉取GKE集群访问凭据 gcloud container clusters get-credentials "$CLOUDSDK_CONTAINER_CLUSTER" --zone "$CLOUDSDK_COMPUTE_ZONE" --project "$PROJECT_ID" # 执行helm部署,shell自动完成环境变量解析 helm upgrade "$_NAME" "./deployment/charts/$_NAME" \ --namespace "$_NAMESPACE" \ --install \ --set secret.var3="$VAR3" env: - "CLOUDSDK_COMPUTE_ZONE=$_GKE_LOCATION" - "CLOUDSDK_CONTAINER_CLUSTER=$_GKE_CLUSTER" secretEnv: ['VAR3'] id: Apply deploy substitutions: _GKE_LOCATION: europe-west3-b _GKE_CLUSTER: cluster-name _NAME: "test" _NAMESPACE: "test" availableSecrets: secretManager: - versionName: projects/$PROJECT_ID/secrets/test-var-3/versions/latest env: 'VAR3' options: substitution_option: 'ALLOW_LOOSE'
配置说明
- 命令里引用VAR3用单
$即可,因为命令在bash进程内执行,会直接读取容器内的环境变量值,不需要用Cloud Build构建期变量替换的$$语法。 - 新增的
gcloud container clusters get-credentials就是原镜像默认入口里的集群初始化逻辑,手动调用bash入口时需要显式执行这一步。 - 可选添加
--install参数,实现release不存在时自动安装,避免首次部署报错。 - 提前确认Cloud Build服务账号持有两类权限:GKE集群的容器管理权限、对应Secret Manager密钥版本的访问权限,否则会出现权限类报错。
内容的提问来源于stack exchange,提问作者semafor
相关产品推荐
相关产品推荐

