【问题标题】:Failed to pull image - unauthorized: authentication required (ImagePullBackOff )无法提取图像 - 未经授权:需要身份验证 (ImagePullBackOff )
【发布时间】:2019-12-19 12:09:59
【问题描述】:

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

无法从我的私有容器存储库中提取图像并显示错误消息“ImagePullBackOff”

我在 pod 上做了一个 kubectl describe 并收到以下错误消息:

无法提取图像“myexampleacr.azurecr.io/myacr:13”:[rpc 错误:代码 = 未知 desc = 来自守护程序的错误响应:获取 https://myexampleacr.azurecr.io/v2/myacr/manifests/53:未授权:需要身份验证。

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

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

kubectl 创建秘密 docker-registry acr-auth --docker-server --docker-username --docker-password --docker-email

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

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

任何帮助将不胜感激。

【问题讨论】:

  • 您是否提供了用户名\密码?因为您显示的命令并不意味着?此外,您应该真正为 ACR 使用内部 AKS 身份验证(假设您使用它)

标签: azure-aks azure-container-registry kubernetes-secrets


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    判断service principal是否拥有ACR权限的方法是在docker server中使用service principal登录后,在ACR中拉取镜像。另外,正如评论所说,您需要确保命令正确,如下所示:

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

    另外,您使用带有标签的错误图像的可能性很小。顺便去看看。

    【讨论】:

    • 问题在于服务原则没有 ACRPull 权限,一旦我们的 devops 团队分配它,部署到 kubernetes 集群就可以了。澄清一下,我已经设置了 kubernetes 机密并包含在我的部署 yaml 文件中,服务原则上的 acrpull 是缺失的部分。
    • 请注意,如果您的密码包含 $,您必须使用 \$ 对其进行转义
    【解决方案3】:

    在我的情况下,问题是我的 --docker-password 有一个特殊字符,我没有使用引号转义它(即 --docker-password 'myPwd$')

    您可以通过执行以下命令检查您的密码是否正确: kubectl get secret -n --output="jsonpath={.data..dockerconfigjson}" | base64 --解码

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

    【讨论】:

      【解决方案4】:

      我遇到了同样的错误,我意识到服务主体已过期。 要检查服务主体的到期日期并使用新凭据更新 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-16
        • 2017-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-17
        相关资源
        最近更新 更多