Kubernetes 拉取镜像失败,出现未知 blob 错误
Kubernetes fails to pull image with unknown blob error
我基于为 Windows 容器构建的 C#.NET 控制台应用程序的 microsoft/dotnet-framework 创建了一个 Docker 图像,然后确保我可以 运行 图像本地容器。我成功地将图像推送到我们的 Azure 容器注册表。现在我正在尝试在我们的 Azure Kubernetes 服务中创建部署,但出现错误:
Failed to pull image "container-registry/image:tag": rpc error: code = Unknown desc = unknown blob
我在我的部署 pods 和 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 服务 运行ning 部署是否有限制基于容器。我通过 运行ning az aks list
看到 AKS 有一个带有 "osType" 的 agentPoolProfile:"Linux",但我不知道这是否意味着协调器在 Linux 或者 pods 中的容器必须基于 Linux。我发现了关于 "unknown blob" 错误的 Whosebug 问题,似乎 可能支持我的假设,但我无法判断该问题是否与我的问题有关。
由于错误与拉取映像失败有关,我认为这与为此部署配置服务无关。添加服务并没有改变任何东西。在怀疑图像已损坏的情况下,我尝试重建我的应用程序,但重建和重新注册没有任何效果。我读到的另一件似乎不相关的事情是 关于明显的不匹配(我还不完全理解)。
我没有尝试创建本地 Kubernetes。我不知道这是不是人们通常做的事情。
问题总结:
- 是什么导致了这个未知的 blob 错误?是否与 Windows container/Linux 容器不匹配有关?
- 代理池配置文件是影响集群中的所有节点,还是只影响 "master" 个节点?
如果您需要更多信息,请告诉我。谢谢。
1.是什么导致了这个未知的 blob 错误?是否与 Windows container/Linux 容器不匹配有关?
这是因为您正试图在 Linux 主机上 运行 基于 Windows 的 Docker 容器。它与 Kubernetes 或 AKS 没有直接关系。目前 AKS 处于预览阶段,仅支持 Linux 环境。更准确地说,当你配置你的 AKS 集群(az aks create
)时,你所有的 k8s minions(工作节点)将是 Linux 个盒子,因此将无法 运行 [=21] =] 基于容器。
2。代理池配置文件是影响集群中的所有节点,还是仅影响 "master" 个节点?
它会影响工作节点并用于将它们逻辑分组在一起,以便您可以更好地管理工作负载分配。将来,当 AKS 同时支持 Linux 和 Windows 时,您将能够即基于 OS 类型创建代理池并指示 k8s 部署基于 Windows 的代理池仅向基于 Windows 的主机(代理)提供服务。
我不确定这是否适用于您,因为它可能看起来是一个新的部署,但我现在已经在 GKE 环境中为现有部署部署了两次。
我正在使用带有 nodejs 的 Ubuntu 图像,全部基于 Linux。
由于某种原因,图像似乎已损坏或 GKE 设置中的某些东西认为是这样。
我可以通过再次推送到注册表然后将部署指向新映像来解决问题。
我可以通过简单地从另一台经过身份验证的机器上拉取 docker 图像来重现它,例如:
docker pull gcr.io/project-name/app-name@sha256:somelongrandomhash
这给了我同样的错误。
一旦我注意到这一点,我就重新推送图像并且它起作用了。
因此,尽管它可能是 OS 基础图像差异导致的,但正如其他人所建议的那样,请检查本地拉动以查看其是否有效。
我基于为 Windows 容器构建的 C#.NET 控制台应用程序的 microsoft/dotnet-framework 创建了一个 Docker 图像,然后确保我可以 运行 图像本地容器。我成功地将图像推送到我们的 Azure 容器注册表。现在我正在尝试在我们的 Azure Kubernetes 服务中创建部署,但出现错误:
Failed to pull image "container-registry/image:tag": rpc error: code = Unknown desc = unknown blob
我在我的部署 pods 和 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 服务 运行ning 部署是否有限制基于容器。我通过 运行ning az aks list
看到 AKS 有一个带有 "osType" 的 agentPoolProfile:"Linux",但我不知道这是否意味着协调器在 Linux 或者 pods 中的容器必须基于 Linux。我发现了关于 "unknown blob" 错误的 Whosebug 问题,似乎
由于错误与拉取映像失败有关,我认为这与为此部署配置服务无关。添加服务并没有改变任何东西。在怀疑图像已损坏的情况下,我尝试重建我的应用程序,但重建和重新注册没有任何效果。我读到的另一件似乎不相关的事情是
我没有尝试创建本地 Kubernetes。我不知道这是不是人们通常做的事情。
问题总结:
- 是什么导致了这个未知的 blob 错误?是否与 Windows container/Linux 容器不匹配有关?
- 代理池配置文件是影响集群中的所有节点,还是只影响 "master" 个节点?
如果您需要更多信息,请告诉我。谢谢。
1.是什么导致了这个未知的 blob 错误?是否与 Windows container/Linux 容器不匹配有关?
这是因为您正试图在 Linux 主机上 运行 基于 Windows 的 Docker 容器。它与 Kubernetes 或 AKS 没有直接关系。目前 AKS 处于预览阶段,仅支持 Linux 环境。更准确地说,当你配置你的 AKS 集群(az aks create
)时,你所有的 k8s minions(工作节点)将是 Linux 个盒子,因此将无法 运行 [=21] =] 基于容器。
2。代理池配置文件是影响集群中的所有节点,还是仅影响 "master" 个节点? 它会影响工作节点并用于将它们逻辑分组在一起,以便您可以更好地管理工作负载分配。将来,当 AKS 同时支持 Linux 和 Windows 时,您将能够即基于 OS 类型创建代理池并指示 k8s 部署基于 Windows 的代理池仅向基于 Windows 的主机(代理)提供服务。
我不确定这是否适用于您,因为它可能看起来是一个新的部署,但我现在已经在 GKE 环境中为现有部署部署了两次。 我正在使用带有 nodejs 的 Ubuntu 图像,全部基于 Linux。 由于某种原因,图像似乎已损坏或 GKE 设置中的某些东西认为是这样。 我可以通过再次推送到注册表然后将部署指向新映像来解决问题。
我可以通过简单地从另一台经过身份验证的机器上拉取 docker 图像来重现它,例如:
docker pull gcr.io/project-name/app-name@sha256:somelongrandomhash
这给了我同样的错误。 一旦我注意到这一点,我就重新推送图像并且它起作用了。 因此,尽管它可能是 OS 基础图像差异导致的,但正如其他人所建议的那样,请检查本地拉动以查看其是否有效。