当前位置: 首页 > 科技观察

阿里云开源容器镜像海量迁移同步工具image-syncer

时间:2023-03-19 19:46:17 科技观察

本文转载自雷锋网。如何将现有容器镜像平滑迁移到阿里云镜像服务ACR?最近,阿里云提供了一个很好的解决方案。他们开源了image-syncer工具,可以实现数百张图片的平滑批量迁移,最大的图片库总容量可达3T以上。而这个工具又被称为容器镜像迁移/同步工具。雷风网AI开发者将其重点内容及开源地址整理如下。什么是图像同步器?顾名思义,image-syncer本质上就是一个图像同步器。是一款docker镜像同步工具,可以同步多对多的镜像仓库,支持目前大部分主流的docker镜像仓库服务,例如:ACR、DockerHub、Quay、自建Harbor等。通常,在k8s集群迁移场景中,镜像仓库之间的镜像迁移/同步是一个基本需求,但是传统方式使用dockerpull/push结合脚本进行镜像同步有以下局限性:对磁盘存储的依赖,它需要及时清理本地镜像,磁盘会造成不必要的时间开销。生产场景中大量图片迁移难度大。有些功能只能通过HTTPapi来操作,单纯使用dockercli是做不到的,导致脚本复杂所以其特点如下:支持多对多镜像仓库同步支持基于docker搭建的镜像仓库服务DockerRegistryV2(如DockerHub、Quay、阿里云镜像服务ACR、Harbor等)同步只经过内存和网络,增量同步不依赖磁盘存储,同步速度快。通过将同步后的镜像blob信息放在磁盘上,同步后的镜像不会重复同步。可以通过配置文件调整并发数,自动重试失败的同步任务,可以解决问题。镜像同步中的网络抖动问题,大部分不依赖于docker等程序。只需保证image-syncer运行环境连接到需要同步的registry网络,用户即可快速完成从镜像仓库的迁移、复制、增量同步,该工具对硬件几乎没有要求资源(因为image-syncer严格控制网络连接数=并发数,所以只有当单个图像层过大时,并发数可能会占满内存,并且内存使用<=并发数x最大图像层大小).如何使用图像同步器?运行image-syncer只需要提供一个配置文件,内容如下:{"auth":{//authentication字段,其中每个对象是一个registry的账号和//密码;通常,同步源需要有pull和accesstags权限,//同步目标需要有push和建库权限。如果不提供,则默认匿名访问“quay.io”:{//registry的url需要与下图中对应registry的url相同"username":"xxx",//username,optional"password":"xxxxxxxxx",//password,optional"insecure":true//registry是一个http服务,如果是,insecure字段需要为true,默认为false,optional,image-syncer版本>v1.0.1需要支持此选项},"registry.cn-beijing.aliyuncs.com":{"username":"xxx","password":"xxxxxxxxx"},"registry.hub.docker.com":{"username":"xxx","password":"xxxxxxxxxx"}},"images":{//同步镜像规则字段,其中一个规则包括一个源仓库(key)和一个目标仓库(value)//同步的最大单位是仓库(repo),不支持通过一条规则同步整个namespace和registry//源仓库和目标仓库的格式类似于dockerpull使用的imageurl/推送命令(注册ry/namespace/repository:tag)//源仓库和目标仓库(如果目标仓库不是空字符串)至少包含registry/namespace/repository//源仓库字段不能为空,如果需要将一个源仓库同步到多个目标仓库需要配置多个规则//目标仓库的名字可以和源仓库的名字不同(tag也可以不同)。此时的同步功能类似于:dockerpull+dockertag+dockerpush"quay.io/coreos/kube-rbac-proxy":"quay.io/ruohe/kube-rbac-proxy","xxxx":"xxxxx","xxx/xxx/xx:tag1,tag2,tag3":"xxx/xxx/xx"//当源仓库字段不包含tag时,表示将仓库中的所有tag同步到目标仓库.此时目标仓库不能包含标签//当源仓库的字段包含标签时,表示源仓库只有一个标签同步到目标仓库。如果目标仓库中没有标签如果包含标签,则默认使用源标签。//源仓库字段中的标签可以同时包含多个标签(如“a/b/c:1,2,3"),标签之间用","隔开。此时目标仓库不能包含标签,默认使用原始标签//当目标仓库为空字符串时,源镜像会同步到默认注册中心的defaultnamespace,repo和tag为和源仓库一样,默认registry和defaultnamespace都可以通过命令行参数和环境变量进行配置,参考下面的说明}}用户可以配置不同的镜像同步规则组合来匹配不同的迁移/同步需求,比如如将单个镜像repo同步到多个不同的镜像repo,将多个源镜像同步到单个镜像repo(通过tag区分),在同一个registry中复制一个不同名称的mirrorrepo等。需要注意的是如果匿名访问作为同步源的registry地址,可能存在权限问题,无法拉取镜像,ta无法获得gs。在这种情况下,需要在“auth”中添加一个具有相应权限的账户密码;并且如果匿名访问注册表地址作为同步目标,可能会出现权限问题,无法推送镜像,也可能需要用户提供相应权限的账号密码。通常,自建harbor同步镜像到ACR需要5个步骤,包括:创建ACR实例创建命名空间创建权限管理的访问凭证并完成配置版本,可自行编译)并解压,然后运行该工具最新的源码和二进制文件:https://github.com/AliyunContainerService/image-syncer/releases/tag/v1.0.3常见问题一次同步会经历三个阶段:生成同步任务,执行同步任务,重试失败的任务;其中每个同步任务代表一个需要同步的标签(镜像)。如果配置文件中的规则没有指定tag,“生成同步任务”阶段会自动列出源仓库中的所有tag,并生成对应的同步任务。如果同步任务生成失败,也会在重试阶段进行重试。(故意错误配置账号密码时)执行输出如下:图3账号密码配置错误时的执行输出正常运行输出:图4正常运行时的执行输出image-syncer运行时会打印出如下内容日志信息:图5同步完成后,image-syncer还会统计同步任务成功和失败的次数(每个同步任务代表一个镜像),并打印“Finished,FAILEDTASKS>synctasksfailed,TASKS>tasksgeneratefailed”这样就可以获得同步的结果。图6其他一些参数示例原文链接:https://yq.aliyun.com/articles/727565?utm_content=g_1000088598Github开源地址:https://github.com/AliyunContainerService/image-syncer更多FAQ,参见:https://github.com/AliyunContainerService/image-syncer/blob/master/FAQs.md