Tekton Pipeline访问GCP Artifact Registry报403如何解决
403问题排查与解决步骤
核心原因:本地构建能正常运行是因为配置了GOOGLE_APPLICATION_CREDENTIALS环境变量指向GCP服务账号密钥,Gradle可以自动读取该凭证完成Artifact Registry鉴权;Tekton Pipeline中既存在服务账号引用不匹配的问题,也没有将密钥正确挂载到构建容器并配置对应环境变量,导致Gradle拿不到有效凭证,访问仓库返回403。
排查&修复点
- 修复服务账号引用不匹配问题
你贴出的PipelineRun配置中,build任务绑定的服务账号名为gcp-service-account,但实际创建的关联了gcp-secret的服务账号名为service-account,二者不一致,导致build任务根本没拿到关联了GCP密钥的服务账号。
将二者名称统一即可,比如把ServiceAccount的metadata.name改成gcp-service-account,保证和PipelineRun中的引用一致:
apiVersion: v1 kind: ServiceAccount metadata: name: gcp-service-account namespace: tekton-pipelines secrets: - name: git-ssh-auth - name: gcp-secret
- 正确挂载GCP密钥到构建任务,配置凭证环境变量
Kubernetes不会自动把关联Secret里的内容配置成GCP工具可识别的凭证,你需要在Gradle构建Task中显式挂载Secret,同时配置GOOGLE_APPLICATION_CREDENTIALS环境变量指向挂载后的密钥文件:
# 补充到你的Gradle构建Task配置中 steps: - name: gradle-build image: gradle:7-jdk11 # 替换为你实际使用的Gradle镜像版本 workingDir: $(workspaces.shared-workspace.path) command: ["gradle"] args: ["build"] # 替换为你实际执行的构建命令 env: - name: GOOGLE_APPLICATION_CREDENTIALS value: /var/run/secrets/gcp/gcs-config volumeMounts: - name: gcp-credential-volume mountPath: /var/run/secrets/gcp readOnly: true volumes: - name: gcp-credential-volume secret: secretName: gcp-secret
注意:你的Secret中存储密钥的键名为gcs-config,所以环境变量指向的文件路径末尾必须和这个键名一致,否则会找不到密钥文件。另外你当前Secret的type写为kubernetes.io/opaque,正确值为Opaque(首字母大写),建议同步修正避免兼容性问题。
校验GCP侧服务账号权限
确认密钥中client_email对应的服务账号,在Artifact Registry的australia-southeast2区域common仓库上,至少绑定了Artifact Registry Reader角色;如果构建流程需要往仓库推制品,需要绑定Artifact Registry Writer角色。结果验证
重新触发PipelineRun,如果仍报403,可通过kubectl logs查看构建容器日志,或者进入容器执行echo $GOOGLE_APPLICATION_CREDENTIALS确认环境变量配置正确,再查看对应路径下的文件内容是否和你上传的服务账号密钥一致,排除挂载失败、密钥内容错误的问题。
内容的提问来源于stack exchange,提问作者San Jaisy
相关产品推荐
相关产品推荐

