暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

使用image-syncer迁移同步容器镜像

运维笔谈 2025-02-06
365

 image-syncer
 是一个容器镜像同步工具,可用来进行多对多的镜像仓库同步,支持目前绝大多数主流的 docker 镜像仓库服务 


01

镜像仓库迁移或同步需求


企业容器化是需要一个容器镜像仓库的,不管是自建还是使用云镜像仓库服务,镜像仓库之间的同步是一个避免不了的需求,Harbor的复制服务可以从远端仓库复制过来或者推送到远端仓库,如下图:



但是非Harbor的镜像仓库,只是少部分我们还可以先tag,然后使用docker pull或者push的方式,大批量的镜像复制怎么处理呢?这个时候我们可以使用image-syncer。


02


image-syncer简介


    Github地址:
    https://github.com/AliyunContainerService/image-syncer

    image-syncer 是一个容器镜像同步工具,可用来进行多对多的镜像仓库同步,支持目前绝大多数主流的 docker 镜像仓库服务。


    • 支持多对多镜像仓库同步

    • 支持基于 Docker Registry V2 搭建的镜像仓库服务 (如 Docker Hub、 Quay、 阿里云镜像服务 ACR、 Harbor 等)

    • 同步过程只经过内存和网络,不依赖磁盘存储,同步速度快

    • 自动增量同步, 自动忽略已同步且不需要修改的镜像

    • 支持镜像层级别的并发同步,可以通过配置文件调整并发数(可以理解为同一时间在同步的镜像层数量上限)

    • 自动重试失败的同步任务,可以解决大部分镜像同步中的偶发问题(限流、网络抖动),支持重试次数配置

    • 简单轻量,不依赖 docker 以及其他程序


    03

    image-syncer部署安装


    1、编译安装

      go get github.com/AliyunContainerService/image-syncer
      cd $GOPATH/github.com/AliyunContainerService/image-syncer
      make

      2、直接使用编译好的release

        #v1.3.1版本为例
        wget https://github.com/AliyunContainerService/image-syncer/releases/download/v1.3.1/image-syncer-v1.3.1-linux-amd64.tar.gz
        tar -zvxf image-syncer-v1.3.1-linux-amd64.tar.gz

        3、image-syncer 命令行参数解释:

          -h  --help       使用说明,会打印出一些启动参数的当前默认值


              --config     设置用户提供的配置文件路径,使用之前需要创建此文件,
                           默认为当前工作目录下的config.json文件。
                           这个参数与 --auth--images 的作用相同,
                           分解成两个参数可以更好地区分认证信息与镜像仓库同步规则。建议使用 --auth 和 --images.


              --auth       设置用户提供的认证文件所在路径,使用之前需要创建此认证文件,
                           默认为当前工作目录下的auth.json文件


              --images     设置用户提供的镜像同步规则文件所在路径,使用之前需要创建此文件,
                           默认为当前工作目录下的images.json文件


              --log        打印出来的log文件路径,默认打印到标准错误输出,如果将日志打印到文件将不会有命令行输出,此时需要通过cat对应的日志文件查看


              --proc       并发数,进行镜像同步的并发goroutine数量,默认为5


              --retries    失败同步任务的重试次数,默认为2,重试会在所有任务都被执行一遍之后开始,并且也会重新尝试对应次数生成失败任务的生成。一些偶尔出现的网络错误比如io timeout、TLS handshake timeout,都可以通过设置重试次数来减少失败的任务数量


              --os         用来过滤源 tag 的 os 列表,为空则没有任何过滤要求,只对非 docker v2 schema1 media 类型的镜像格式有效


              --arch       用来过滤源 tag 的 architecture 列表,为空则没有任何过滤要求


              --force      同步已经存在的、被忽略的镜像,这个操作会更新已存在镜像的时间戳


          04

          image-syncer配置文件和使用
          image-syncer 支持通过 --auth 参数以文件的形式传入认证信息,同时通过 --images 参数以文件的形式传入镜像同步规则。配置文件同时支持 YAML 和 JSON ,其中auth认证信息是可选的,镜像同步规则是必须的。
          1、auth.yam认证信息配置参考:
            quay.io: #支持 "registry" 和 "registry/namespace"(v1.0.3之后的版本) 的形式,image-syncer 会自动为镜像同步规则中的每个源/目标 url 查找认证信息,并且使用对应认证信息进行进行访问,如果匹配到了多个,用“最长匹配”的那个作为最终结果
              username: xxx
              password: xxxxxxxxx
              insecure: true # 可选,(v1.0.1 之后支持)registry是否是http服务,如果是,insecure 字段需要为 true,默认是 false
            registry.cn-beijing.aliyuncs.com:
              username: xxx # 可选,(v1.3.1 之后支持)value 使用 "${env}" 或者 "$env" 形式可以引用环境变量
              password: xxxxxxxxx # 可选,(v1.3.1 之后支持)value 使用 "${env}" 或者 "$env" 类型的字符串可以引用环境变量
            docker.io:
              username: "${env}"
              password: "$env"
            quay.io/coreos:
              username: abc
              password: xxxxxxxxx
              insecure: true
            2、镜像同步规则文件 images.yaml配置参考:
              quay.io/coreos/kube-rbac-proxy: quay.io/ruohe/kube-rbac-proxy
              #华为云两个镜像服务地址之间同步
              swr.cn-north-4.myhuaweicloud.com/org-ss/canary-consumer: swr.cn-east-3.myhuaweicloud.com/dev-container/canary-consumer
              quay.io/coreos/kube-rbac-proxy:v1.1:
                - quay.io/ruohe/kube-rbac-proxy1
                - quay.io/ruohe/kube-rbac-proxy2
              左边是源仓库的地址,右边是目的仓库地址。
              3、同步规则说明:
                源镜像 url、目标镜像 url 都不能为空
                源镜像 url 不包含 tag 和 digest 时,代表同步源镜像 repository 中的所有镜像 tag
                源镜像 url 可以包含一个或多个 tag,多个 tag 之间用英文逗号分隔,代表同步源镜像 repository 中的多个指定镜像 tag
                源镜像 url 可以但最多只能包含一个 digest,此时如果目标镜像 url 包含 digest,digest 必须一致
                源镜像 url 的 "tag" 可以是一个正则表达式,需要额外在首尾加上 
                / 字符作为标识,源镜像 repository 中所有匹配正则表达式的镜像 tag 会被同步,不支持多个正则表达式
                目标镜像 url 可以不包含 tag 和 digest,表示所有需同步的镜像保持其镜像 tag 或者 digest 不变
                目标镜像 url 可以包含多个 tag 或者 digest,数量必须与源镜像 url 中的 tag 数量相同,此时,同步后的镜像 tag 会被修改成目标镜像 url 中指定的镜像 tag(按照从左到右顺序对应)
                支持同时指定多个目标镜像 url,此时 "目标镜像 url" 为数组的形式,数组的每个元素(字符串)都需要满足前面的规则
                4、image-syncer同步命令示例参考:
                  #1
                  ./image-syncer --proc=6 --auth=./auth.json --images=./images.json --auth=./auth.json --retries=3
                  #2
                  ./image-syncer --auth=./auth.json --images=./images.json --namespace=dev-container --registry=swr.cn-east-3.myhuaweicloud.com --retries=3 --log=./log
                  参考文档:
                  https://github.com/AliyunContainerService/image-syncer/blob/master/README-zh_CN.md
                  https://support.huaweicloud.com/bestpractice-swr/swr_bestpractice_0015.html

                  运维笔谈已经开通AI智能对话功能,解答有关运维日常工作中遇到的问题以及经验分享,感兴趣的大佬来和我聊聊吧!对话 “阿里云k8s” 可以获取《阿里云Kubernetes项目实战手册》.pdf

                  文章转载自运维笔谈,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                  评论