【问题标题】:kubernetes cannot pull local imagekubernetes 无法拉取本地镜像
【发布时间】:2016-08-20 20:51:36
【问题描述】:

我在单机上使用 kubernetes 进行测试,我已经从 nginx docker 镜像构建了一个自定义镜像,但是当我尝试在 kubernetes 中使用该镜像时,出现镜像拉取错误??????

我的 POD YAML

kind: Pod
apiVersion: v1
metadata:
  name: yumserver
  labels:
    name: frontendhttp
spec:
  containers:
    - name: myfrontend
      image: my/nginx:latest
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
      - mountPath: "/usr/share/nginx/html"
        name: mypd
  imagePullSecrets:
    - name: myregistrykey

  volumes:
    - name: mypd
      persistentVolumeClaim:
       claimName: myclaim-1

我的 KUBERNETES 命令

kubectl create -f pod-yumserver.yaml

错误

kubectl describe pod yumserver


Name: yumserver
Namespace: default
Image(s):   my/nginx:latest
Node:       127.0.0.1/127.0.0.1
Start Time: Tue, 26 Apr 2016 16:31:42 +0100
Labels:     name=frontendhttp
Status:     Pending
Reason:     
Message:    
IP:     172.17.0.2
Controllers:    <none>
Containers:
  myfrontend:
    Container ID:   
    Image:      my/nginx:latest
    Image ID:       
    QoS Tier:
      memory:       BestEffort
      cpu:      BestEffort
    State:      Waiting
      Reason:       ErrImagePull
    Ready:      False
    Restart Count:  0
    Environment Variables:
Conditions:
  Type      Status
  Ready     False 
Volumes:
  mypd:
    Type:   PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  myclaim-1
    ReadOnly:   false
  default-token-64w08:
    Type:   Secret (a secret that should populate this volume)
    SecretName: default-token-64w08
Events:
  FirstSeen LastSeen    Count   From            SubobjectPath           Type        Reason          Message
  --------- --------    -----   ----            -------------           --------    ------          -------
  13s       13s     1   {default-scheduler }                    Normal      Scheduled       Successfully assigned yumserver to 127.0.0.1
  13s       13s     1   {kubelet 127.0.0.1}                 Warning     MissingClusterDNS   kubelet does not have ClusterDNS IP configured and cannot create Pod using "ClusterFirst" policy. Falling back to DNSDefault policy.
  12s       12s     1   {kubelet 127.0.0.1} spec.containers{myfrontend} Normal      Pulling         pulling image "my/nginx:latest"
  8s        8s      1   {kubelet 127.0.0.1} spec.containers{myfrontend} Warning     Failed          Failed to pull image "my/nginx:latest": Error: image my/nginx:latest not found
  8s        8s      1   {kubelet 127.0.0.1}                 Warning     FailedSync      Error syncing pod, skipping: failed to "StartContainer" for "myfrontend" with ErrImagePull: "Error: image my/nginx:latest not found"

【问题讨论】:

标签: docker kubernetes docker-registry


【解决方案1】:

所以你的机器上有图像。但是,它仍会尝试从 Docker Hub 中提取映像,这可能不是您在单机设置中想要的。发生这种情况是因为最新标签将 imagePullPolicy 隐式设置为 Always。您可以尝试将其显式设置为 IfNotPresent 或更改为 latest 以外的标签。 – Timo Reimann 4 月 28 日 7:16

出于某种原因,Timo Reimann 只是在上面发布了这个作为评论,但它绝对应该是这个问题的官方答案,所以我再次发布它。

【讨论】:

  • 顺便说一句,恕我直言,无论如何您都应该始终指定一个版本。让一切变得更加可预测......
  • 要将imagePullPolicy 设置为IfNotPresent,您可以通过运行bash $ kubectl edit deployment &lt;deployment-name&gt; 来编辑部署配置
  • 我得到这个答案的错误:ErrImagePull
  • 正如@Martin Rauscher 建议的那样,我将图像标签从最新更改并明确添加 imagePullPolicy 到 IfNotPresent 以首先尝试在本地查找图像行为。请参阅有关隐式获取图像行为的 kubernetes 文档:kubernetes.io/docs/concepts/containers/images
【解决方案2】:

在构建映像之前运行 eval $(minikube docker-env)。

完整答案在这里:https://stackoverflow.com/a/40150867

【讨论】:

【解决方案3】:

