配置镜像代理缓存
Harbor 提供的代理缓存功能可以使用 Harbor 来代理和缓存来自公共或私有仓库的镜像。
在互联网访问受限或无法访问的环境中,可以使用代理缓存从 Harbor 或非 Harbor 仓库中拉取镜像;还可以使用代理缓存来限制对公共仓库发出的请求数量,避免消耗过多带宽或被仓库服务器限制。
说明:
从 Harbor v2.1.1 开始,代理缓存功能已更新,以与 Docker Hub 的速率限制策略保持一致。如果要做Harbor 中使用代理缓存,建议您使用 v2.1.1 或更高版,以免避免受到速率限制。
Harbor 系统管理员通过创建一个代理缓存项目来配置代理缓存,该项目使用您已配置的注册表端点(新建目标)连接到目标注册表(目标registry)。代理缓存项目的工作方式类似于普通的 Harbor 项目,只是您不能将镜像推送到代理缓存项目。
1. 工作原理
当有拉取请求到达代理缓存项目时,如果镜像未被缓存,Harbor 会从目标注册表(目标registry)拉取该镜像,然后就可以从代理缓存项目执行类似本地镜像的拉取命令。代理缓存项目随后会缓存该镜像,以供未来请求使用。
下次用户请求该镜像时,Harbor 会检查目标注册表中该镜像的最新清单,并根据以下场景提供镜像服务:
如果目标注册表中的镜像没有更新,则从代理缓存项目中提供缓存的镜像。
如果目标注册表中的镜像已更新,则从目标注册表拉取新镜像,然后在代理缓存项目中提供并缓存该镜像。
如果无法访问目标注册表,则从代理缓存项目中提供缓存的镜像。
如果目标注册表中不再有该镜像,则不提供任何镜像。
从 Harbor v2.1.1 开始,Harbor 代理缓存通过发送 HEAD 请求来确定缓存镜像的任何层是否在 Docker Hub 注册表中已更新。使用此方法检查目标注册表不会触发 Docker Hub 的速率限制器。如果任何镜像层已更新,代理缓存将拉取新镜像,这将计入 Docker Hub 的速率限制器。
2. 配置步骤
详细操作说明,请参见 Harbor 官方文档,以下为步骤要点。本文以harbor v2.11.0版本操作进行记录:
2.1 创建目标仓库
Harbor支持代理缓存如下的仓库:
- Harbor
- Docker Hub
- Docker registry
- AWS Elastic Container Registry
- Azure Container Registry
- Google Container Registry
- Quay
- Github Container Registry
- JFrog Artifactory Registry
本文以最知名的仓库Docker hub为例进行配置演示。登录 Harbor Web界面,进入仓库管理页面,点击新建目标,创建需要被代理和缓存的目标镜像仓库。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HplEtusv-1722248580686)(/zb_users/upload/2024/csdn/7d380bf71d4d40808d7bc66b47b2f74b.png#pic_center)]
这里提供者选择docker hub,访问id和密码填写注册的docker hub网站账号。
如果harbor所在机器能直接访问docker hub这样是最方便的,如果harbor本身也是通过代理上网的呢,这样就需要配置二级代理连接 Docker Hub。配置方法如下:
Harbor 使用 core
服务来管理所有的 API 请求,修改harbor-core
容器,在 spec.template.spec.containers
中添加环境变量:
[root@k8s ~]# kubectl get deploy -n harbor NAME READY UP-TO-DATE AVAILABLE AGE harbor-core 1/1 1 1 4d3h harbor-jobservice 1/1 1 1 4d3h harbor-portal 1/1 1 1 4d3h harbor-registry 1/1 1 1 4d3h [root@k8s ~]# kubectl edit deployment.apps/harbor-core -n harbor ... containers: - env: - name: HTTP_PROXY value: http://192.168.0.210:808 - name: HTTPS_PROXY value: http://192.168.0.210:808 - name: NO_PROXY value: 127.0.0.1,localhost,harbor-core,harbor-jobservice,harbor-databaase,harbor-portal,harbor-redis,harbor-registry,harbor-trivy ...
上述为harbor通过helm部署到k8s环境中的修改方式。
如果harbor是通过官方的安装方式部署,配置步骤如下:
编辑 Harbor 配置文件:
Harbor 的配置文件通常位于/your/path/to/harbor/harbor.yml
。添加 Proxy 配置:
在proxy
位置添加代理设置。
# Global proxy # Config http proxy for components, e.g. http://my.proxy.com:3128 # Components doesn't need to connect to each others via http proxy. # Remove component from `components` array if want disable proxy # for it. If you want use proxy for replication, MUST enable proxy # for core and jobservice, and set `http_proxy` and `https_proxy`. # Add domain to the `no_proxy` field, when you want disable proxy # for some special registry. proxy: http_proxy: https_proxy: no_proxy: components: - core - jobservice - trivy
- 在编辑完配置文件后,应用配置更改并重启 Harbor。
cd /your/path/to/harbor ./prepare
- 重启 Harbor
docker-compose down -v docker-compose up -d
2.2 创建代理缓存项目。
进入项目页面,点击新建项目,创建镜像代理项目,开启并选择镜像代理:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EH3o0Ei3-1722248580689)(/zb_users/upload/2024/csdn/515a70524b254446894d5f5a7daefc04.png#pic_center)]
说明:
请务必单击镜像代理后的滑块,开启镜像代理功能并选择需要被代理的目标镜像仓库。代理缓存项目能够使用与普通 Harbor 项目相同的功能,区别在于您不能将镜像推送到代理缓存项目。
代理缓存项目创建后,用户只要有该项目的访问权限便可通过代理缓存项目拉取镜像。
2.3 使用代理缓存
使用代理缓存时需在 docker pull 或 Pod 镜像配置中将 <harbor_servername>/<proxy_project_name>/
作为前缀添加到镜像标签以引用代理缓存项目,例如:
docker pull <harbor_server_name>/<proxy_project_name>/goharbor/harbor-core:dev
当前harbor中创建的proxy项目中镜像仓库是空的,测试拉取镜像:
# 拉取goharbor的harbor-core镜像 docker pull harbor.abc.com/proxy/goharbor/harbor-core:dev # 拉取hello-world镜像 root@master1:~# docker pull harbor.abc.com/proxy/library/hello-world:latest WARN[0000] skipping verifying HTTPS certs for "harbor.abc.com" harbor.abc.com/proxy/library/hello-world:latest: resolved |++++++++++++++++++++++++++++++++++++++| index-sha256:1408fec50309afee38f3535383f5b09419e6dc0925bc69891e79d84cc4cdcec6: done |++++++++++++++++++++++++++++++++++++++| manifest-sha256:e2fc4e5012d16e7fe466f5291c476431beaa1f9b90a5c2125b493ed28e2aba57: done |++++++++++++++++++++++++++++++++++++++| config-sha256:d2c94e258dcb3c5ac2798d32e1249e42ef01cba4841c2234249495f87264ac5a: done |++++++++++++++++++++++++++++++++++++++| layer-sha256:c1ec31eb59444d78df06a974d155e597c894ab4cda84f08294145e845394988e: done |++++++++++++++++++++++++++++++++++++++| elapsed: 14.9s total: 12.5 K (860.0 B/s) # 拉取nginx镜像 root@master1:~# docker pull harbor.abc.com/proxy/nginx:1.27 root@master1:~# docker pull harbor.abc.com/proxy/library/nginx:1.26 # 拉取registry镜像 root@master1:~# docker pull harbor.abc.com/proxy/registry:latest
客户端都拉取成功后,查看proxy项目-镜像仓库,可以看到镜像在这里都进行了代理缓存:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q8d7DZFM-1722248580690)(/zb_users/upload/2024/csdn/9dee4799fb13487584e2371877666341.png#pic_center)]
说明:
library
是 Docker Hub 上官方镜像的默认项目名称前缀,拉取镜像时如果镜像在docker hub的library
下,前缀可以省略。- 本地客户端拉取镜像成功后,镜像代理项目中镜像仓库显示镜像列表会有一定的延迟。
至此,harbor就完成了代理镜像缓存的配置。
3. 相关资料
https://goharbor.io/docs/2.11.0/administration/configure-proxy-cache/