【问题标题】:Kubernetes fails to pull image with unknown blob errorKubernetes 无法提取具有未知 blob 错误的图像
【发布时间】:2018-05-31 15:31:30
【问题描述】:

我基于为 Windows 容器构建的 C#.NET 控制台应用程序的 microsoft/dotnet-framework 创建了一个 Docker 映像,然后确保我可以在本地容器中运行该映像。我成功地将映像推送到我们的 Azure 容器注册表。现在我正在尝试在我们的 Azure Kubernetes 服务中创建部署,但我收到了一个错误:

未能拉取图像“容器注册表/图像:标签”:rpc 错误:代码 = 未知 desc = 未知 blob

我在 Kubernetes 仪表板中的部署、Pod 和副本集上看到此错误。

我们已经有一个可用于 azure-vote 应用程序的秘密,所以我认为这与秘密无关,但我可能错了。

到目前为止,我已尝试通过将以下 YAML 粘贴到 Kubernetes 仪表板的“创建”对话框中来创建此部署:

apiVersion:
kind: Deployment
metadata:
  name: somename
spec:
  selector:
    matchLabels:
      app: somename
      tier: backend
  replicas: 2
  template:
    metadata:
      labels:
        app: somename
        tier: backend
    spec:
      containers:
      - name: somename
        image: container-registry/image:tag
        ports:
        - containerPort: 9376

我还尝试运行这个 kubectl 命令的变体:

kubectl run deploymentname --image=container-registry/image:tag

到目前为止,在我的调查中,我尝试阅读 k8s 的不同部分以了解可能出了什么问题,但这对我来说都是全新的。我认为这可能与这是基于 Windows Server 2016 的映像有关。一位团队成员成功地将 azure-vote 教程代码添加到我们的 AKS,所以我想知道对于运行基于 Windows 和 Linux 的容器的部署的单个 AKS 服务是否存在限制。我通过运行az aks list 看到 AKS 有一个带有“osType”的 agentPoolProfile:“Linux”,但我不知道这是否仅仅意味着编排器位于 Linux 中,或者 pod 中的容器是否必须基于 Linux .我发现有关“未知 blob”错误的 stackoverflow 问题,似乎 the answer to this question 可能支持我的假设,但我无法判断该问题是否与我的问题有关。

由于错误与未能拉取图像有关,我认为这与为此部署配置服务无关。添加服务并没有改变任何东西。在怀疑图像已损坏的情况下,我尝试重建我的应用程序,但重建和重新注册没有效果。我读到的另一件似乎不相关的事情是 this question and answer 关于明显不匹配(我还不完全理解)。

我没有尝试创建本地 Kubernetes。我不知道这是否是人们通常会做的事情。

问题总结:

  1. 是什么导致了这个未知的 blob 错误?是否与 Windows 容器/Linux 容器不匹配有关?
  2. 代理池配置文件会影响集群中的所有节点,还是只影响“主”节点?

如果您需要更多信息,请告诉我。谢谢。

【问题讨论】:

    标签: c# azure docker kubernetes azure-container-registry


    【解决方案1】:

    1.是什么导致了这个未知的 blob 错误?是否与 Windows 容器/Linux 容器不匹配有关? 这是因为您尝试在 Linux 主机上运行基于 Windows 的 Docker 容器。它与 Kubernetes 或 AKS 没有直接关系。目前 AKS 处于预览阶段,仅支持 Linux 环境。更准确地说,当您配置 AKS 集群 (az aks create) 时,您的所有 k8s minions(工作节点)都将是 Linux 机器,因此将无法运行基于 Windows 的容器。

    2。代理池配置文件会影响集群中的所有节点,还是仅影响“主”节点? 它会影响工作节点,并用于将它们按逻辑分组在一起,以便您可以更好地管理工作负载分配。将来,当 AKS 同时支持 Linux 和 Windows 时,您将能够即根据操作系统类型创建代理池,并指示 k8s 将基于 Windows 的服务仅部署到基于 Windows 的主机(代理)。

    【讨论】:

    • 谢谢@dmusial。另外,this link 重申了你所说的。我现在将研究 ACS,并密切关注 AKS 何时支持 Windows 容器。
    • 对于可能阅读此问题的其他人,您可以关注 Microsoft 为 Azure 发布的内容azure.microsoft.com/en-us/roadmap
    • 如果您在本地构建 docker 容器,请不要忘记检查您的本地 docker 是否设置为使用 Linux Containers。
    【解决方案2】:

    我不确定这是否适用于您,因为它可能看起来是一个新部署,但我现在在 GKE 环境中为现有部署做了两次。 我正在使用带有 nodejs 的 Ubuntu 映像,全部基于 Linux。 由于某种原因,图像似乎已损坏,或者 GKE 设置中的某些东西认为是这样。 我可以通过再次推送到注册表然后将部署指向新映像来解决问题。

    我可以通过简单地从另一台经过身份验证的机器上拉取 docker 映像来重现它,例如:

    docker pull gcr.io/project-name/app-name@sha256:somelongrandomhash
    

    这给了我同样的错误。 一旦我注意到这一点,我只是重新发布了图像并且它起作用了。 因此,尽管它可能是操作系统基础映像的差异导致的,正如其他人所建议的那样,请检查本地拉取以查看它是否正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-09
      • 1970-01-01
      • 2023-02-25
      • 1970-01-01
      • 2020-06-18
      • 2021-04-11
      相关资源
      最近更新 更多