其实在我经历过的环境,k8s安装,最大的问题都是在镜像的下载,怎么解决这个问题,都是老生常谈的问题。
- docker hub
- quay.io
- k8s.gcr.io
基本就是涉及这3个仓库。解决的办法,其实就是做香港搞一台虚拟机,装上nexus,搞定。自己搭建,自己使用,稳定性就好很多。
Docker mirror
大家用docker久了,其实都会去设置docker的mirrors。目前国内好几个厂商提供的mirrors都还是比较好用,尤其是阿里云的。
我和大家一样,天真的认为,我设置quay,gcr的mirror,不就可以了嘛。docker本身的限制,只能设置docker hub的mirror。不能设置别的hub的mirror。这个其实在国外也很多人问过这样的问题。
国内厂商提供的mirror,例如quay的。
docker pull quay.io/prometheus/node-exporter:v0.18.1
# 替换成如下格式
docker pull quay-mirror.qiniu.com/prometheus/node-exporter:v0.18.1
Nexus proxy and group
Nexus,可以提供各个hub的proxy的功能,并且还能把这些hub,通过group的功能,统一用一个端口发布出来。
docker pull k8s.gcr.io/kube-proxy:v1.20.8
这个时候,你就需要改成
docker pull hub.chenshake.site/kube-proxy:v1.20.8
这样你去nexus搭建的仓库下载,如果没有,他会自动去上游下载。这个nexus做的还是非常智能。如果你下载quay的镜像
docker pull quay.io/coreos/flannel:v0.14.0
你只需要改成
docker pull hub.chenshake.site/coreos/flannel:v0.14.0
简单理解,就是nexus多做了一步,等于把所有的hub的镜像,都做了一个类似索引,帮你下载。如果有相同的名字,是有可能下载错误,或者下载的不是你需要的镜像。
docker pull hub.chenshake.site/nginx
结果你看一下镜像

所以你可以做docker 配置mirror , 其他仓库,就是 hub.chenshake.site/*****
这样很大程度避免了这个问题。如果你决定构建自己的私有仓库,这个方案,就可以满足,但是需要你改变所有的镜像的地址,这也是一个很繁琐的事情。
Containerd 完美方案
现在都去docker化,但是对我来说,不用docker的理由就是这个,不能分别给hub设置不同的mirror。那么Containerd是可以完美的支持。
nexus的配置调整一下,dockerhub,gcr,quay的,proxy 模式,不使用group访问通过不同的端口来区分
你做contained 配置 /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".registry]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://hub.chenshake.site:8181"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
endpoint = ["https://hub.chenshake.site:8182"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."gcr.io"]
endpoint = ["https://hub.chenshake.site:8183"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."ghcr.io"]
endpoint = ["https://hub.chenshake.site:8184"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."quay.io"]
endpoint = ["https://hub.chenshake.site:8185"]
这个时候,你如果需要下载镜像。
crictl pull k8s.gcr.io/kube-apiserver:v1.20.8
什么都不需要修改,直接搞定。对于contained来说一定要注意
crictl 是使用contained的配置文件下载,你在配置文件里设置的mirror,是生效的。
如果你使用ctr,或者 nerdctl,去pull镜像,都是直接下载,无法设置mirror,也不会使用contained下的mirror设置。