如何调试 "ImagePullBackOff"?

How can I debug "ImagePullBackOff"?

突然间,我无法部署一些以前可以部署的图像。我得到以下 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.

标签拉取图像

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

我 运行 没有调试问题的想法。我还能检查什么?

尝试编辑看看有什么问题(我的图片位置有误):

kubectl edit pods arix-3-yjq9w

甚至删除您的广告连播:

kubectl delete arix-3-yjq9w

您可以使用“describe pod”语法

对于 OpenShift 使用:

oc describe pod <pod-id>  

对于香草 Kubernetes:

kubectl describe pod <pod-id>  

检查输出的事件。 在我的例子中,它显示 Back-off pulling image unreachableserver/nginx:1.14.22222

在这种情况下,无法从 Internet 上提取图像 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. 识别节点
  4. ssh 进入无法拉取 docker 图像的节点(如果可以的话)
  5. 通过执行 ping 检查节点是否可以解析 docker 注册表的 DNS。
  6. 尝试在节点上手动拉取docker镜像
  7. 如果您使用的是私有注册表,请检查您的 secret exists and the secret is correct. Your secret should also be in the same namespace. Thanks swenzel
  8. 一些注册表有限制 ip 地址访问的防火墙。防火墙可能会阻止拉取
  9. 一些 CI 使用临时 docker 机密创建部署。所以秘密会在几天后过期(你问的是生产失败...)

步骤:

  • 运行 docker login.

  • 推图到Docker Hub

  • 重新创建 pod

这解决了我的问题。

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

helm upgrade 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 已推送!

我遇到了类似的问题,但我的所有 pods 都没有准备好并显示就绪状态 0/1

类似于:

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

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

kubectl config get-contexts

在 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),也可能是无法以某种方式访问​​注册表。同样,事件中有提示,那里的消息应该足够告诉你了。

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

Pushing and pulling images

我遇到了类似的情况,结果发现随着 Docker Desktop 的实现,我被注销了。重新登录后,一切正常。

我 运行 在 Google Kubernetes Engine (GKE) 上解决了这个问题,原因是没有 Docker.

的凭据

运行 这解决了它:

gcloud auth configure-docker

运行 下面的命令:

eval $(minikube -p minikube docker-env)

现在构建您的图像。然后在 Kubernetes 中使用相同的图像。 每次打开新命令行时都执行此操作 window.

就我而言,使用 Fargate 配置文件,我的 VPC configured incorrectly. The Fargate containers require access to ECR 中有网络,这需要到 public 互联网的路由。

我的私有子网的 NAT 网关位于相同的私有子网中,而它们本应位于 public 个子网中。在我的案例中,此错误消息是配置错误的结果。

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

对于 Ubuntu 实验室 转到您的工作节点,然后编辑以下文件

sudo vi /etc/resolv.conf

名称服务器 8.8.8.8 进行此更改并保存它将适用于实验室

如果镜像不兼容,你也会得到Back-off拉取镜像环境。它发生在我的案例中。

我已经通过 docker 拉取 k8s 节点进行了验证。