【问题标题】:Why docker download the same image again while I using Kubernetes为什么在我使用 Kubernetes 时 docker 再次下载相同的图像
【发布时间】:2018-04-11 22:16:16
【问题描述】:

我在没有互联网的隔离环境中使用 kbuernetes 和 docker,我总是在其他机器上拉图像并保存到 .tar 文件并加载到隔离环境,但有时 kubernetes 的 Pod 无法成功启动并说 Pod 是拉图像但网络不正常。 但是我查看了docker的镜像,镜像已经加载了,为什么还要拉同一个镜像呢?

这是docker的镜像,MYSQL的镜像已经加载完毕:

[root@localhost kubecfg]# docker images
REPOSITORY                                                       TAG                 IMAGE ID            CREATED             SIZE
quay.io/kubernetes-ingress-controller/nginx-ingress-controller   0.12.0              4a9cd8a2008a        3 weeks ago         230.5 MB
docker.io/mysql                                                  latest              5195076672a7        3 weeks ago         371.4 MB
gcr.io/google_containers/kube-apiserver-amd64                    v1.9.2              7109112be2c7        11 weeks ago        210.4 MB

这是 Kubernetes 的错误日志

[root@localhost kubecfg]# kubectl describe pod mysql-vmwdw
Name:           mysql-vmwdw
Namespace:      default
Node:           localhost.localdomain/192.168.88.129
Start Time:     Mon, 02 Apr 2018 14:14:07 +0800
Labels:         app=mysql
Annotations:    <none>
Status:         Running
IP:             192.168.0.61
Controlled By:  ReplicationController/mysql
Containers:
  mysql:
    Container ID:   docker://9aa3128eaa1f330dfd0d6ebf732dca5a99ad49d7d6d4002a2384bdb03e056d7d
    Image:          docker.io/mysql
    Image ID:       docker-pullable://docker.io/mysql@sha256:691c55aabb3c4e3b89b953dd2f022f7ea845e5443954767d321d5f5fa394e28c
    Port:           3306/TCP
    State:          Waiting
      Reason:       ImagePullBackOff
    Last State:     Terminated
      Reason:       Error
      Exit Code:    1
      Started:      Tue, 10 Apr 2018 14:56:04 +0800
      Finished:     Wed, 11 Apr 2018 08:56:04 +0800
    Ready:          False
    Restart Count:  3
    Environment:
      MYSQL_ROOT_PASSWORD:  123456
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-s7kq2 (ro)
Conditions:
  Type           Status
  Initialized    True 
  Ready          False 
  PodScheduled   True 
Volumes:
  default-token-s7kq2:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-s7kq2
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type     Reason                  Age                 From                            Message
  ----     ------                  ----                ----                            -------
  Normal   SuccessfulMountVolume   19m                 kubelet, localhost.localdomain  MountVolume.SetUp succeeded for volume "default-token-s7kq2"
  Normal   SandboxChanged          19m (x12 over 19m)  kubelet, localhost.localdomain  Pod sandbox changed, it will be killed and re-created.
  Warning  FailedCreatePodSandBox  19m (x12 over 19m)  kubelet, localhost.localdomain  Failed create pod sandbox.
  Warning  Failed                  9m (x6 over 18m)    kubelet, localhost.localdomain  Failed to pull image "docker.io/mysql": rpc error: code = Unknown desc = Network timed out while trying to connect to https://index.docker.io/v1/repositories/library/mysql/images. You may want to check your internet connection or if you are behind a proxy.
  Warning  Failed                  4m (x41 over 18m)   kubelet, localhost.localdomain  Error: ImagePullBackOff

它说:“无法提取图像“docker.io/mysql”:rpc 错误:代码 = 未知描述 = 尝试连接到 https://index.docker.io/v1/repositories/library/mysql/images 时网络超时。您可能需要检查您的互联网连接或者如果您使用代理。”

我已经加载了图像,为什么 docker 会再次拉取相同的图像?我应该怎么做才能解决这个问题?

【问题讨论】:

    标签: docker kubernetes


    【解决方案1】:

    您正在为图像使用:latest 标签。当镜像标签为latest时,kubernetes会将imagePullPolicy设置为Always。详情请see the official doc

    您可以将标签更改为其他内容(例如,docker.io/mysql:8.0),或者您可以自己将imagePullPolicy 指定为Never

    【讨论】:

      【解决方案2】:

      不清楚指定的imagePullPolicy 是什么。在您的情况下,它应该是Never

      https://kubernetes.io/docs/concepts/containers/images/#pre-pulling-images

      【讨论】:

        【解决方案3】:

        在您的情况下,通过

        创建部署
         kubectl run mysql --image=docker.io/mysql --imagePullPolicy=Never
        

        应该可以解决问题。或者,您可以在部署的 yaml 规范中将 imagePullPolicy 设置为 NeverIfNotPresent 以修复此错误。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-10-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-07
          • 2016-05-11
          • 1970-01-01
          相关资源
          最近更新 更多