如何在ArgoCD中使用AKS托管身份连接ACR并创建应用?
我希望使用用户分配或托管身份,通过AKS和ArgoCD创建应用。我已为AKS身份分配了ACR的AcrPull权限,随后执行命令argocd repo add myACR.azurecr.io --type helm --name helm --enable-oci添加仓库(其中helm是仓库根目录),ArgoCD UI显示连接状态为成功的绿色勾选标记。但尝试为实际镜像创建应用时失败,报错信息为:
helm pull oci://myACR.azurecr.io/helm/mychart --version 0.0.1 --destination /tmp/helm706383544执行失败,退出状态1:Error: failed to authorize: failed to fetch anonymous token: unexpected status: 401 Unauthorized
补充说明:若启用ACR管理员用户,并在添加ArgoCD仓库时使用--username XXX --password XXX参数,一切运行正常。
请问我遗漏了什么配置?是否可以通过托管身份实现该需求?还是必须启用ACR管理员用户(或使用令牌)?
完全可以通过托管身份实现需求,不需要启用ACR管理员用户或使用静态令牌。你遗漏的核心配置是让ArgoCD的Pod能够实际利用AKS的托管身份完成ACR的身份认证,以下是具体修复步骤:
1. 明确托管身份的权限与关联对象
你提到给AKS身份分配了AcrPull权限,需确认:
- 优先使用用户分配的托管身份(而非AKS集群系统托管身份,后者权限范围过大且不安全),且该身份已被授予目标ACR的
AcrPull角色权限。 - 必须确保ArgoCD的核心组件Pod(
argocd-application-controller和argocd-repo-server,负责拉取Helm Chart)能调用这个托管身份。
2. 配置ArgoCD Pod与托管身份的关联(推荐用Azure工作负载身份)
Azure工作负载身份是当前最安全的身份关联方案,替代传统Pod Identity:
- 创建用户分配的托管身份,为其授予目标ACR的
AcrPull权限。 - 为该托管身份创建联合身份凭据(Federated Identity Credential),关联ArgoCD使用的Kubernetes服务账户(默认在
argocd命名空间下,对应argocd-application-controller和argocd-repo-server)。 - 给ArgoCD的服务账户添加注解,使其启用工作负载身份:
annotations: azure.workload.identity/use: "true" azure.workload.identity/client-id: "<你的用户分配托管身份Client ID>" - 重启ArgoCD的相关Pod,让配置生效。
3. 验证身份访问有效性
进入ArgoCD的argocd-repo-server或argocd-application-controllerPod,执行以下命令测试:
# 用托管身份登录ACR az acr login --name myACR --identity # 尝试拉取Helm Chart helm pull oci://myACR.azurecr.io/helm/mychart --version 0.0.1
如果两步都成功,说明身份配置已生效。
4. 重新确认ArgoCD仓库配置
你之前执行的argocd repo add命令无需修改,保持argocd repo add myACR.azurecr.io --type helm --name helm --enable-oci即可——ArgoCD会自动利用Pod的托管身份完成OCI仓库认证,无需传入用户名密码。
为什么UI显示连接成功但实际拉取失败?
ArgoCD UI的连接测试仅做基础的仓库可达性检查,不会实际拉取Chart或验证完整权限。只有在同步应用时才会触发完整的Helm拉取流程,此时若托管身份未正确关联,就会出现401未授权错误。
内容的提问来源于stack exchange,提问作者JoeBloggs

