ImagePullBackOff with "rpc error: code = Unknown desc = failed to pull and unpack image" from AKS when pulling from ACR
ImagePullBackOff with "rpc error: code = Unknown desc = failed to pull and unpack image" from AKS when pulling from ACR
从 ACR 拉取 service-jenkins 自定义镜像时,AKS 出现以下错误:
Warning Failed 0s (x2 over 31s) kubelet Failed to pull image "XXX.azurecr.io/service-jenkins:latest": [rpc error: code = Unknown desc = failed to pull and unpack image "XXX.azurecr.io/service-jenkins:latest": failed to extract layer sha256:XXX: unexpected EOF: unknown, rpc error: code = Unknown desc = failed to pull and unpack image "XXX.azurecr.io/service-jenkins:latest": failed to resolve reference "XXX.azurecr.io/service-jenkins:latest": failed to authorize: failed to fetch anonymous token: unexpected status: 401 Unauthorized]
我们已采取以下步骤来尝试解决此问题:
- 使用 SP 而不是使用存储在同一命名空间中的秘密将 AKS 与 ACR 连接
- 已上传由 AKS 成功拉取的示例 hello-world 图像
- 已验证图像机密与 ACR 密钥匹配
我们使用本地 docker 引擎拉取并执行了 service-jenkins 镜像,以检查镜像构建是否存在问题,但容器运行正常。
我们无法查明确切的问题。感谢您的帮助!
您是如何将 AKS 与 ACR 连接的?
您可以使用 Azure CLI 执行此操作(详细信息 here) or by creating a role assignment on your own (details here)。
对于后者,您必须将 acrpull
角色分配给 AKS 节点池的托管标识(或服务主体)。
如果在您的错误中有类似“匿名访问令牌”的措辞,那么 运行 在 azure cloud shell
上的命令下方
按照以下步骤操作:-
- 转到 Azure 门户
- 使用云登录 aks 集群shell
- 运行 命令如下:
az acr update --anonymous-pull-enabled
请注意,这将使您的 acr publicly available。
By default, access to pull or push content from an Azure container registry is only available to authenticated users. Enabling anonymous (unauthenticated) pull access makes all registry content publicly available for read (pull) actions. Anonymous pull access can be used in scenarios that do not require user authentication such as distributing public container images.
原来这个问题发生在
- AKS K8 版本 > 1.18.xx
- Ubuntu 20.10 docker 使用基础图像
在深入研究这个问题时,似乎 Ubuntu 20.10 有一些层重复,这与 MSFT 对 K8 containerd 运行时的实现不太相符。
我不是专家,但这是我在 Azure 上注意到的唯一区别,因为我们也尝试过使用 IBM Cloud 进行相同的部署,而且这似乎符合预期。
只需将 Ubuntu 基础升级到 21.04 就解决了我的问题:)
从 ACR 拉取 service-jenkins 自定义镜像时,AKS 出现以下错误:
Warning Failed 0s (x2 over 31s) kubelet Failed to pull image "XXX.azurecr.io/service-jenkins:latest": [rpc error: code = Unknown desc = failed to pull and unpack image "XXX.azurecr.io/service-jenkins:latest": failed to extract layer sha256:XXX: unexpected EOF: unknown, rpc error: code = Unknown desc = failed to pull and unpack image "XXX.azurecr.io/service-jenkins:latest": failed to resolve reference "XXX.azurecr.io/service-jenkins:latest": failed to authorize: failed to fetch anonymous token: unexpected status: 401 Unauthorized]
我们已采取以下步骤来尝试解决此问题:
- 使用 SP 而不是使用存储在同一命名空间中的秘密将 AKS 与 ACR 连接
- 已上传由 AKS 成功拉取的示例 hello-world 图像
- 已验证图像机密与 ACR 密钥匹配
我们使用本地 docker 引擎拉取并执行了 service-jenkins 镜像,以检查镜像构建是否存在问题,但容器运行正常。
我们无法查明确切的问题。感谢您的帮助!
您是如何将 AKS 与 ACR 连接的?
您可以使用 Azure CLI 执行此操作(详细信息 here) or by creating a role assignment on your own (details here)。
对于后者,您必须将 acrpull
角色分配给 AKS 节点池的托管标识(或服务主体)。
如果在您的错误中有类似“匿名访问令牌”的措辞,那么 运行 在 azure cloud shell
上的命令下方按照以下步骤操作:-
- 转到 Azure 门户
- 使用云登录 aks 集群shell
- 运行 命令如下:
az acr update --anonymous-pull-enabled
请注意,这将使您的 acr publicly available。
By default, access to pull or push content from an Azure container registry is only available to authenticated users. Enabling anonymous (unauthenticated) pull access makes all registry content publicly available for read (pull) actions. Anonymous pull access can be used in scenarios that do not require user authentication such as distributing public container images.
原来这个问题发生在
- AKS K8 版本 > 1.18.xx
- Ubuntu 20.10 docker 使用基础图像
在深入研究这个问题时,似乎 Ubuntu 20.10 有一些层重复,这与 MSFT 对 K8 containerd 运行时的实现不太相符。
我不是专家,但这是我在 Azure 上注意到的唯一区别,因为我们也尝试过使用 IBM Cloud 进行相同的部署,而且这似乎符合预期。
只需将 Ubuntu 基础升级到 21.04 就解决了我的问题:)