前言

在学习、研究 K8S 的过程中,经常遇到镜像拉取不了的网络问题,这并不是镜像本身的问题,而是国内的“国情”导致无法正常访问墙外资源。

这些镜像有的是 K8S 团队自研的插件,也有一些是爱好者开发的第三方组件,正常来说,他们会存放于 gcr.io 或者 quay.io 中。

gcr.io 是 谷歌的镜像仓库,是禁止访问的,而 quay.io 是 RedHat 的镜像仓库,可以访问,但速度较慢。

那如何应对这种网络问题呢?

现成的镜像代理仓库

k8s.gcr.io 源代理仓库

ctr images tag k8s.m.daocloud.io/scheduler-plugins/kube-scheduler:v0.24.9

这是 gcr.io/google-containers 的仓库,使用阿里云镜像

1
2
3
k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.3.0
# 换成
registry.aliyuncs.com/google_containers/csi-node-driver-registrar:v2.3.0

也可以使用 lank8s.cn,他们的对应关系 k8s.gcr.io –> lank8s.cn,gcr.io –> gcr.lank8s.cn

1
2
3
k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.3.0
# 换成
lank8s.cn/sig-storage/csi-node-driver-registrar:v2.3.0

quay.io 源代理仓库

这是Red Hat运营的镜像库,虽然没有被墙,但下载还是比较慢,可以使用中科大镜像

1
2
3
quay.io/kubevirt/virt-api:v0.45.0
# 换成
quay.mirrors.ustc.edu.cn/kubevirt/virt-api:v0.45.0

gcr.io和k8s.gcr.io 双源代理仓库

github地址 - anjia0532/gcr.io_mirror

该仓库提供在线镜像代理服务,只要你以固定格式创建issue,就会自动触发脚本去下载镜像,然后你再使用对应的仓库名去下载即可

1
2
3
4
5
6
# 原镜像名称
gcr.io/namespace/{image}:{tag}
# 等同于
anjia0532/namespace.{image}:{tag}
# 特殊的
k8s.gcr.io/{image}:{tag} <==> gcr.io/google-containers/{image}:{tag} <==> anjia0532/google-containers.{image}:{tag}

该仓库目前仅支持 gcr.io和k8s.gcr.io 镜像

支持多源的加速仓库

最近发现了个多源镜像加速的开源项目

github地址 - public-image-mirror

已支持的替换源镜像

mirror.txt

如果想要新增, 提 PR 修改即可。例如 PR#1, 并请在 PR 提交前排序: ./hack/fmt.sh mirror.txt

使用方法

增加前缀 (推荐方式)。比如:

1
k8s.gcr.io/coredns/coredns => m.daocloud.io/k8s.gcr.io/coredns/coredns

或者 支持的镜像仓库 的 前缀替换 就可以使用。比如:

1
k8s.gcr.io/coredns/coredns => k8s-gcr.m.daocloud.io/coredns/coredns

提前同步的 Registry

domain.txt

用于 github action 从源 registry 提前同步到 m.daocloud.io 下

如果想要新增, 提 PR 修改即可。例如 PR#28, 并请在 PR 提交前排序:./hack/fmt.sh domain.txt

支持前缀替换的 Registry

如有新增, 提 PR 修改下面的表格, 合并后由人工配置

源站替换为
cr.l5d.iol5d.m.daocloud.io
docker.elastic.coelastic.m.daocloud.io
docker.iodocker.m.daocloud.io
gcr.iogcr.m.daocloud.io
ghcr.ioghcr.m.daocloud.io
k8s.gcr.iok8s-gcr.m.daocloud.io
registry.k8s.iok8s.m.daocloud.io
mcr.microsoft.commcr.m.daocloud.io
nvcr.ionvcr.m.daocloud.io
quay.ioquay.m.daocloud.io
registry.jujucharms.comjujucharms.m.daocloud.io
rocks.canonical.comrocks-canonical.m.daocloud.io

ReTag(可选操作)

ctr为镜像打tag

1
ctr images tag oldimage:v1 newimage:v2

docker为镜像打tag

1
docker tag oldimage:v1 newimage:v2

使用自己的代理下载

若你自己有梯子,并且是 http 和 https 协议的(sock5 的不行),可以先在自己的电脑上使用 docker 中配置代理

1
2
3
4
5
6
7
8
9
10
11
{
"proxies":
{
"default":
{
"httpProxy": "http://127.0.0.1:1080",
"httpsProxy": "http://127.0.0.1:1080",
"noProxy": "*.test.example.com,.example2.com"
}
}
}

有了代理后,就可以访问外面的镜像,下载完成后,使用 docker save 打包成 tar 包,再把 tar 上传到服务器上,最后使用 docker load 导入到服务器的镜像仓库中。

1
2
3
4
# 导出
docker save <image_name>:<tag> -o /home/image.tar
# 导入
docker load < /home/image.tar

使用 docker playground 下载

docker playground 提供一个在线的 docker 运行环境,方便新手上去操作学习。

巧的是,docker playground 服务器也在墙外,因此拉取 gcr 的镜像非常快。

利用这个,可以用来拉取 gcr 的镜像,最后再 push 到我们的私人仓库(比如 docker hub,或者 harbor)

首先登陆 docker playground

没帐号的注册一个,进去后,新增一个实例

然后在终端上拉取镜像,打新 tag,然后再推送到私人仓库,速度都是非常快的。

完成后,在其他机器上,就可以直接拉取我们私人仓库的镜像

dockerhub.icu