无论您是否使用 minikube,这都应该有效:

  1. 启动本地注册表容器:
docker run -d -p 5000:5000 --restart=always --name registry registry:2
  1. docker images 查找本地镜像的 REPOSITORY 和 TAG。然后为您的本地图像创建一个新标签:
docker tag <local-image-repository>:<local-image-tag> localhost:5000/<local-image-name>

如果您本地图像的 TAG 是 &lt;none&gt;,您可以这样做:

docker tag <local-image-repository> localhost:5000/<local-image-name>
  1. 推送到本地注册表:
docker push localhost:5000/<local-image-name>

这会自动将latest 标签添加到localhost:5000/&lt;local-image-name&gt;。 您可以通过docker images 再次检查。

  1. 在您的 yaml 文件中,将 imagePullPolicy 设置为 IfNotPresent
...
spec:
  containers:
  - name: <name>
    image: localhost:5000/<local-image-name>
    imagePullPolicy: IfNotPresent
...

就是这样。现在你的 ImagePullError 应该得到解决了。

注意:如果集群中有多个主机,并且您想使用特定的主机来托管注册表,只需将上述所有步骤中的localhost替换为主机的主机名即可托管注册表容器的位置。在这种情况下,您可能需要允许与注册表的 HTTP(非 HTTPS)连接:

5(可选)。允许连接到工作节点中不安全的注册表:

sudo echo '{"insecure-registries":["<registry-hostname>:5000"]}' > /etc/docker/daemon.json

【讨论】:

  • 我认为 docker registry 是一个更好的解决方案,而不是像 imagePullPolicy: Never
  • 以上都不适合我。非常感谢这个确实有效。它应该在顶部。
  • 我发现这个背景很有帮助:linuxhint.com/setup_own_docker_image_repository.
【解决方案4】:

只需将 imagePullPolicy 添加到您的部署文件中 它对我有用

 spec:
  containers:
  - name: <name>
    image: <local-image-name>
    imagePullPolicy: Never

【讨论】:

  • 错误:容器镜像“[CONTAINER]”不存在,拉取策略为 Never。
  • @Riz,我也面临同样的错误,你已经解决了这个问题吗?
  • @shivam ,同样的错误,你解决了吗?
  • @McLan 是的,我还删除了部署(使用 pod)和 configmap,在创建新的 configmap 和部署之前,我执行了命令:eval $(minikube docker-env)。
  • 谢谢@shivam。我不在 minikube 上。所以我怀疑最后一步是否适用!
【解决方案5】:

进一步分析ErrImagePull 问题的最简单方法是通过ssh 进入节点并尝试通过执行docker pull my/nginx:latest 手动拉取图像。我从未在单台机器上设置过 Kubernetes,但可以想象由于某种原因无法从节点访问 Docker 守护进程。一个简单的拉动尝试应该提供更多信息。

【讨论】:

  • docker pull my/nginx:latest Trying to pull repository docker.io/my/nginx ... failed 拉取镜像时出错:获取index.docker.io/v1/repositories/my/nginx/images:拨打tcp:查找index.docker.io:没有与主机名关联的地址
  • docker images REPOSITORY TAG IMAGE ID Created VIRTUAL SIZE my/nginx latest 04938de4965a 2 周前 182.6 MB
  • 所以你的机器上已经有图像了。但是,它仍会尝试从 Docker Hub 中提取映像,这可能不是您在单机设置中想要的。这是因为latest 标记将imagePullPolicy 隐式设置为Always。您可以尝试将其显式设置为IfNotPresent 或更改为latest 以外的标签。
【解决方案6】:

你在 Linux 上使用 minikube 吗?您需要安装 docker(我认为),但您不需要启动它。 Minikube 会这样做。尝试通过以下命令使用 KVM 驱动程序:

minikube start --vm-driver kvm

然后运行eval $(minikube docker-env) 命令以确保您使用的是 minikube docker 环境。使用标签 build -t mycontainername:version . 构建您的容器

如果您随后键入 docker ps,您应该会看到一堆 minikube 容器已经在运行。 kvm utils 可能已经在你的机器上,但它们可以像这样安装在 centos/rhel 上:

yum install qemu-kvm qemu-img virt-manager libvirt libvirt-python 

