Harbor系列之8:配置镜像代理缓存

avatar
作者
筋斗云
阅读量:0

配置镜像代理缓存

Harbor 提供的代理缓存功能可以使用 Harbor 来代理和缓存来自公共或私有仓库的镜像。

在互联网访问受限或无法访问的环境中,可以使用代理缓存从 Harbor 或非 Harbor 仓库中拉取镜像;还可以使用代理缓存来限制对公共仓库发出的请求数量,避免消耗过多带宽或被仓库服务器限制。

说明:

从 Harbor v2.1.1 开始,代理缓存功能已更新,以与 Docker Hub 的速率限制策略保持一致。如果要做Harbor 中使用代理缓存,建议您使用 v2.1.1 或更高版,以免避免受到速率限制。

Harbor 系统管理员通过创建一个代理缓存项目来配置代理缓存,该项目使用您已配置的注册表端点(新建目标)连接到目标注册表(目标registry)。代理缓存项目的工作方式类似于普通的 Harbor 项目,只是您不能将镜像推送到代理缓存项目。

1. 工作原理

当有拉取请求到达代理缓存项目时,如果镜像未被缓存,Harbor 会从目标注册表(目标registry)拉取该镜像,然后就可以从代理缓存项目执行类似本地镜像的拉取命令。代理缓存项目随后会缓存该镜像,以供未来请求使用。

下次用户请求该镜像时,Harbor 会检查目标注册表中该镜像的最新清单,并根据以下场景提供镜像服务:

  1. 如果目标注册表中的镜像没有更新,则从代理缓存项目中提供缓存的镜像。

  2. 如果目标注册表中的镜像已更新,则从目标注册表拉取新镜像,然后在代理缓存项目中提供并缓存该镜像。

  3. 如果无法访问目标注册表,则从代理缓存项目中提供缓存的镜像。

  4. 如果目标注册表中不再有该镜像,则不提供任何镜像。

从 Harbor v2.1.1 开始,Harbor 代理缓存通过发送 HEAD 请求来确定缓存镜像的任何层是否在 Docker Hub 注册表中已更新。使用此方法检查目标注册表不会触发 Docker Hub 的速率限制器。如果任何镜像层已更新,代理缓存将拉取新镜像,这将计入 Docker Hub 的速率限制器。

2. 配置步骤

详细操作说明,请参见 Harbor 官方文档,以下为步骤要点。本文以harbor v2.11.0版本操作进行记录:

2.1 创建目标仓库

Harbor支持代理缓存如下的仓库:

  1. Harbor
  2. Docker Hub
  3. Docker registry
  4. AWS Elastic Container Registry
  5. Azure Container Registry
  6. Google Container Registry
  7. Quay
  8. Github Container Registry
  9. 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是通过官方的安装方式部署,配置步骤如下:

  1. 编辑 Harbor 配置文件
    Harbor 的配置文件通常位于 /your/path/to/harbor/harbor.yml

  2. 添加 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 
  1. 在编辑完配置文件后,应用配置更改并重启 Harbor。
cd /your/path/to/harbor ./prepare 
  1. 重启 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)]

说明:

  1. library 是 Docker Hub 上官方镜像的默认项目名称前缀,拉取镜像时如果镜像在docker hub的library下,前缀可以省略。
  2. 本地客户端拉取镜像成功后,镜像代理项目中镜像仓库显示镜像列表会有一定的延迟。

至此,harbor就完成了代理镜像缓存的配置。

3. 相关资料

https://goharbor.io/docs/2.11.0/administration/configure-proxy-cache/

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!