【问题标题】:ImagePullBackOff with "rpc error: code = Unknown desc = failed to pull and unpack image" from AKS when pulling from ACR从 ACR 拉取时,带有“rpc 错误:代码 = 未知 desc = 无法从 AKS 拉取和解压缩图像”的 ImagePullBackOff
【发布时间】:2021-08-31 06:33:40
【问题描述】:
从 ACR 拉取 service-jenkins 自定义映像时,AKS 给出以下错误:
Warning Failed 0s (x2 over 31s) kubelet 无法拉取镜像“XXX.azurecr.io/service-jenkins:latest”:[rpc 错误:代码 = 未知 desc = 未能拉取和解压镜像“XXX.azurecr. io/service-jenkins:latest": 无法提取层 sha256:XXX: 意外 EOF: 未知, rpc 错误: code = Unknown desc = 无法提取和解压缩图像 "XXX.azurecr.io/service-jenkins:latest":无法解析引用“XXX.azurecr.io/service-jenkins:latest”:无法授权:无法获取匿名令牌:意外状态:401 未授权]
我们已采取以下步骤来尝试解决此问题:
- 使用 SP 而不是使用存储在同一命名空间中的机密将 AKS 与 ACR 连接
- 上传了一个示例 hello-world 图像,该图像已被 AKS 成功提取
- 已验证图像密钥与 ACR 密钥匹配
我们使用本地 docker 引擎拉取并执行了 service-jenkins 镜像,以检查镜像构建是否存在问题,但容器运行正常。
我们无法确定确切的问题。任何帮助表示赞赏!
【问题讨论】:
标签:
jenkins
azure-aks
acr
【解决方案1】:
如果您的错误中有“匿名访问令牌”之类的措辞,则在 azure cloud shell 上运行以下命令
按照以下步骤:-
- 转到 Azure 门户
- 使用 cloudshell 登录到 aks 集群
- 运行以下命令:
az acr update --anonymous-pull-enabled
【解决方案2】:
您是如何将 AKS 与 ACR 连接起来的?
您可以使用 Azure CLI(详情 here)或自行创建角色分配(详情 here)。
对于后者,您必须将 acrpull 角色分配给 AKS 节点池的托管标识(或服务主体)。
【解决方案3】:
事实证明,这个特定问题发生在
- AKS K8 版本 > 1.18.xx
- 使用 Ubuntu 20.10 docker 基础镜像
在深入研究这个问题时,似乎 Ubuntu 20.10 有一些层重复,这与 MSFT 的 K8 containerd 运行时实现不太相符。
我不是专家,但这是我在 Azure 上注意到的唯一不同之处,因为我们还尝试了与 IBM Cloud 相同的部署,并且似乎按预期运行。
只需将 Ubuntu 基础升级到 21.04 即可解决我的问题 :)