【讨论】:

    【解决方案7】:

    确保您在 Docker Desktop 中的“Kubernetes 上下文”实际上是一个“docker-desktop”(即不是远程集群)。

    (右键单击 Docker 图标,然后在菜单中选择“Kubernetes”)

    【讨论】:

      【解决方案8】:

      您需要做的只是从您的 dockerfile 进行 docker 构建,或者获取集群节点上的所有图像,执行合适的 docker 标签并创建清单。

      Kubernetes 不直接从注册表中提取。首先它在本地存储上搜索图像,然后在 docker 注册表中搜索。

      1. 拉取最新的nginx镜像

        docker pull nginx

        docker 标签 nginx:latest test:test8970

      2. 创建部署 kubectl run test --image=test:test8970 它不会去 docker 注册表来拉取图像。它会立即调出 pod。

      3. 如果 本地计算机上不存在映像,它将尝试从 docker 注册表中提取并失败并出现 ErrImagePull 错误。

      4. 另外,如果您更改 imagePullPolicy: Never。它永远不会寻找注册表来拉取图像,如果找不到图像并出现错误 ErrImageNeverPull,它将失败。

      kind: Deployment
      metadata:
        labels:
          run: test
        name: test
      spec:
        replicas: 1
        selector:
          matchLabels:
            run: test
        template:
          metadata:
            creationTimestamp: null
            labels:
              run: test
          spec:
            containers:
            - image: test:test8070
              name: test
              imagePullPolicy: Never
      

      【讨论】:

        【解决方案9】:

        如果您使用的是 vm 驱动程序,则需要告诉 Kubernetes 使用在单节点集群内运行的 Docker 守护程序而不是主机。

        运行以下命令:

        eval $(minikube docker-env)
        

        注意 - 每当您关闭并重新启动终端会话时,都需要重复此命令。

        之后,您可以构建您的图像:

        docker build -t USERNAME/REPO .
        

        更新,你的 pod manifest 如上图然后运行:

        kubectl apply -f myfile.yaml
        

        【讨论】:

        • 我收到此错误:无法提取图像“USERNAME/REPO”:rpc 错误:代码 = 未知 desc = 来自守护进程的错误响应:拒绝 USERNAME/REPO 的拉取访问,存储库不存在或可能需要“docker login”:拒绝:请求的资源访问被拒绝
        • 您需要使用自己的用户名和仓库名称,而不仅仅是 USERNAME 和 REPO
        【解决方案10】:

        如上所述,在此处添加另一个答案足以让我弄清楚我的这个问题的特定实例的原因。事实证明,我的构建过程缺少使:latest 工作所需的标记。一旦我在我的 pom.xml 中的 docker-maven-plugin 配置中添加了一个&lt;tags&gt; 部分,一切都变得很糟糕。这是一些示例配置:

        <plugin>
            <groupId>io.fabric8</groupId>
            <artifactId>docker-maven-plugin</artifactId>
            <version>0.27.2</version>
            <configuration>
                <images>
                    <image>
                        <name>akka-cluster-demo:${docker.image.version}</name>
                        <build>
                            <from>openjdk:8-jre-alpine</from>
        

        添加这个:

                            <tags>
                                <tag>latest</tag>
                                <tag>${git.commit.version}</tag>
                            </tags>
        

        其余的继续照旧:

                            <ports>
                                <port>8080</port>
                                <port>8558</port>
                                <port>2552</port>
                            </ports>
                            <entryPoint>
                                <exec>
                                    <args>/bin/sh</args>
                                    <args>-c</args>
                                    <args>java -jar /maven/cluster-sharding-kubernetes.jar</args>
                                </exec>
                            </entryPoint>
                            <assembly>
                                <inline>
                                    <dependencySets>
                                        <dependencySet>
                                            <useProjectAttachments>true</useProjectAttachments>
                                            <includes>
                                                <include>akka-java:cluster-sharding-kubernetes:jar:allinone</include>
                                            </includes>
                                            <outputFileNameMapping>cluster-sharding-kubernetes.jar</outputFileNameMapping>
                                        </dependencySet>
                                    </dependencySets>
                                </inline>
                            </assembly>
                        </build>
                    </image>
                </images>
            </configuration>
        </plugin>
        

        【讨论】:

          猜你喜欢
          • 2018-11-16
          • 2022-08-09
          • 1970-01-01
          • 2022-10-31
          • 2023-02-03
          • 1970-01-01
          • 2019-08-23
          • 1970-01-01
          • 2021-11-13
          相关资源
          最近更新 更多