kubernetes不能拉当地形象

时间:2016-04-26 20:14:21

标签: docker kubernetes docker-registry

我在一台机器上使用kubernetes进行测试,我已经从nginx docker图像构建了一个自定义图像,但是当我尝试在kubernetes中使用图像时,我得到一个图像拉错误?????

MY 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

MY KUBERNETES COMMAND

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"

9 个答案:

答案 0 :(得分:17)

  

因此,您的机器上的图像已经存在。它仍然试图从Docker Hub中提取图像,但这可能不是你想要的单机设置。发生这种情况是因为最新标记将imagePullPolicy设置为Always隐式。您可以尝试将其明确设置为IfNotPresent或更改为最新以外的标记。 - Timo Reimann 4月28日7:16

出于某种原因Timo Reimann只是将上述内容作为评论发布,但它肯定应该是这个问题的正式答案,所以我再次发布它。

答案 1 :(得分:15)

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

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

答案 2 :(得分:5)

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

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

答案 3 :(得分:4)

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

答案 4 :(得分:2)

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

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

  1. 提取最新的nginx图像

    docker pull nginx

    docker tag nginx:latest test:test8970

  2. 创建部署 kubectl run test --image=test:test8970 它不会去docker注册表拉镜像。它将立即调出吊舱。 enter image description here

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

  4. 此外,如果您更改 imagePullPolicy:从不。它永远不会寻找注册表来提取图像,并且如果未找到图像并出现错误 ErrImageNeverPull ,则会失败。 enter image description here

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

答案 5 :(得分:2)

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

运行以下命令:

eval $(minikube docker-env)

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

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

docker build -t USERNAME/REPO .

更新您的 pod 清单,如上所示,然后运行:

kubectl apply -f myfile.yaml

答案 6 :(得分:1)

你在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 :(得分:0)

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

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

答案 8 :(得分:0)

如果您不使用minikube,则可以执行以下操作来解决该错误:

1)启动本地注册表容器:

docker run -d -p 5000:5000 --restart=always --name registry registry:2

2)执行docker images来查找本地图像的存储库和标签。然后为您的本地图片创建一个新标签:

docker tag <local-image-repository>:<local-image-tag> localhost:5000/<local-image-name>

如果您的本地图片的TAG为<none>,则只需执行以下操作:

docker tag <local-image-repository> localhost:5000/<local-image-name>

3)推送到本地注册表:

docker push localhost:5000/<local-image-name>

这将自动将latest标记添加到localhost:5000/<local-image-name>。 您可以通过执行docker images再次检查。

4)在您的yaml文件中,将imagePullPolicy设置为IfNotPresent

...
spec:
  containers:
  - name: <name>
    image: localhost:5000/<local-image-name>
    imagePullPolicy: IfNotPresent
...

就是这样。现在,您的ImagePullError应该已解决。