如何手动拉出Kubernetes kubeadm使用的容器镜像

时间:2020-02-23 14:31:47  来源:igfitidea点击:

当使用kubeadmin设置Kubernetes集群时,将使用init命令选项来设置Kubernetes控制平面。 Kubernetes有许多容器镜像,将在引导集群时使用。

在无法可靠访问Internet的环境中,或者当我们使用代理服务器时Internet访问受到限制时,或者Kubernetes节点根本没有Internet访问时,预拉要使用的容器镜像很有意义。

首先,我们需要打印kubeadm将使用的图像列表(在安装了kubeadm的计算机上)。

$sudo kubeadm config images list
k8s.gcr.io/kube-apiserver:v1.17.0
k8s.gcr.io/kube-controller-manager:v1.17.0
k8s.gcr.io/kube-scheduler:v1.17.0
k8s.gcr.io/kube-proxy:v1.17.0
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.5

使用的默认注册表是k8s.gcr.io,我们可以选择使用其他注册表。例如使用docker:

$sudo kubeadm config images list --image-repository docker.io
docker.io/kube-apiserver:v1.17.0
docker.io/kube-controller-manager:v1.17.0
docker.io/kube-scheduler:v1.17.0
docker.io/kube-proxy:v1.17.0
docker.io/pause:3.1
docker.io/etcd:3.4.3-0
docker.io/coredns:1.6.5

这将使用Kubernetes的最新稳定版本。我们还可以指定要使用的Kubernetes版本,例如稳定,最新

$sudo kubeadm config images list --kubernetes-version latest

使用kubeadm命令提取容器图像

如果Kubernetes机器可以访问Internet来提取容器镜像,则可以使用kubeadm命令预拉所需的镜像:

------- Pull from default registry: k8s.gcr.io ------
$sudo kubeadm config images pull

------- Pull from a different registry, e.g docker.io or internal ------
$sudo kubeadm config images pull --image-repository docker.io

对于docker,我们可能需要登录才能拉取图像:

$sudo docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: jmutai
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

请注意,如果更改容器存储库,则在运行init时需要执行相同的操作。

$sudo kubeadm init --image-repository <registry> <options>

使用docker/podman命令提取容器镜像

对于无法访问Internet的Kubernetes节点,我们需要从本地计算机下载图像并将其上传到Kubernetes节点。列出要在kubeadm的计算机上使用的图像

sudo kubeadm config images list

在本地下载图像

for image in k8s.gcr.io/kube-apiserver:v1.17.0 \
  k8s.gcr.io/kube-controller-manager:v1.17.0 \
  k8s.gcr.io/kube-scheduler:v1.17.0 \
  k8s.gcr.io/kube-proxy:v1.17.0 \
  k8s.gcr.io/pause:3.1 \
  k8s.gcr.io/etcd:3.4.3-0 \
  k8s.gcr.io/coredns:1.6.5; do
sudo docker pull $image;
done

如果使用podman:

for image in k8s.gcr.io/kube-apiserver:v1.17.0 \
  k8s.gcr.io/kube-controller-manager:v1.17.0 \
  k8s.gcr.io/kube-scheduler:v1.17.0 \
  k8s.gcr.io/kube-proxy:v1.17.0 \
  k8s.gcr.io/pause:3.1 \
  k8s.gcr.io/etcd:3.4.3-0 \
  k8s.gcr.io/coredns:1.6.5; do
sudo docker pull $image;
done

将图像另存为.tar文件

# Example
mkdir ~/k8s-images
docker save k8s.gcr.io/kube-apiserver:v1.17.0 > ~/k8s-images/kube-apiserver.tar
# Do the same for all other images

将保存的图像上传到Kubernetes节点

rsync -av ~/k8s-images/* k8s-node:~/k8s-images/

将.tar镜像文件导入Docker。

cd k8s-images/
ls * | while read image; do sudo docker load < $image; done

这是示例负载输出。

# ls * | while read image; do docker load < $image; done
225df95e717c: Loading layer [==================================================>]  336.4kB/336.4kB
7c9b0f448297: Loading layer [==================================================>]  41.37MB/41.37MB
Loaded image: k8s.gcr.io/coredns:1.6.5
fe9a8b4f1dcc: Loading layer [==================================================>]  43.87MB/43.87MB
ce04b89b7def: Loading layer [==================================================>]  224.9MB/224.9MB
1b2bc745b46f: Loading layer [==================================================>]  21.22MB/21.22MB
Loaded image: k8s.gcr.io/etcd:3.4.3-0
fc4976bd934b: Loading layer [==================================================>]  53.88MB/53.88MB
f103db1d7ea4: Loading layer [==================================================>]  118.6MB/118.6MB
Loaded image: k8s.gcr.io/kube-apiserver:v1.17.0
01b437934b9d: Loading layer [==================================================>]  108.5MB/108.5MB
Loaded image: k8s.gcr.io/kube-controller-manager:v1.17.0
ac06623e44c6: Loading layer [==================================================>]   42.1MB/42.1MB
Loaded image: k8s.gcr.io/kube-scheduler:v1.17.0
682fbb19de80: Loading layer [==================================================>]  21.06MB/21.06MB
2dc2f2423ad1: Loading layer [==================================================>]  5.168MB/5.168MB
ad9fb2411669: Loading layer [==================================================>]  4.608kB/4.608kB
597151d24476: Loading layer [==================================================>]  8.192kB/8.192kB
0d8d54147a3a: Loading layer [==================================================>]  8.704kB/8.704kB
6bc5ae70fa9e: Loading layer [==================================================>]  37.81MB/37.81MB
Loaded image: k8s.gcr.io/kube-proxy:v1.17.0
e17133b79956: Loading layer [==================================================>]  744.4kB/744.4kB
Loaded image: k8s.gcr.io/pause:3.1

确认镜像已导入:

# docker images
REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
k8s.gcr.io/kube-proxy                v1.17.0             7d54289267dc        4 weeks ago         116MB
k8s.gcr.io/kube-apiserver            v1.17.0             0cae8d5cc64c        4 weeks ago         171MB
k8s.gcr.io/kube-controller-manager   v1.17.0             5eb3b7486872        4 weeks ago         161MB
k8s.gcr.io/kube-scheduler            v1.17.0             78c190f736b1        4 weeks ago         94.4MB
k8s.gcr.io/coredns                   1.6.5               70f311871ae1        2 months ago        41.6MB
k8s.gcr.io/etcd                      3.4.3-0             303ce5db0e90        2 months ago        288MB
k8s.gcr.io/pause                     3.1                 da86e6ba6ca1        2 years ago         742kB

然后,我们可以使用本地添加的镜像继续安装Kubernetes。根据我们使用的CNI,如果进行脱机安装,则可能还需要提前拉出其镜像。