问题描述
正在尝试在离线服务器上设置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镜像从一个有网络连接的机器上拉取,然后导出并在离线服务器上导入。以下是一个大致的步骤:
- 在有网络连接的机器上,使用以下命令拉取所需的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 - 将生成的tar文件复制到离线服务器上。
- 在离线服务器上,使用以下命令加载镜像:
“`bash
docker load -i kube-apiserver.tar
正文完