无法拉取图像 - 未经授权:需要身份验证(ImagePullBackOff)

Failed to pull image - unauthorized: authentication required (ImagePullBackOff )

我的发布管道成功运行并在 Azure Kubernetes 中创建了一个容器,但是当我在 azure Portal>Kubernetes service> Insights 屏幕中查看时,它显示失败。

无法从我的私有容器存储库中拉取镜像,并显示错误消息 'ImagePullBackOff'

我在 pod 上执行了 kubectl describe 并收到以下错误消息:

Failed to pull image "myexampleacr.azurecr.io/myacr:13": [rpc error: code = Unknown desc = Error response from daemon: Get https://myexampleacr.azurecr.io/v2/myacr/manifests/53: unauthorized: authentication required.

以下是我的设置的简要背景: 我正在使用 Kubernetes secret 访问私有容器注册表中的容器。

我根据我的 DevOps 团队创建的服务原则使用 clientId 和密码(秘密)生成了 Kubernetes 秘密。 . 用于生成kubernetes secret的命令:

kubectl create secret docker-registry acr-auth --docker-server --docker-username --docker-password --docker-email

然后我用 imagePullSecrets 更新了我的 deployment.yaml:name:acr-auth

在此之后,我 运行 我的部署和发布管道都 运行 成功,但它们在 kubernetes 服务中显示失败并显示错误消息 'ImagePullBackOff' 错误。

任何帮助将不胜感激。

很奇怪,它可能显示了一个您没有删除的旧部署。也可能是这些;凭据不正确,acr 可能未启动,图像名称或标签错误。您还可以使用 aks-acr 本机身份验证,从不使用秘密:https://docs.microsoft.com/en-gb/azure/container-registry/container-registry-auth-aks

如错误所示,它需要身份验证。从你的描述来看,可能的原因是你的团队没有将ACR角色分配给你的团队创建的服务主体,或者你使用了错误的服务主体。所以你需要检查两件事:

  1. 如果您使用的服务主体具有ACR的正确权限。
  2. 如果 Kubernetes 机密是在 Kubernetes 服务中创建的。

检查服务主体是否有ACR正确权限的方法是在docker服务器中使用服务主体登录后在ACR中拉取镜像。另外,正如评论所说,您需要确保命令正确,如下所示:

kubectl create secret docker-registry acr-auth --docker-server myexampleacr.azurecr.io --docker-username clientId --docker-password password --docker-email yourEmail

此外,您使用带有标签的图片的可能性很小。顺便看看。

在我的例子中,问题是我的 --docker-密码有一个特殊字符,我没有使用引号将其转义(即 --docker-密码 'myPwd$' )

你可以检查你的密码是否正确我执行这个命令: kubectl get secret <秘密> -n <命名空间> --output="jsonpath={.data..dockerconfigjson}" | base64 --解码

参考:https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/

我遇到了同样的错误,我意识到服务主体已过期。 要检查服务主体的到期日期并使用新凭据更新 AKS 群集,请执行以下步骤:

注意:您需要安装和配置 Azure CLI 2.0.65 或更高版本。

1- 使用 az aks show 命令获取集群的客户端 ID。

az aks show --resource-group YOUR_AKS_RESOURCE_GROUP_NAME --name YOUR_AKS_CLUSTER_NAME --query "servicePrincipalProfile.clientId"

2- 检查您的服务主体的到期日期。

az ad sp credential list --id YOUR_CLIENT_ID --query "[].endDate" -o tsv

如果服务主体已过期,请按照以下步骤重置现有服务主体凭据:

1- 使用 az ad sp credential reset 命令重置凭据。

az ad sp credential reset --name YOUR_CLIENT_ID --query password -o tsv

2- 使用新的服务主体凭据更新您的 AKS 群集。

az aks update-credentials --resource-group YOUR_AKS_RESOURCE_GROUP_NAME --name YOUR_AKS_CLUSTER_NAME --reset-service-principal --service-principal YOUR_CLIENT_ID --client-secret YOUR_NEW_PASSWORD

来源:https://docs.microsoft.com/en-us/azure/aks/update-credentials