互联网技术 / 互联网资讯 · 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 对应的服务