kubernetes不能拉当地形象

gin*_*nda 15 docker kubernetes docker-registry

我在一台机器上使用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
Run Code Online (Sandbox Code Playgroud)

我的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"
Run Code Online (Sandbox Code Playgroud)

Mar*_*her 24

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

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

  • 要将 `imagePullPolicy` 设置为 `IfNotPresent`,您可以通过运行 ```bash $ kubectl edit deployment &lt;deployment-name&gt; ``` 来编辑部署配置 (7认同)
  • 我收到此答案时出现此错误:ErrImagePull (2认同)

dry*_*hip 23

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

1)启动本地注册容器:

docker run -d -p 5000:5000 --restart=always --name registry registry:2
Run Code Online (Sandbox Code Playgroud)

2)docker images找出你本地镜像的 REPOSITORY 和 TAG。然后为您的本地图像创建一个新标签:

docker tag <local-image-repository>:<local-image-tag> localhost:5000/<local-image-name>
Run Code Online (Sandbox Code Playgroud)

如果您本地图像的 TAG 是<none>,您可以简单地执行以下操作:

docker tag <local-image-repository> localhost:5000/<local-image-name>
Run Code Online (Sandbox Code Playgroud)

3)推送到本地注册表:

docker push localhost:5000/<local-image-name>
Run Code Online (Sandbox Code Playgroud)

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

4) 在你的 yaml 文件中,设置imagePullPolicyIfNotPresent

...
spec:
  containers:
  - name: <name>
    image: localhost:5000/<local-image-name>
    imagePullPolicy: IfNotPresent
...
Run Code Online (Sandbox Code Playgroud)

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

  • 我认为 docker 注册表是一个更好的解决方案,而不是像 imagePullPolicy: Never 这样的 hack 之类的东西 (2认同)

Ali*_*lin 21

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

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

  • 没有提到使用 minikube (11认同)

Tim*_*ann 8

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

  • 所以你的机器上有图像。然而,它仍然尝试从 Docker Hub 拉取镜像,这可能不是您在单机设置中想要的。发生这种情况是因为 `latest` 标签将 `imagePullPolicy` 隐式设置为 `Always`。您可以尝试将其显式设置为 `IfNotPresent` 或更改为 `latest` 以外的标签。 (26认同)

小智 7

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

 spec:
  containers:
  - name: <name>
    image: <local-image-name>
    imagePullPolicy: Never
Run Code Online (Sandbox Code Playgroud)

  • 错误:容器映像“[CONTAINER]”不存在,且拉取策略为“从不”。 (2认同)
  • @Riz,我也面临着同样的错误,你已经解决了这个问题吗? (2认同)