在GCloud Kubernetes执行器的GitLab Runner中docker push到Artifact Registry权限报错
解决GitLab Runner Kubernetes执行器Docker Push到Artifact Registry的权限问题
排查与解决步骤
1. 确认服务账号的权限绑定是否生效
首先检查ci-service-account是否被正确赋予了镜像上传权限:
- 执行命令完成权限绑定(未正确绑定的话):
gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \ --member "serviceAccount:ci-service-account@YOUR_PROJECT_ID.iam.gserviceaccount.com" \ --role "roles/artifactregistry.writer" - 验证绑定是否成功:
输出必须包含gcloud projects get-iam-policy YOUR_PROJECT_ID --filter="bindings.members:ci-service-account" --format="value(bindings.role)"roles/artifactregistry.writer;如果用自定义角色,要确保角色包含artifactregistry.repositories.uploadArtifacts权限。 - 若目标仓库是区域级,也可以给单个仓库精准绑定权限:
gcloud artifacts repositories add-iam-policy-binding YOUR_REPO_NAME \ --location europe \ --member "serviceAccount:ci-service-account@YOUR_PROJECT_ID.iam.gserviceaccount.com" \ --role "roles/artifactregistry.writer"
2. 确保GitLab Runner Pod确实使用了指定的服务账号
很多时候问题出在Runner没真正用上你指定的服务账号:
- 查看当前运行的Runner Pod使用的服务账号:
kubectl get pods -n YOUR_RUNNER_NAMESPACE -o jsonpath='{.items[*].spec.serviceAccountName}' - 若输出不是
ci-service-account,检查以下两点:- 自托管Runner的
config.toml中,[[runners.kubernetes]]段是否硬编码了service_account值,如果有,要么删除该配置,要么改为ci-service-account; KUBERNETES_SERVICE_ACCOUNT_OVERWRITE变量要在GitLab项目/组的CI变量中设置,不能只写在.gitlab-ci.yml里(共享Runner可能需要在实例级配置)。
- 自托管Runner的
3. 简化Docker认证流程(无需手动安装gcloud SDK)
你之前手动安装gcloud的步骤没必要,直接利用Kubernetes服务账号的凭据完成Docker登录:
修改.gitlab-ci.yml的script部分:
script: - docker build -t imagename:${TAG} job/ - docker tag imagename:${TAG} europe-docker.pkg.dev/project/repository/imagename:${TAG} # 用服务账号凭据登录Artifact Registry - echo "$GOOGLE_APPLICATION_CREDENTIALS" > /tmp/service-account-key.json - docker login -u _json_key -p "$(cat /tmp/service-account-key.json)" europe-docker.pkg.dev - docker push europe-docker.pkg.dev/project/repository/imagename:${TAG}
- 注意:如果集群启用了工作负载身份,
GOOGLE_APPLICATION_CREDENTIALS会自动注入Pod;如果没启用,需要手动创建服务账号密钥,把密钥的JSON内容作为GitLab CI变量GOOGLE_APPLICATION_CREDENTIALS传入。
4. 检查Artifact Registry仓库的直接权限
进入GCP控制台的Artifact Registry页面,找到目标仓库,查看「权限」标签,确认ci-service-account确实在列表中,且角色为Artifact Registry Writer或包含上传权限的自定义角色。
额外验证点
- 核对Docker镜像标签的仓库地址(
europe-docker.pkg.dev/project/repository),确保没有拼写错误; - 如果用工作负载身份,确认完成了身份绑定:
gcloud iam service-accounts add-iam-policy-binding ci-service-account@YOUR_PROJECT_ID.iam.gserviceaccount.com \ --member "serviceAccount:YOUR_K8S_PROJECT.svc.id.goog[YOUR_RUNNER_NAMESPACE/ci-service-account]" \ --role "roles/iam.workloadIdentityUser"
内容的提问来源于stack exchange,提问作者Shadesfear
相关产品推荐
相关产品推荐

