如何配置registries.yaml以指向多个Harbor代理缓存注册表

49次阅读
没有评论

问题描述

已经配置了一个Harbor(带有SSL和FQDN:harbor.example.com)作为多个Docker注册表(docker.io、quay.io和k8s.gcr.io)的代理缓存。用户可以从可以访问Harbor网络的任何PC/VM上拉取任何镜像,例如:

# 从hub.docker.com拉取
docker pull harbor.example.com/dockerhub/library/ubuntu:20.04
# 从quay.com拉取
docker pull harbor.example.com/q/metallb/speaker:v0.12.1
# 从k8s.gcr.com拉取
docker pull harbor.example.com/g/ingress-nginx/controller:v1.1.2@sha256:28b11ce69e57843de44e3db6413e98d09de0f6688e33d4bd384002a44f78405c

用户希望在本地的k3s集群(离线安装)中使用这个Harbor,并且唯一的拉取镜像的方式是使用之前提到的Harbor注册表(因为它无法访问互联网),例如:

k3s crictl pull ubuntu:20.04
k3s crictl pull quay.io/metallb/controller:v0.12.1
k3s crictl pull k8s.gcr.io/ingress-nginx/controller:v1.1.2@sha256:28b11ce69e57843de44e3db6413e98d09de0f6688e33d4bd384002a44f78405c

为了实现这个目标,用户尝试修改/etc/rancher/k3s/registries.yaml文件,将链接重写为harbor.example.com/dockerhub(从docker.io到harbor.example.com/dockerhub),或者从quay.ioharbor.example.com/q,或者从k8s.grc.ioharbor.example.com/g,但是用户无法找到正确的方法来实现…用户猜测应该是类似以下的配置(但是对于每个Harbor的缓存代理):

mirrors:
  quay.io:
    endpoint:
      - "https://harbor.virtalus.com"
    rewrite:
      "\/(.*)": "q/$1"

所以问题是:如何正确配置containerd的registries.yaml以指向多个Harbor的代理缓存?

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

要在registries.yaml中配置多个Harbor的代理缓存,可以使用以下步骤:

  1. 打开/etc/rancher/k3s/registries.yaml文件进行编辑。
  2. 在文件中添加以下内容:
mirrors:
  docker.io:
    endpoint:
      - "https://harbor.example.com/dockerhub"
  quay.io:
    endpoint:
      - "https://harbor.example.com/q"
  k8s.gcr.io:
    endpoint:
      - "https://harbor.example.com/g"
  1. 保存并关闭文件。

在上面的示例中,我们使用mirrors部分来配置每个注册表的代理缓存。每个注册表都有一个endpoint属性,指定了Harbor的URL。例如,docker.io的代理缓存是https://harbor.example.com/dockerhub

请注意,这只是一个示例,你需要根据你的实际情况修改URL和注册表名称。

方案2

如果你想为每个Harbor的代理缓存使用不同的URL重写规则,可以使用以下步骤:

  1. 打开/etc/rancher/k3s/registries.yaml文件进行编辑。
  2. 在文件中添加以下内容:
mirrors:
  docker.io:
    endpoint:
      - "https://harbor.example.com/dockerhub"
  quay.io:
    endpoint:
      - "https://harbor.example.com/q"
    rewrite:
      "\/(.*)": "q/$1"
  k8s.gcr.io:
    endpoint:
      - "https://harbor.example.com/g"
    rewrite:
      "\/(.*)": "g/$1"
  1. 保存并关闭文件。

在上面的示例中,我们为quay.iok8s.gcr.io注册表添加了rewrite属性,用于指定URL重写规则。例如,quay.io的URL重写规则是将/(.*)重写为q/$1

请注意,这只是一个示例,你需要根据你的实际情况修改URL和重写规则。

方案3

如果你想为每个Harbor的代理缓存使用不同的URL重写规则,并且希望使用正则表达式来匹配更复杂的URL,可以使用以下步骤:

  1. 打开/etc/rancher/k3s/registries.yaml文件进行编辑。
  2. 在文件中添加以下内容:
mirrors:
  docker.io:
    endpoint:
      - "https://harbor.example.com/dockerhub"
  quay.io:
    endpoint:
      - "https://harbor.example.com/q"
    rewrite:
      "/quay.io/(.*)": "q/$1"
  k8s.gcr.io:
    endpoint:
      - "https://harbor.example.com/g"
    rewrite:
      "/k8s.gcr.io/(.*)": "g/$1"
  1. 保存并关闭文件。

在上面的示例中,我们为quay.iok8s.gcr.io注册表添加了更复杂的URL重写规则。例如,quay.io的URL重写规则是将/quay.io/(.*)重写为q/$1

请注意,这只是一个示例,你需要根据你的实际情况修改URL和重写规则。

总结

要在registries.yaml中配置多个Harbor的代理缓存,你可以使用mirrors部分来指定每个注册表的URL。如果需要,你还可以使用rewrite属性来指定URL重写规则。根据你的需求,选择适合你的方案,并根据实际情况修改URL和重写规则。

希望这些解决方案对你有帮助!如果你有任何其他问题,请随时提问。

正文完