文档首页 > > 用户指南> 镜像管理> 同步Harbor镜像

同步Harbor镜像

分享
更新时间: 2019/10/22 GMT+08:00

Harbor是集镜像存储、镜像签名和镜像安全漏洞扫描于一体的云原生开源仓库,具体请参见官方网站https://goharbor.io/

本章节介绍如何将Harbor中的镜像同步到华为云容器镜像服务的镜像仓库中。

配置及运行swr-harbor_sync_tool

  1. 登录用户主机,该主机必须可访问Harbor仓库,执行以下命令下载Harbor同步镜像工具:

    docker pull swr.cn-north-1.myhuaweicloud.com/swr/swr_harbor_sync:v4.0

  2. 配置docker daemon。(配置文件目录通常为/lib/systemd/system/docker.service)

    1. 开启docker remote api,可以接受swr-harbor_sync_tool服务的请求,在配置文件的ExecStart选项中添加如下:
      -H=tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

      请确保前一个配置项末尾有 \ 符号,如下图所示:

    2. 请确认Harbor开启的是http还是https,如果Harbor开启的为http,或者开启的是https但未在docker主机上安装https证书,您需要在配置文件的ExecStart选项中添加如下:
      --insecure-registry=#harbor服务器的域名或IP#

      示例:

      --insecure-registry=10.10.10.10

      请确保前一个配置项末尾有 \ 符号,如下图所示:

      请确认/etc/docker/daemon.json文件中是否存在insecure-registries配置项。如果存在,需要确保/lib/systemd/system/docker.service的insecure-registry配置项中的ip和/etc/docker/daemon.json的insecure-registries配置项中的ip是完全一致的。

      /lib/systemd/system/docker.service中多个insecure-registry需要按下图格式配置:

    3. 重启docker服务,执行如下命令。
      systemctl daemon-reload
      systemctl restart docker

      若执行systemctl restart docker命令无法启动重启docker服务,可执行service docker restart命令,重启docker服务。

    4. 确认参数是否生效。
      1. 执行以下命令,查看docker进程。
        ps -ef|grep docker 
      2. 确认进程中是否含有如下参数。
        --insecure-registry=harobr服务器域名或ip -H=tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

        如下图所示:

        如果含有上述参数,则说明配置成功。

  3. 配置并运行swr-harbor_sync_tool。

    1. 新建配置文件,在任意文件目录下,新建文件名:app.conf,填写相应的配置变量,模板如下:
      ImageOverwrite=false
      NamespaceMap=harbor_project1:swr_namespace1;harbor_project2:swr_namespace2
      HWAuthMethod=AKSK
      HWAK=XXXXXXXXXXXXX
      HWSK=XXXXXXXXXXXXXXXXXXXXX
      HWDomain=sunXXXXXX
      HWUser=XXXXXX
      HWPassword=XXXXXXX
      RegionName=cn-north-1
      HarborUser=admin
      HarborPassword=******
      HarborAddr=mango.nat300.top
      HarborProtocol=https
      表1 参数说明

      参数名称

      参数解释

      ImageOverwrite

      自动同步时,如果该镜像名已经存在于镜像仓库,是否覆盖。

      默认为false,即同步的镜像名已存在镜像仓库时,将不会覆盖镜像仓库中已有镜像。

      NamespaceMap

      自动同步镜像所对应的harbor projectname与华为云SWR的组织名。

      配置格式:harbor porjectname:华为云SWR的组织名;若存在多组配置项,键值对之间用;分隔。

      例如:harbor_project1:swr_namespace1;harbor_project2:swr_namespace2

      HWAuthMethod

      可选AKSK、Password,只能选其一。如果是AKSK则使用HWAK、HWSK进行华为云鉴权;如果是Password,则使用HWDmain、HWUser、HWPassword进行华为云鉴权。

      HWAK

      华为云AK,获取AK的方法请参见获取AK/SK访问密钥

      HWSK

      华为云SK,获取SK的方法请参见获取AK/SK访问密钥

      HWDomain

      华为云账号名。

      HWUser

      HWUser为华为云IAM用户名,当IAM用户名为空时,默认使用账号权限进行操作。

      HWPassword

      华为云密码。

      RegionName

      华为云区域名,只能同步至以下的一个区域:

      • 华北-北京一(cn-north-1)
      • 华东-上海二(cn-east-2)
      • 华南-广州(cn-south-1)
      • 亚太-香港(ap-southeast-1)

      HarborUser

      Harbor账号名。

      HarborPassword

      Harbor密码。

      HarborAddr

      Harbor的域名或者IP。

      HarborProtocol

      Harbor服务器的协议,可配置为http或https。

    2. 在app.conf所在目录下,执行以下命令运行容器。
      docker run -d --privileged=true -v /var:/var -p #用户指定的swr-harbor_sync_tool服务暴露的主机端口#:5000 --env-file=#前文配置文件的路径# --restart=always #刚刚下载的镜像名#:#刚刚下载的镜像tag#

      示例:

      docker run -d --privileged=true -v /var/log:/var/log -p 19876:5000 --env-file=app.conf --restart=always swr.cn-north-1.myhuaweicloud.com/swr/swr_harbor_sync:v4.0

      请确保Harbor服务为启动状态;若未启动,在Harbor安装目录中,使用./install.sh命令启动Harbor。

      运行容器时,容器运行日志存储在 /var/log/swr_harbor_sync 路径下,其中running.log为服务运行日志,projectname-running.log为记录对应projectname的harbor项目同步情况的日志,projectname-success.log记录对应projectname的harbor项目同步成功的日志。

      如果app.conf中的配置信息有误,请修改配置文件,并停止刚刚启动的容器后,重新运行一个新容器。

  4. 配置Harbor服务。

    1. 在harbor/common/templates/registry/config.yml中的notifications的endpoints下,新增一个endpoint,格式如下:
        - name: swr-harbor_sync_tool
          disabled: false
          url: http://10.10.10.10:19876/service/notifications
          timeout: 3000ms
          threshold: 5
          backoff: 1s

      请将10.10.10.10:19876更换为部署swr-harbor_sync_tool服务所在的主机ip(请勿使用127.0.0.1作为IP,请使用宿主机IP或域名)以及服务在主机实际暴露的端口。

      请确保新增配置格式正确,即和默认的endpoint格式完全一致对齐(行前空格的差异会导致harbor无法正常重新启动),如下图所示:

    2. 重新启动Harbor服务。

      在Harbor安装目录中,使用./install.sh命令启动Harbor。请确认Harbor服务启动后是否正常运行:使用docker ps指令确认所有的Harbor容器都是up状态。

      Harbor服务启动成功后,后续会自动将push到Harbor仓库的镜像同步到华为云仓库内。

