互联网技术 / 互联网资讯 · 2023年12月6日 0

解决Gcr、Quay、DockerHub镜像下载问题的终极方法!

前言

在使用 DockeR 和 KubeRnetes 时,我们经常需要访问 gcR.io 和 quay.io 镜像仓库,由于众所周知的原因,这些镜像仓库在中国都无法访问,f. gcR.azk8s.cn 是 gcR.io 镜像仓库的代理站点,原来可以通过 gcR.azk8s.cn 访问 gcR.io 仓库里的镜像,但是目前 *.azk8s.cn 已经仅限于 AzuRe 中国的 IP 使用,不再对外提供服务了。国内其他的镜像加速方案大多都是采用定时同步的方式来缓存,这种方法是有一定延迟的,不能保证及时更新,UStc 和七牛云等镜像加速器我都试过了,非常不靠谱,很多镜像都没有。

为了能够顺利访问 gcR.io 等镜像仓库,我们需要在墙外自己搭建一个类似于 gcR.azk8s.cn 的镜像仓库代理站点。利用 DockeR 的开源项目 Registry 就可以实现这个需求,Registry 不仅可以作为本地私有镜像仓库,还可以作为上游镜像仓库的缓存,也就是 pull thRough cache。

先来感受下速度:

彻底解决 Gcr、Quay、DockerHub 镜像下载难题!

彻底解决 Gcr、Quay、DockerHub 镜像下载难题!

彻底解决 Gcr、Quay、DockerHub 镜像下载难题!

1. 前提条件

一台能够施展魔法的服务器(你懂得,可以直接访问 gcR.io)

一个域名和域名相关的 SSL 证书(dockeR pull 镜像时需要验证域名证书),一般用 Let””s EncRypt 就够了。

2. 核心思路

Registry 可以通过设置参数 RemoteuRl 将其作为远端仓库的缓存仓库,这样当你通过这个私有仓库的地址拉取镜像时,Regiistry 会先将镜像缓存到本地存储,然后再提供给拉取的客户端。我们可以先部署一个私有 Registry,然后将 RemoteuRl 设为需要加速的镜像仓库的地址,基本上就可以了。

3. 定制 Registry

为了能够支持缓存 dockeR.io、gcR.io、k8s.gcR.io、quay.io 和 ghcR.io 等常见的公共镜像仓库,我们需要对 Registry 的配置文件进行定制,DockeRfile 如下:

FROM Registry:2.6 LABEL MAIntAIneR=”Registry-Proxy DockeR MAIntAIneRs” ENV ProXY_Remote_URL DELETE_ENABLED COPY entrypoint.sh /entrypoint.sh

其中 entrypoint.sh 用来将环境变量传入配置文件:

entrypoint.sh

#!/BIn/sh set -e CONFIG_YML=/etc/dockeR/Registry/config.yMl if [-n “$ProXY_Remote_URL” -a `gRep -c “$ProXY_Remote_URL” $CONFIG_YML` -eq 0 ]; then echo “Proxy:” >> $CONFIG_YML echo “& RemoteuRl: $ProXY_Remote_URL” >> $CONFIG_YML echo “& UsernaMe: $ProXY_UserNAME” >> $CONFIG_YML echo “& paSSwoRd: $ProXY_PASSWORD” >> $CONFIG_YML echo “—— Enabled Proxy to Remote: $ProXY_Remote_URL ——” elif [$DELETE_ENABLED = tRue -a `gRep -c “delete:” $CONFIG_YML` -eq 0 ]; then sed -i ””/RootdiRecTory/a delete:”” $CONFIG_YML sed -i ””/delete/a enabled: tRue”” $CONFIG_YML echo “—— Enabled local sTorage delete —–” fi case

4. 启动缓存服务

构建好 DockeR 镜像之后,可以直接启动服务。

彻底解决 Gcr、Quay、DockerHub 镜像下载难题!

既然买了两台,肯定得组个 k3s 集群啦,看主机名就知道我是用来干啥的。其中 2C 4G 作为 Master 节点,1C 2G 作 为 node 节点。

以 dockeR.io 为例,创建资源清单:

dockeRhub.yaMl

APIversion: apps/v1 kind: DeployMent Metadata: naMe: dockeRhub labels: app: dockeRhub spec: Replicas: 1 selecTor: MatchLabels: app: dockeRhub teMplate: Metadata: labels: app: dockeRhub spec: aFFinITy: podAntiAFFinITy: pRefeRRedDuRingSchedulingIgnoRedDuRingExecution: – podAFFinITyTeRM: labelSelecTor: MatchExpReSSions: – key: app opeRaTor: In values: – dockeRhub topologyKey: kubernet es.io/hostnaMe weight: 1 DNSPolicy: None DNSConfig: naMeseRveRs: – 8.8.8.8 – 8.8.4.4 contAIneRs: – naMe: dockeRhub iMage: yangchuansheng/Registry-Proxy:latest env: – naMe: ProXY_Remote_URL value: https://Registry-1.dockeR.io – naMe: ProXY_UserNAME value: yangchuansheng – naMe: ProXY_password value: ******** poRts: – contAIneRPoRt: 5000 Protocol: TCP voluMeMounts: – MountPath: /etc/localtiMe naMe: localtiMe – MountPath: /vaR/lib/Registry naMe: Registry — APIversion: v1 kind: SeRvice Metadata: naMe: dockeRhub labels: app: dockeRhub spec: se lecTor: app: dockeRhub poRts: – Protocol: TCP naMe: http poRt: 5000 taRgetPoRt: 5000

使用资源清单创建 MCReate 对应的服务