AKS安装nginx ingress controller拉取ACR镜像报401未授权如何解决
问题解决方法
核心原因
你遇到的是两个关联错误,属于AKS使用自定义ACR安装ingress-nginx的常见问题:
ingress-nginx的helm chart默认会给所有组件镜像强制配置sha256摘要校验,你在helm参数里仅给controller组件加了controller.image.digest=""清空了默认摘要,漏了给admission webhook的patch镜像也配置清空摘要,导致拉取kube-webhook-certgen镜像时会附带chart内置的默认sha256值。如果你的ACR中导入的v1.5.1标签镜像摘要和chart默认值不一致,就会触发镜像不存在报错;同时Azure ACR有安全策略,匿名拉取不存在的镜像时会返回401而非404,避免仓库内容被恶意枚举,因此才会同时出现NotFound和401 Unauthorized两个报错。
解决步骤
- 第一步:先验证ACR中镜像的实际摘要
执行以下命令查询你ACR里对应镜像的真实摘要,确认和报错中的sha256值是否匹配:
az acr repository show-manifests --name letsencryptdemoacr --repository jettech/kube-webhook-certgen --query "[?tags[0]=='v1.5.1'].digest" -o tsv
如果输出结果和报错里的sha256值不一致,即可确认是摘要不匹配导致的问题。
- 第二步:调整helm安装参数,清空patch镜像的默认摘要
在原有helm命令中新增controller.admissionWebhooks.patch.image.digest=""参数,调整后的完整命令如下:
helm install nginx-ingress ingress-nginx/ingress-nginx --namespace ingress-basic \ --set controller.replicaCount=1 \ --set controller.nodeSelector."kubernetes\.io/os"=linux \ --set controller.image.registry=$ACR_URL \ --set controller.image.image=$CONTROLLER_IMAGE \ --set controller.image.tag=$CONTROLLER_TAG \ --set controller.image.digest="" \ --set controller.admissionWebhooks.patch.nodeSelector."kubernetes\.io/os"=linux \ --set controller.admissionWebhooks.patch.image.registry=$ACR_URL \ --set controller.admissionWebhooks.patch.image.image=$PATCH_IMAGE \ --set controller.admissionWebhooks.patch.image.tag=$PATCH_TAG \ --set controller.admissionWebhooks.patch.image.digest="" \ --set defaultBackend.nodeSelector."kubernetes\.io/os"=linux \ --set defaultBackend.image.registry=$ACR_URL \ --set defaultBackend.image.image=$DEFAULTBACKEND_IMAGE \ --set defaultBackend.image.tag=$DEFAULTBACKEND_TAG \ --set controller.service.loadBalancerIP=$STATIC_IP \ --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-dns-label-name"=$DNS_LABEL
- 第三步:可选权限验证(调整参数后仍报错时执行)
az aks check-acr仅验证AKS控制面的ACR访问权限,实际拉取镜像的是节点上的kubelet服务,你可以创建测试Pod手动验证拉取权限:
# 创建测试Pod kubectl run test-acr-pull --image=letsencryptdemoacr.azurecr.io/jettech/kube-webhook-certgen:v1.5.1 --restart=Never # 查看拉取结果 kubectl describe pod test-acr-pull
如果仍报401错误,重新执行ACR关联命令强制刷新权限即可:
az aks update -n myAKSCluster -g myResourceGroup --attach-acr letsencryptdemoacr
等待2分钟后重新执行helm安装命令即可完成部署。
内容的提问来源于stack exchange,提问作者Chris Halcrow
相关产品推荐
相关产品推荐

