目录

Harbor系列-08-代理同步

概述

目前随着 Kubernetes 在各个企业的流行,用 Helm Chart 把 Harbor 部署到 Kubernetes 集群上已经变成非常稳定和常规的做法了,但是如果需要同步其他公网仓库的镜像的话,这样就会有网络的问题,这是因为在做镜像同步的两个重要组件,harbor-core 和 harbor-jobservice 都只有容器集群网络,而无法直接访问到公网,因此如果有同步公网镜像的需求的话,还需要一个代理。

Harbor代理的搭建

企业内部机房网络中,一般是不能够直接访问到公网的,尤其是外网,那么如果在 Kubernetes 集群中加入代理呢?有几种思路,一是直接找基础运维组或者负责网络设施的同学给一个公网代理的地址,这样就不需要自己手动搭建代理,二就是给一个机器是既能连接公网,又能连接到内网的,并且将其加入到 Kubernetes 集群中,加入节点之后,还需要部署一个代理软件,可以参考下面的命令。

1
2
3
# 前提是已经提前有这个镜像
kubectl -n kube-system run squid --image ubuntu/squid:4.13-21.10_edge
kubectl -n kube-system expose pod squid --port=3128 --target-port=3128

Dockerhub镜像同步

一般来说,在 Harbor 上进行镜像同步需要先设置同步目标,可以看到,默认情况下的测试连接是无法通过的,理由也如前面所说的,集群网络不能直通公网。

/harbor%E7%B3%BB%E5%88%97-08-%E4%BB%A3%E7%90%86%E5%90%8C%E6%AD%A5/img.png

上文已经搭建了一个网络代理了,为了实现可以在 Kubernetes 的容器版本 Harbor 可以同步到 Dockerhub 的镜像,可以通过下面的方式进行,修改 harbor-core 和 harbor-jobservice 的定义,加入代理的环境变量。

1
2
3
4
5
    spec:
      containers:
      - env:
        - name: HTTPS_PROXY
          value: http://squid.kube-system.svc.cluster.local:3128

上面的操作就如果下面的命令一样,这样在 Harbor UI 上配置目标仓库就可以成功,并且 harbor-jobservice 做镜像复制也会通过代理来完成。

1
2
3
export https_proxy=http://squid.kube-system.svc.cluster.local:3128  
# 帮助排除一些不需要代理的情况
export no_proxy=192.168.*.*,*.local,localhost,127.0.0.1

复制任务成功

/harbor%E7%B3%BB%E5%88%97-08-%E4%BB%A3%E7%90%86%E5%90%8C%E6%AD%A5/img_1.png

代理日志,可以清楚看到harbor-core通道代理来访问hub.docker.com

/harbor%E7%B3%BB%E5%88%97-08-%E4%BB%A3%E7%90%86%E5%90%8C%E6%AD%A5/img_2.png

参考资料

  1. Harbor权威指南
警告
本文最后更新于 2022年2月26日,文中内容可能已过时,请谨慎参考。