Kubernetes无法提取未知blob错误的图像

时间:2018-05-31 15:31:30

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

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

  

无法提取图像“container-registry / image:tag”:rpc error:code = Unknown desc = unknown blob

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

我们已经有一个与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”,但我不知道这是否意味着Orchestrator只是在Linux中,或者pod中的容器必须是基于Linux。我发现有关“未知blob”错误的stackoverflow问题,似乎the answer to this question可能支持我的假设,但我不知道这个问题是否与我的问题有关。

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

我还没有尝试创建一个本地Kubernetes。我不知道人们通常会做些什么。

问题摘要:

  1. 导致此未知blob错误的原因是什么?是否与Windows容器/ Linux容器不匹配有关?
  2. 代理池配置文件是否会影响群集中的所有节点,还是仅影响“主”节点?
  3. 如果您需要更多信息,请与我们联系。感谢。

2 个答案:

答案 0 :(得分:2)

<强> 1。是什么导致这个未知的blob错误?是否与Windows容器/ Linux容器不匹配有关? 这是因为你试图在Linux主机上运行基于Windows的Docker容器。它与Kubernetes或AKS没有任何直接关系。目前,AKS处于预览阶段,仅支持Linux环境。更准确地说,当您配置AKS群集($(".hotel_gallery").attr("data-fancybox", "gallery") .fancybox({ prevEffect: "none", nextEffect: "none", closeBtn: true, arrows: true, beforeShow() { this.title = this.src; }, helpers: { title : { type : "inside" } } }); )时,所有k8s小兵(工作节点)都将是Linux盒子,因此将无法运行基于Windows的容器。

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

答案 1 :(得分:0)

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

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

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

这给了我同样的错误。 一旦注意到这一点,我就重新按一下图像即可使用。 因此,尽管可能是由于操作系统基础映像差异引起的,正如其他人建议的那样,但是请检查本地拉是否有效。