如何解决这个问题 ErrImageNeverPull pod 创建状态 kubernetes

How to resolve this issue ErrImageNeverPull pod creation status kubernetes

我正在从驻留在主节点上的映像创建一个 pod。当我在主节点上创建要调度到工作节点上的 pod 时,我得到 pod ErrImageNeverPull

的状态
kind: Pod
metadata:
   name: cloud-pipe
   labels:
      app: cloud-pipe
spec:
   containers:
     - name: cloud-pipe
       image: cloud-pipeline:latest
       command: ["sleep"]
       args: ["infinity"]

Kubectl 描述 pod 详细信息:

   Type     Reason             Age                   From               Message
   - ---     ------             ----                  ----               -------   
    Normal   Scheduled          15m                   default-scheduler  Successfully assigned 
    default/cloud-pipe to knode
    Warning  ErrImageNeverPull  5m54s (x49 over 16m)  kubelet            Container image "cloud- 
    pipeline:latest" is not present with pull policy of Never
    Warning  Failed             51s (x72 over 16m)    kubelet            Error: ErrImageNeverPull

如何解决这个问题。另外,我的问题是 Kubernetes 默认情况下是否会在工作节点上查找图像是否存在?谢谢

kubernetes 创建容器时,首先会查找本地镜像,然后会尝试注册(docker 默认注册)

您收到此错误是因为:

  • 无法在您的节点上本地找到您的图像。

  • 您指定了 imagePullPolicy: Never,因此您永远不会尝试从注册表下载映像

解决这个问题的方法很少,但它们通常都会指导您在本地获取图像并正确标记它。

要在您的节点上获取图像,您可以:

  • copy images from one node to another

  • 从现有的 Dockerfile 构建镜像

获得镜像后,标记它并在部署中指定

docker tag cloud-pipeline:latest mytest:mytest

kind: Pod
metadata:
   name: cloud-pipe
   labels:
      app: cloud-pipe
spec:
   containers:
     - name: cloud-pipe
       image: mytest:mytest
       imagePullPolicy: Never
       command: ["sleep"]
       args: ["infinity"]

或者您可以配置自己的本地注册表,将标记的图像推送到其中,然后使用 imagePullPolicy: IfNotPresent。更多信息请见@dryairship answer

此外,请确保对 imagePullPolicy: Never 图像使用 eval $(minikube docker-env),以防您使用 minikube(您没有指定任何标签,但它可能会有所帮助)。 问题

中的更多信息