使用swr-harbor_sync_tool

  1. swr-harbor_sync_tool运行后,会自动将push到Harbor仓库的镜像同步到华为云仓库内。
    • 自动同步的过程:
      1. 当用户通过docker push将镜像推送到Harbor服务器时,Harbor服务器的notifications功能(即前面配置Harbor服务的endpoints)会自动发送请求到swr-harbor_sync_tool服务,请求中会包含本次push的镜像名和tag以及projectname。
      2. swr-harbor_sync_tool服务接到notifications之后,查询swr-harbor_sync_tool服务的配置文件(即前面配置本服务的app.conf)中的NamespaceMap。
        • 如果用户push的目标harbor projectname在配置文件中存在,且有对应的正确的华为云SWR组织名,执行1.c
        • 如果用户push的目标harbor projectname在配置文件中不存在,则不同步。
      3. swr-harbor_sync_tool服务会根据请求中的镜像名和tag,将该镜像从Harbor中pull下来,然后将pull下来的镜像打上对应的华为云镜像tag,再push到配置文件(即前面配置本服务的app.conf)中所配置的华为云账号以及配置的Region区域所对应的华为云的namespace上。
      4. 最后,将pull下来的镜像以及tag的镜像都删除。
    • 同步后,该镜像在华为云上的镜像名和tag与Harbor上的是一致的。若出现不一致,可能有以下问题:
      1. 未在配置文件中配置需要自动同步的harbor projectname及华为云SWR组织名。
      2. 华为云SWR组织名已经被别的华为云用户使用。您需要修改配置文件中的NamespaceMap参数。

      如未成功同步,请到/var/log/swr_harbor_sync目录下的日志文件中查看失败原因。

  2. 手动将Harbor中指定的project内的所有镜像同步到华为云中指定的namespace内。
    • 接口如下(curl指令形式):
      curl -X POST -H 'Projectname:##harbor项目名##' -H 'Namespace:##华为云SWR组织名##' -H 'HarborUser:##harbor用户名##' -H 'HarborPassword:##harbor密码##' -H 'HWAuthMethod:##华为云认证方式##' -H 'HWAK:##华为云AK##' -H 'HWSK:##华为云SK##' -H 'HWDomain:##华为云账号名##' -H 'HWUser:#华为云账号名#' -H 'HWPassword:##华为云账号密码##' -H 'RegionName:##华为云区域名##' -H 'ImageOverwrite:##重名镜像是否覆盖,可选true或者false##' http://##部署swr-harbor_sync_tool主机的IP##:##部署swr-harbor_sync_tool的PORT##/service/synchronization/namespace
    • 示例:
      curl -X POST -H 'Projectname:harbor_project_name' -H 'Namespace:huaweicloud_namespace_name' -H 'HarborUser:harbor_user' -H 'HarborPassword:harbor_password' -H 'HWAuthMethod:huawei_auth_method' -H 'HWAK:huawei_ak' -H 'HWSK:huawei_sk' -H 'HWDomain:huaweicloud_domain_name' -H 'HWUser:huaweicloud_user_name' -H 'HWPassword:huaweicloud_password' -H 'RegionName:cn-north-1' -H 'ImageOverwrite:false' http://127.0.0.1:19876/service/synchronization/namespace
      1. swr-harbor_sync_tool服务收到请求后,会确认Harbor项目是否为公有项目。
        • 如果为公有项目,则不对Harbor账号密码鉴权。
        • 如果是私有项目,则对Harbor账号密码(harbor_user:harbor_password)鉴权。
      2. 如果HWAuthMethod为AKSK,则获取HWAK、HWSK进行权限认证;如果HWAuthMethod为Password,则判断如果HWUser为空,则对华为云账号及账号密码(abcXXX:xyzXXX)鉴权;如果HWUser非空,则对华为云账号、用户及用户密码(abcXXX:bbbXXX:xyzXXX)鉴权;并确认RegionName和Namespace是否可用。

        当这些都确认正确后,swr-harbor_sync_tool服务会将Harbor中library这个project内的所有镜像,全部同步到华为云该账号下的(cn-north-1)区域的镜像仓库内的namespace(domain_library)中,且由于ImageOverwrite设置为false,则不会覆盖原有的同名镜像。

        因为请求用例是在部署了swr-harbor_sync_tool的主机上运行的,因此请求的ip为127.0.0.1。

常见异常

  1. harbor Projectname填写错误。
  2. 华为云SWR组织名已经被别的华为云用户使用。自动同步镜像时,您需要修改配置文件中的NamespaceMap参数。手动同步镜像时,你需要重新指定Namespace参数的值。
  3. 华为账号名/用户名/密码填写错误。
  4. 华为区域名填写错误。
  5. Harbor账号密码错误。
  6. 运行工具的主机无法访问Harbor或者swr,网络不通。

如未成功同步,请在/var/log/swr_harbor_sync目录下的对应projectname的projectname-running.log日志文件中查看失败原因。如未发现错误信息,请确认配置及运行的步骤1和3是否正确配置。

分享:

    相关文档

    相关产品

文档是否有解决您的问题?

提交成功!

非常感谢您的反馈,我们会继续努力做到更好!

反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨

跳转到云社区