「REGISTRY-MIRROR」- 模块交互原理

提高镜像拉取速度

在 Docker 中,通过配置 Docker Daemon 的镜像源地址,可以使用 Registry Mirror 来代替 Docker Hub 进行镜像的拉取操作。

问题描述

我们的应用场景如下所述:
1)User 需要将 Kubernetes 使用的镜像拉取并同步到 Harbor (Private) 中;
2)我们的 CI 也会将构建的镜像保存到 Harbor (Private) 中,以供集群使用;
3)然后,Kubernetes 从 Harbor (Private) 拉取其使用的镜像(极少直接从公开仓库中拉取镜像);

问题在于 Cloud ⇒ LAN 的带宽,其为直接的制约因素,带宽制约我们镜像的拉取速度;

解决方案

所以,在 LAN 中,我们部署 Registry Mirror 服务,来提高镜像拉取速度。

我们的使用方式如下:

1)Registry Mirror 没有直接配置在 containerd 中,所以集群拉取镜像并不会通过 Registry Mirror 来缓存;

2)针对业务镜像(指应用程序使用的镜像),Kubernetes 直接访问 Harbor (Private) 进行拉取。原因在于:

很多镜像是私有的,需要帐号信息才能拉取。如果通过 Registry Mirror 拉取并缓存,则需要在 Registry Mirror 中配置相关凭着。以此带来的另个问题是,Kubernetes 拉取镜像时就不需要配置密码,这会导致不一致的使用体验。

另外,业务镜像是经常变动(更新)的,所以使用 Registry Mirror 镜像缓存的意义不大。

3)针对基础镜像(指集群组件使用的镜像),显式使用 Registry Mirror 来拉取;

国外镜像缓存策略

方案一、路径压缩

我们使用个人版来存储镜像:

  • 新建命名空间,新建镜像仓库,所有镜像以 Tag 的方式保存到仓库中。
  • 针对未查询到的镜像,我们不妨一试,例如 registry.cn-hangzhou.aliyuncs.com/rancher/shell:v0.3.1

限制:

  • 部分镜像仓库存在最大 Tag 数量限制;

方案二、路径扁平

registry.k8s.io/external-dns/external-dns:v0.16.1 ⇒ ccr.ccs.tencentyun.com/d3rm-3rd/registry.k8s.io_external-dns_external-dns:v0.16.1

限制:

  • 镜像仓库默认私有,需要针对多个仓库分别设置公开;