离线服务器上Docker镜像已经存在时,docker pull应该失败吗?

107次阅读
没有评论

问题描述

正在尝试在离线服务器上设置Kubernetes。安装的一部分需要以下Docker镜像,这些镜像已经加载到离线服务器上:

# docker images
REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
k8s.gcr.io/kube-apiserver            v1.24.1             e9f4b425f919        2 weeks ago         130MB
k8s.gcr.io/kube-proxy                v1.24.1             beb86f5d8e6c        2 weeks ago         110MB
k8s.gcr.io/kube-controller-manager   v1.24.1             b4ea7e648530        2 weeks ago         119MB
k8s.gcr.io/kube-scheduler            v1.24.1             18688a72645c        2 weeks ago         51MB
k8s.gcr.io/etcd                      3.5.3-0             aebe758cef4c        7 weeks ago         299MB
k8s.gcr.io/pause                     3.7                 221177c6082a        2 months ago        711kB
k8s.gcr.io/coredns/coredns           v1.8.6              a4ca41631cc7        8 months ago        46.8MB
artapp/postgres-gis                  12.2-3.0            7a725ccc8c00        2 years ago         490MB
k8s.gcr.io/pause                     3.2                 80d28bedfe5d        2 years ago         683kB

在执行以下命令时:

# kubeadm init --kubernetes-version=v1.24.1

对于服务器上已经存在的Docker镜像,会收到以下错误:

error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-apiserver:v1.24.1: output: E0608 16:19:45.765750   15434 remote_image.go:218] "PullImage from image service failed" err="rpc error: code = Unknown desc = failed to pull and unpack image \"k8s.gcr.io/kube-apiserver:v1.24.1\": failed to resolve reference \"k8s.gcr.io/kube-apiserver:v1.24.1\": failed to do request: Head https://k8s.gcr.io/v2/kube-apiserver/manifests/v1.24.1: dial tcp: lookup k8s.gcr.io on [::1]:53: read udp [::1]:59511->[::1]:53: read: connection refused" image="k8s.gcr.io/kube-apiserver:v1.24.1"time="2022-06-08T16:19:45+03:00" level=fatal msg="pulling image: rpc error: code = Unknown desc = failed to pull and unpack image \"k8s.gcr.io/kube-apiserver:v1.24.1\": failed to resolve reference \"k8s.gcr.io/kube-apiserver:v1.24.1\": failed to do request: Head https://k8s.gcr.io/v2/kube-apiserver/manifests/v1.24.1: dial tcp: lookup k8s.gcr.io on [::1]:53: read udp [::1]:59511->[::1]:53: read: connection refused", error: exit status 1
...

尝试拉取这些镜像时,会收到类似的错误:

# docker pull k8s.gcr.io/etcd:3.5.3-0
Error response from daemon: Get https://k8s.gcr.io/v2/: dial tcp: lookup k8s.gcr.io on [::1]:53: read udp [::1]:33012->[::1]:53: read: connection refused

这种情况是否正常?是否有一种方法可以配置Docker检查镜像是否已经存在?

解决方案

以下解决方案可能需要根据实际情况进行微调。请确保在执行重要操作之前做好备份。

方案1

Kubernetes和Docker通常会尝试从默认的镜像仓库拉取所需的镜像。然而,在你的情况下,这些镜像已经在离线服务器上存在,因此Docker不应该再尝试从远程仓库拉取它们。你可以通过以下方法来处理这个问题:
1. 使用本地镜像仓库(Registry):在你的离线服务器上搭建一个本地的Docker镜像仓库,将所需的Kubernetes镜像上传到本地仓库。然后,你可以配置Kubernetes和Docker使用本地仓库中的镜像,而不是尝试从远程仓库拉取。这将确保在本地镜像存在时,不会发生拉取远程镜像的情况。
2. 配置镜像别名:你可以通过配置Docker的镜像别名来告诉Docker使用本地镜像。在Docker的配置文件中,将远程仓库的地址映射到本地仓库的地址,这样当Docker尝试拉取远程镜像时,实际上会从本地仓库拉取已经存在的镜像。

方案2

另一种方法是将Kubernetes镜像从一个有网络连接的机器上拉取,然后导出并在离线服务器上导入。以下是一个大致的步骤:

  1. 在有网络连接的机器上,使用以下命令拉取所需的Kubernetes镜像,然后保存为tar文件:
    bash
    docker pull k8s.gcr.io/kube-apiserver:v1.24.1
    docker save -o kube-apiserver.tar k8s.gcr.io/kube-apiserver:v1.24.1
  2. 将生成的tar文件复制到离线服务器上。
  3. 在离线服务器上,使用以下命令加载镜像:
    “`bash
    docker load -i kube-apiserver.tar

正文完