Sep 152021
 

其实在我经历过的环境,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"]

这个时候,你如果需要下载镜像。

ctr image pull docker.io/calico/node:v3.11.2

什么都不需要修改,直接搞定。

 Leave a Reply

(required)

(required)

This site uses Akismet to reduce spam. Learn how your comment data is processed.