199

突然之间,我无法部署一些以前可以部署的图像。我得到了以下 pod 状态:

[root@webdev2 origin]# oc get pods 
NAME                      READY     STATUS             RESTARTS   AGE 
arix-3-yjq9w              0/1       ImagePullBackOff   0          10m 
docker-registry-2-vqstm   1/1       Running            0          2d 
router-1-kvjxq            1/1       Running            0          2d 

该应用程序将无法启动。pod 未尝试运行容器。从事件页面,我得到了Back-off pulling image "172.30.84.25:5000/default/arix@sha256:d326. 我已经验证我可以使用带有docker pull.

我还检查了最后一个容器的日志。由于某种原因它被关闭了。我认为吊舱至少应该尝试重新启动它。

我已经没有办法调试这些问题了。我还能检查什么?

4

12 回答 12

205

您可以使用 ' describe pod ' 语法

对于 OpenShift 使用:

oc describe pod <pod-id>  

对于普通 Kubernetes:

kubectl describe pod <pod-id>  

检查输出的事件。就我而言,它显示Back-off pulling image unreachableserver/nginx:1.14.22222

这种情况下unreachableserver/nginx:1.14.22222无法从网上拉取镜像,因为没有Docker registry unreachableserver,镜像nginx:1.14.22222也不存在。

注意:如果您没有看到任何感兴趣的事件,并且 pod 已处于“ImagePullBackOff”状态一段时间(似乎超过 60 分钟),您需要删除该 pod 并查看新 pod 中的事件。

对于 OpenShift 使用:

oc delete pod <pod-id>
oc get pods
oc get pod <new-pod-id>

对于普通 Kubernetes:

kubectl delete pod <pod-id>  
kubectl get pods
kubectl get pod <new-pod-id>

样本输出:

  Type     Reason     Age                From               Message
  ----     ------     ----               ----               -------
  Normal   Scheduled  32s                default-scheduler  Successfully assigned rk/nginx-deployment-6c879b5f64-2xrmt to aks-agentpool-x
  Normal   Pulling    17s (x2 over 30s)  kubelet            Pulling image "unreachableserver/nginx:1.14.22222"
  Warning  Failed     16s (x2 over 29s)  kubelet            Failed to pull image "unreachableserver/nginx:1.14.22222": rpc error: code = Unknown desc = Error response from daemon: pull access denied for unreachableserver/nginx, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
  Warning  Failed     16s (x2 over 29s)  kubelet            Error: ErrImagePull
  Normal   BackOff    5s (x2 over 28s)   kubelet            Back-off pulling image "unreachableserver/nginx:1.14.22222"
  Warning  Failed     5s (x2 over 28s)   kubelet            Error: ImagePullBackOff

其他调试步骤

  1. 尝试在您的计算机上手动拉取 docker 映像和标记
  2. 通过执行 'kubectl/oc get pods -o wide' 来识别节点
  3. ssh 进入无法拉取 docker 映像的节点(如果可以)
  4. 检查节点是否可以通过执行 ping 解析 docker 注册表的 DNS。
  5. 尝试在节点上手动拉取docker镜像
  6. 如果您使用的是私有注册表,请检查您的密钥是否存在并且该密钥是否正确。您的秘密也应该在同一个命名空间中。谢谢斯文泽尔
  7. 一些注册表具有限制 IP 地址访问的防火墙。防火墙可能会阻止拉取
  8. 一些 CI 使用临时 Docker 机密创建部署。所以秘密在几天后到期(你要求生产失败......)
于 2017-05-24T06:40:15.343 回答
3

我遇到了类似的情况,结果发现,随着 Docker Desktop 的实现,我退出了。重新登录后,一切都恢复正常。

于 2021-01-13T10:38:01.977 回答
2

尝试编辑以查看问题所在(我的图像位置错误):

kubectl edit pods arix-3-yjq9w

甚至删除您的 pod:

kubectl delete arix-3-yjq9w
于 2016-10-12T12:48:39.257 回答
2

我在Google Kubernetes Engine (GKE)上遇到了这个问题,原因是 Docker 没有凭据。

运行它解决了它:

gcloud auth configure-docker
于 2021-02-07T14:53:55.853 回答
1

在 GKE 上,如果 pod 已死,最好检查事件。它将更详细地显示错误的含义。

就我而言,我有:

Failed to pull image "gcr.io/project/imagename@sha256:c8e91af54fc17faa1c49e2a05def5cbabf8f0a67fc558eb6cbca138061a8400a":
 rpc error: code = Unknown desc = error pulling image configuration: unknown blob

事实证明,图像以某种方式损坏。在重新推送它并使用新的哈希部署后,它再次工作。

回想起来,我认为图像已损坏,因为 GCP 中托管图像的存储桶上设置了清理策略,并且基本上删除了图像。因此,可以在事件中看到上述消息。

其他常见问题是名称错误(gcr.io vs eu.gcr.io),也可能是无法以某种方式访问​​注册表。同样,提示在事件中,那里的消息应该告诉你足够的信息。

可以在此处找到更多一般信息(例如用于身份验证):

推拉镜像

于 2020-07-10T09:38:27.293 回答
0

我忘记将标记为 1.0.8 的图像推送到ECR(AWS 图像中心)...如果您使用Helm并通过以下方式升级:

helm 升级 minta-user ./src/services/user/helm-chart

确保将文件values.yaml中的图像标签推送(到 ECR 或Docker Hub等)。例如(这是我的 *helm-chart/values.yaml):

replicaCount: 1

image:
   repository:dkr.ecr.us-east-1.amazonaws.com/minta-user
   tag: 1.0.8

你需要确保image:1.0.8被推送!

于 2019-05-07T11:11:17.247 回答
0

就我而言,使用 Fargate 配置文件时,我的VPC中的网络配置不正确。Fargate 容器需要访问ECR,这需要到公共 Internet 的路由。

我的私有子网的 NAT 网关位于相同的私有子网中,而它们本应位于公共子网中。在我的情况下,此错误消息是错误配置的结果。

于 2021-07-02T13:37:21.313 回答
0

确保您的存储库可公开访问。我的设置为私有并提供“ImagePullBackOff”状态。

于 2022-02-28T16:15:08.650 回答
-1

运行以下命令:

eval $(minikube -p minikube docker-env)

现在构建你的图像。然后在 Kubernetes 中使用相同的图像。每次打开新的命令行窗口时都这样做。

于 2021-03-12T13:52:05.630 回答
-1

检查 pod 日志并重新启动 pod,因为可能会使您的 pod 崩溃

  1. kubectl logs [-f] [-p] (POD | TYPE/NAME) [-c CONTAINER]

  2. kubectl get pod -n kube-system

  3. 它显示了哪些 ImagePullBackOff kube-system pod

  4. kubectl delete pod <POD NAME> -n kube-system(重启 pod 并重新创建容器)

  5. kubectl get pods -n <NAME SPACE>

检查 pod yaml 中的 yot 图像地址:

kubectl edit deployment <your_deployment> -n <NAME SPACE>
于 2021-04-27T08:05:00.017 回答
-2

我遇到了类似的问题,但是我的所有 pod 都没有准备好并显示 Ready 状态 0/1 而不是一个

就像是:

在此处输入图像描述

我尝试了很多东西,但最后我发现上下文设置不正确。

请使用以下命令并确保您处于正确的上下文中:

kubectl config get-contexts
于 2020-07-01T04:45:41.637 回答
-12

脚步:

  • 运行docker login

  • 将镜像推送到Docker Hub

  • 重新创建 pod

这为我解决了这个问题。

于 2018-11-11T17:09:01.557 回答