ArgoCD Image Updater无法拉取GCP Artifact Registry镜像问题求助
问题背景
已完成以下配置:
- 拥有具备
artifactregistry.reader权限的ServiceAccount(argocd-gcr-secret@XXX.iam.gserviceaccount.com) - 通过Workload Identity绑定到ArgoCD的
argocd-image-updater服务账号:gcloud iam service-accounts add-iam-policy-binding argocd-gcr-secret@XXX.iam.gserviceaccount.com --role roles/iam.workloadIdentityUser --member "serviceAccount:XXX.svc.id.goog[argocd/argocd-image-updater]" - 为
argocd-image-updater服务账号添加GSA注解:kubectl -n argocd annotate serviceaccount argocd-image-updater iam.gke.io/gcp-service-account=argocd-gcr-secret@XXX.iam.gserviceaccount.com - 在
argocd-image-updater的Pod内可以成功获取访问令牌并登录Artifact Registry:ACCESS_TOKEN=$(wget --header 'Metadata-Flavor: Google' http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token -q -O - | grep -Eo '"access_token":.*?[^\]",' | cut -d '"' -f 4) echo "oauth2accesstoken:$ACCESS_TOKEN" docker login -u oauth2accesstoken -p $ACCESS_TOKEN us-east1-docker.pkg.dev
但ArgoCD Image Updater运行时仍报错:
time="2023-10-16T23:03:38Z" level=debug msg="Considering this image for update" alias=myimage application=my-dev1-core image_name=XXX/dev1/core image_tag=3f7282a08ec3199505eaf72ed1109b67813a44 registry=us-east1-docker.pkg.dev time="2023-10-16T23:03:38Z" level=debug msg="Using no version constraint when looking for a new tag" alias=myimage application=my-dev1-core image_name=XXX/dev1/core image_tag=3f7282a08ec319950560eaf72ed1109b67813a44 registry=us-east1-docker.pkg.dev time="2023-10-16T23:03:38Z" level=error msg="Could not get tags from registry: Get \"https://us-east1-docker.pkg.dev/v2/XXX/dev1/core/tags/list\": denied: Permission \"artifactregistry.repositories.downloadArtifacts\" denied on resource \"projects/XXX/locations/us-east1/repositories/dev1\" (or it may not exist)" alias=myimage application=my-dev1-core image_name=XXX/dev1/core image_tag=3f7282a08ec319950560eaf72ed1109b67813a44 registry=us-east1-docker.pkg.dev time="2023-10-16T23:03:38Z" level=info msg="Processing results: applications=1 images_considered=1 images_skipped=0 images_updated=0 errors=1"
排查步骤
1. 验证ServiceAccount的权限绑定范围
artifactregistry.reader角色确实包含artifactregistry.repositories.downloadArtifacts权限,但需确认该角色绑定在目标Artifact Registry仓库上,而非仅项目层级且仓库存在权限覆盖。执行命令查看SA在目标仓库的权限:
gcloud artifacts repositories get-iam-policy dev1 --location=us-east1 --project=XXX
检查输出中是否存在argocd-gcr-secret@XXX.iam.gserviceaccount.com的条目,且角色为roles/artifactregistry.reader。
2. 确认Pod使用的ServiceAccount
验证argocd-image-updater Pod实际使用的服务账号是否正确:
kubectl -n argocd get pod <argocd-image-updater-pod-name> -o jsonpath='{.spec.serviceAccountName}'
确保输出为argocd-image-updater。
3. 检查Workload Identity绑定的正确性
确认绑定命令中的成员格式无误,应为serviceAccount:[GKE_PROJECT_ID].svc.id.goog[argocd/argocd-image-updater],确保GKE_PROJECT_ID、命名空间、服务账号名完全匹配。
4. 验证令牌的权限与身份
在Pod内获取令牌后,解码查看其权限范围与身份:
echo $ACCESS_TOKEN | cut -d '.' -f 2 | base64 -d | jq
检查scope字段是否包含https://www.googleapis.com/auth/cloud-platform或https://www.googleapis.com/auth/devstorage.read_only,同时确认email字段为argocd-gcr-secret@XXX.iam.gserviceaccount.com。
5. 排查ArgoCD Image Updater的凭据配置
检查是否存在覆盖Workload Identity的自定义注册表凭据:
kubectl -n argocd get secrets | grep us-east1-docker.pkg.dev
若存在相关Secret,需删除或调整,让Image Updater使用Workload Identity的自动认证。
6. 重启Pod使配置生效
配置变更可能需要重启Pod才能生效:
kubectl -n argocd rollout restart deployment argocd-image-updater
内容的提问来源于stack exchange,提问作者Yashar

