阿里云开源 image-syncer 工具,容器镜像大批量迁移同步利器
怎么把已有的容器镜像平滑的迁移到阿里云镜像服务 ACR 上?最近阿里云给出了很好的方案,他们开源了 image-syncer 工具,能够使得成百上千个镜像实现平滑的批量迁移,其中最大镜像仓库的总量可以达到 3T 以上。而这一工具,也被称为容器镜像迁移/同步利器,我们将其重点内容及开源地址整理编辑如下。
什么是 image-syncer?
顾名思义,image-syncer 本质上就是图像同步器。它是一个 docker 镜像同步工具,能够将多对多的镜像仓库同步,并支持目前绝大多数主流的 docker 镜像仓库服务,例如:ACR、DockerHub、Quay、自建 Harbor 等。
通常情况下,在 k8s 集群迁移场景中,镜像仓库之间进行镜像迁移/同步是基本需求,而使用 docker pull/push 结合脚本的传统方式进行镜像同步,有如下几个局限性:
- 依赖磁盘存储,需要及时进行本地镜像的清理,并且落盘造成多余的时间开销,难以胜任生产场景中大量镜像的迁移
- 依赖 docker 程序,docker daemon 对 pull/push 的并发数进行了严格的限制,无法进行高并发同步
- 一些功能只能通过 HTTP api 进行操作,单纯使用 docker cli 无法做到,使脚本变得复杂
图 1 阿里云迁移框架
而 image-syncer 开发之初的定位就是一个简单、易用的批量镜像迁移/同步工具;因此,它的特性如下:
- 支持多对多镜像仓库同步
- 支持基于 Docker Registry V2 搭建的 docker 镜像仓库服务 (如 Docker Hub、 Quay、 阿里云镜像服务 ACR、 Harbor 等)
- 同步只经过内存和网络,不依赖磁盘存储,同步速度快
- 增量同步, 通过对同步过的镜像 blob 信息落盘,不重复同步已同步的镜像
- 并发同步,可以通过配置文件调整并发数
- 自动重试失败的同步任务,可以解决大部分镜像同步中的网络抖动问题
- 不依赖 docker 以及其他程序
只需要保证 image-syncer 的运行环境与需要同步的 registry 网络连通,使用者就可以快速地完成从镜像仓库的迁移、拷贝以及增量同步,并且该工具对硬件资源几乎没有要求(因为 image-syncer 严格控制网络连接数目=并发数,所以只有在当单个镜像层过大的情况下,并发数目过大可能会打满内存,内存占用 <= 并发数 x 最大镜像层大小)。
如何使用 image-syncer?
运行 image-syncer,只需要提供一个配置文件,内容如下:
{
"auth": { // 认证字段,其中每个对象为一个registry的一个账号和
// 密码;通常,同步源需要具有pull以及访问tags权限,
// 同步目标需要拥有push以及创建仓库权限,如果没有提供,则默认匿名访问
"quay.io": { // registry的url,需要和下面images中对应registry的url相同
"username": "xxx", // 用户名,可选
"password": "xxxxxxxxx", // 密码,可选
"insecure": true // registry是否是http服务,如果是,insecure 字段需要为true,默认是false,可选,支持这个选项需要image-syncer版本 > v1.0.1
},
"registry.cn-beijing.aliyuncs.com": {
"username": "xxx",
"password": "xxxxxxxxx"
},
"registry.hub.docker.com": {
"username": "xxx",
"password": "xxxxxxxxxx"
}
},
"images": {
// 同步镜像规则字段,其中条规则包括一个源仓库(键)和一个目标仓库(值)
// 同步的最大单位是仓库(repo),不支持通过一条规则同步整个namespace以及registry
// 源仓库和目标仓库的格式与docker pull/push命令使用的镜像url类似(registry/namespace/repository:tag)
// 源仓库和目标仓库(如果目标仓库不为空字符串)都至少包含registry/namespace/repository
// 源仓库字段不能为空,如果需要将一个源仓库同步到多个目标仓库需要配置多条规则
// 目标仓库名可以和源仓库名不同(tag也可以不同),此时同步功能类似于:docker pull + docker tag + docker push
"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同步到目标仓库,此时目标仓库不能包含tag
// 当源仓库字段中包含tag时,表示只同步源仓库中的一个tag到目标仓库,如果目标仓库中不包含tag,则默认使用源tag
// 源仓库字段中的tag可以同时包含多个(比如"a/b/c:1,2,3"),tag之间通过","隔开,此时目标仓库不能包含tag,并且默认使用原来的tag
// 当目标仓库为空字符串时,会将源镜像同步到默认registry的默认namespace下,并且repo以及tag与源仓库相同,默认registry和默认namespace可以通过命令行参数以及环境变量配置,参考下面的描述
}
}
用户可以根据配置不同的镜像同步规则组合,以匹配不同的迁移/同步需求,如将单个镜像 repo 同步到多个不同的镜像 repo、将多个源镜像同步到单个镜像 repo 中(以 tag 区分)、在同一个 registry 中以不同的名字拷贝一个镜像 repo 等等。
需要注意的是,如果匿名访问作为同步源的 registry 地址,可能存在权限问题无法 pull 镜像以及无法获取 tags,这种情况下需要在" auth "中加入有对应权限的账号密码;而如果匿名访问作为同步目标的 registry 地址,可能存在权限问题无法 push 镜像,同样也可能需要用户提供有对应权限的账号密码。
通常从自建 harbor 同步镜像到 ACR 需要 5 个步骤,包括:
- 创建 ACR 实例
- 创建命名空间
- 创建访问凭证
- 进行权限管理,完成配置
图 2 最小权限设置示例
- 下载 image-syncer 可执行文件(目前只支持 linux amd64 版本,可以自行编译)并解压,然后运行工具
最新版源码以及二进制文件:https://github.com/AliyunContainerService/image-syncer/releases/tag/v1.0.3
常见问题
一次同步会经历三个阶段:生成同步任务、执行同步任务以及重试失败任务;其中,每个同步任务都代表了一个需要同步的 tag(镜像),如果配置文件中某条规则没有指定 tag,在「生成同步任务」阶段会自动 list 源仓库所有 tag,并生成对应的同步任务,如果生成同步任务失败,也会在重试阶段进行重试。(故意配错账号密码时)执行输出如下:
图 3 配错账号密码时执行输出
正常运行的输出:
图 4 正常操作时执行输出
在运行时,image-syncer 会打印出如下的日志信息:
图 5 输出结果日志
而在同步结束之后,image-syncer 也会统计成功和失败的同步任务数目(每个同步任务代表一个镜像),并在标准输出和日志中打印 "Finished, FAILED TASKS> sync tasks failed, TASKS> tasks generate failed" 的字样,从而可以获得同步的结果。
-h --help 使用说明,会打印出一些启动参数的当前默认值
--config 设置用户提供的配置文件所在路径,使用之前需要创建配置文件,默认为当前工作目录下的image-syncer.json文件
--log 打印出来的log文件路径,默认打印到标准错误输出,如果将日志打印到文件将不会有命令行输出,此时需要通过cat对应的日志文件查看
--namespace 设置默认的目标namespace,当配置文件内一条images规则的目标仓库为空,并且默认registry也不为空时有效,可以通过环境变量DEFAULT_NAMESPACE设置,同时传入命令行参数会优先使用命令行参数值
--registry 设置默认的目标registry,当配置文件内一条images规则的目标仓库为空,并且默认namespace也不为空时有效,可以通过环境变量DEFAULT_REGISTRY设置,同时传入命令行参数会优先使用命令行参数值
--proc 并发数,进行镜像同步的并发goroutine数量,默认为5
--records 指定传输过程中保存已传输完成镜像信息(blob)的文件输出/读取路径,默认输出到当前工作目录,一个records记录了对应目标仓库的已迁移信息,可以用来进行连续的多次迁移(会节约大量时间,但不要把之前自己没执行过的records文件拿来用),如果有unknown blob之类的错误,可以删除该文件重新尝试
--retries 失败同步任务的重试次数,默认为2,重试会在所有任务都被执行一遍之后开始,并且也会重新尝试对应次数生成失败任务的生成。一些偶尔出现的网络错误比如io timeout、TLS handshake timeout,都可以通过设置重试次数来减少失败的任务数量
部分其它参数示例
原文链接: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
点击 阅读原文,查看:Kaldi 之父加盟后的小米开发者大会:亮眼 AI 开源项目逐一盘点
最新评论
推荐文章
作者最新文章
你可能感兴趣的文章
Copyright Disclaimer: The copyright of contents (including texts, images, videos and audios) posted above belong to the User who shared or the third-party website which the User shared from. If you found your copyright have been infringed, please send a DMCA takedown notice to [email protected]. For more detail of the source, please click on the button "Read Original Post" below. For other communications, please send to [email protected].
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。