阿里云开源 image-syncer 工具,容器镜像迁移同步的终极利器

为什么要做这个工具?

由于阿里云上的容器服务 ACK 在使用成本、运维成本、方便性、长期稳定性上大大超过公司自建自维护 Kubernets 集群,有不少公司纷纷想把之前自己维护 Kubernetes 负载迁移到阿里云 ACK 服务上。在迁移过程中,往往会碰到一个不大不小的坑:那就是怎么把已有的容器镜像平滑的迁移到阿里云镜像服务 ACR 上。这个问题看起来非常简单,如果只有三五个镜像,只要做一次 docker pull/docker push 就能完成,但实际生产中涉及到成千上百个镜像,几 T 的镜像仓库数据时,迁移过程就变的耗时非常漫长,甚至丢失数据。

阿里云云原生应用平台的工程师——也就是我们,发现这是一个通用的需求,用户会在各种容器镜像仓库之间做迁移,或者进一步,期望有同步复制的能力,所以我们研发了 image-syncer 这个项目来支持迁云,并同时开源给业界大众,用来解决通用的容器镜像批量迁移/同步的问题。

这个工具在实际生产中,已经帮助了多家客户进行镜像迁移,其中最大镜像仓库的总量达到 3T 以上,同步时能跑满机器带宽,进行同步任务的机器磁盘容量没有要求。

image-syncer 简介

如上所述,在 k8s 集群迁移场景中,镜像仓库之间进行镜像迁移/同步是基本需求,而使用 docker pull/push 结合脚本的传统方式进行镜像同步,有如下几个局限性:

  1. 依赖磁盘存储,需要及时进行本地镜像的清理,并且落盘造成多余的时间开销,难以胜任生产场景中大量镜像的迁移
  2. 依赖 docker 程序,docker daemon 对 pull/push 的并发数进行了严格的限制,无法进行高并发同步
  3. 一些功能只能通过 HTTP api 进行操作,单纯使用 docker cli 无法做到,使脚本变得复杂

image-syncer 的定位是一个简单、易用的批量镜像迁移/同步工具,支持几乎所有目前主流的基于 docker registry V2 搭建的镜像存储服务,比如 ACR、Docker 
Hub、Quay、自建 Harbor 等,目前已经初步经过了 TB 级别的生产环境镜像迁移验证,并开源于 https://github.com/AliyunContainerService/image-syncer ,欢迎大家下载使用以及提供宝贵的建议~

工具特性

image-syncer 的特性如下:

1.支持多对多镜像仓库同步
2.支持基于 Docker Registry V2 搭建的 docker 镜像仓库服务 (如 Docker Hub、 Quay、 阿里云镜像服务 ACR、 Harbor等)
3.同步只经过内存和网络,不依赖磁盘存储,同步速度快
4.增量同步, 通过对同步过的镜像 blob 信息落盘,不重复同步已同步的镜像
5.并发同步,可以通过配置文件调整并发数
6.自动重试失败的同步任务,可以解决大部分镜像同步中的网络抖动问题
7.不依赖 docker 以及其他程序

借助 image-syncer,只需要保证 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 镜像,同样也可能需要用户提供有对应权限的账号密码。
image-syncer 同时支持 insecure 的 registry(类比 docker 的-- insecure - registry 参数,在" auth "的相应条目中添加 " insecure ": true ),可以同时在 http 和 https 两种类型的镜像服务之间迁移。
image-syncer 还提供了一些简单的参数来控制程序的运行,包括并发数目控制、重传次数设置等等:

-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,都可以通过设置重试次数来减少失败的任务数量

在同步结束之后,image-syncer
会统计成功和失败的同步任务数目(每个同步任务代表一个镜像),并在标准输出和日志中打印 "Finished, FAILED TASKS> sync tasks failed, TASKS> tasks generate failed" 的字样,从而可以获得同步的结果。更多FAQ参见 FAQs.md

使用示例

ACR(Alibaba Cloud Container Registry)是阿里云提供的容器镜像托管服务,支持全球20个地域的镜像全生命周期管理,联合容器服务等云产品,打造云原生应用的一站式体验。这里通过将自建 harbor 上的镜像同步到 ACR,提供 image-syncer 的基本使用示例

从自建 harbor 同步镜像到 ACR

1.在阿里云控制台上开通容器镜像服务,并进入 ACR 控制台

2.创建命名空间,默认仓库类型决定了当仓库不存在时,docker push 自动创建的仓库类型是公有的还是私有的;如果部分需要同步的目标仓库不存在,需要打开自动创建仓库按钮,让类似" docker push "的操作能自动创建仓库

3.创建访问凭证,对应的账号即为 docker login 的账号,如下图:

4.上面的操作使用的是主账号,默认拥有全部权限;为了进行权限管理,我们也可以通过创建 RAM 子账号,并配置对应权限,这里的场景中我们只使用到了创建、更新镜像仓库相关权限,最小权限设置如下,访问控制的资源粒度为 image-syncer 命名空间:

{"Statement": [{"Effect": "Allow","Action": ["cr:CreateRepository","cr:UpdateRepository","cr:PushRepository","cr:PullRepository"],"Resource": ["acs:cr:*:*:repository/image-syncer/*"]}],"Version": "1"
}

5.同样,RAM 账号需要通过 RAM 用户登陆入口登陆阿里云控制台,并进入 ACR 控制台创建访问凭证(同3.)

6.然后我们可以通过访问凭证中创建的密码,完成如下 image-syncer 的同步配置(配置中使用 RAM 子账号的访问凭证);这里我们将本地搭建的 harbor( http 服务,要设置 insecure,通过 harbor.myk8s.paas.com:32080 访问)中的 library/nginx 仓库同步到华北2(通过为 registry.cn-beijing.aliyuncs.com 访问)中的 image-syncer 命名空间下,并且保持仓库名称为 nginx,config.json 如下:

{"auth": {"harbor.myk8s.paas.com:32080": {"username": "admin","password": "xxxxxxxxx","insecure": true},"registry.cn-beijing.aliyuncs.com": {"username": "acr_pusher@1938562138124787","password": "xxxxxxxx"}},"images": {"harbor.myk8s.paas.com:32080/library/nginx": ""}
}

7.下载最新的 image-syncer 可执行文件(目前只支持 linux amd64 版本,可以自行编译),解压,并运行工具

执行命令:

# 设置默认目标registry为registry.cn-beijing.aliyuncs.com,默认目标namespace为image-syncer
# 并发数为10,重试次数为10
# 日志输出到./log文件下,不存在会自动创建,不指定的话默认会将日志打印到Stderr
# 指定配置文件为harbor-to-acr.json,内容如上所述
./image-syncer --proc=10 --config=./harbor-to-acr.json --registry=registry.cn-beijing.aliyuncs.com --namespace=image-syncer --retries=10 --log=./log

一次同步会经历三个阶段:生成同步任务、执行同步任务以及重试失败任务;其中,每个同步任务都代表了一个需要同步的 tag (镜像),如果配置文件中某条规则没有指定 tag,在“生成同步任务”阶段会自动 list 源仓库所有 tag,并生成对应的同步任务,如果生成同步任务失败,也会在重试阶段进行重试,(故意配错账号密码时)执行输出如下:

正常运行的输出:

在运行时,image-syncer 会打印出如下的日志信息:

从自建 harbor 同步镜像到 ACR 企业版

ACR 企业版提供企业级容器镜像、Helm Chart 安全托管能力,拥有企业级安全独享特性,具备千节点镜像分发、全球多地域同步能力。提供云原生应用交付链,实现一次应用变更,全球化多场景自动交付。强烈推荐安全需求高、业务多地域部署、拥有大规模集群节点的企业级客户使用。

同步到 ACR 企业版和 ACR 普通版所需的操作基本相同:

1.创建 ACR 企业版实例

2.创建命名空间,并对默认仓库类型进行设置,并打开自动创建仓库的功能

3.配置公网的访问控制,需要打开 ACR 企业版的访问入口,并添加公网白名单,使外部能访问镜像服务

4.配置访问凭证,这部分和 ACR 普通版相同

5.使用访问凭证中创建的密码,完成如下 image-syncer 的同步配置;与之前同步到ACR共享版不同的是,每个ACR企业版实例有自己单独的域名(一个公网可见,一个仅专有网络可见,如果镜像同步工具运行在个人环境上需要使用公网域名;如果要使用仅专有网络可见的域名,则将镜像同步工具运行在阿里云ECS实例上,并且通过配置使域名对该ECS所在的专有网络可见;这里使用的是公网域名
ruohe-test-registry.cn-shanghai.cr.aliyuncs.com),并且namespace对于每个不同企业版实例之间来说都是隔离的。我们同样将本地搭建的 harbor(http 服务,要设置i nsecure,通过 harbor.myk8s.paas.com:32080 访问)中的 library/nginx 仓库同步到 ACR 企业版实例中 image-syncer 命名空间下,并且保持仓库名称为 nginx,config.json 如下:

{"auth": {"harbor.myk8s.paas.com:32080": {"username": "admin","password": "xxxxxxxxx","insecure": true},"ruohe-test-registry.cn-shanghai.cr.aliyuncs.com": {"username": "ruohehhy","password": "xxxxxxxx"}},"images": {"harbor.myk8s.paas.com:32080/library/nginx": ""}
}

6.运行工具
执行命令

# 设置默认目标registry为ruohe-test-registry.cn-shanghai.cr.aliyuncs.com,默认目标namespace为image-syncer
# 并发数为10,重试次数为10
# 日志输出到./log文件下,不存在会自动创建,不指定的话默认会将日志打印到Stderr
# 指定配置文件为harbor-to-acr.json,内容如上所述
./image-syncer --proc=10 --config=./harbor-to-acr.json --registry=ruohe-test-registry.cn-shanghai.cr.aliyuncs.com --namespace=image-syncer --retries=10

输出与前述相同

更多能力

开源不易,长期的维护项目更不容易,大家觉得好就请给这个项目点个 star,公司内的老板会看这个项目的 star 数量来决定后续能不能投更多的研发资源来维护这个项目,万分感谢:)

One More Thing

那么,镜像仓库能顺利迁移,是否迁云就能顺利进行呢?答案是——并没有那么简单,仓库只是迁云过程中碰到的问题之一,还需要解决其他痛点。

对于已经在私有云/公有云上已经把业务应用跑在 k8s 上的用户来说,如何让业务在迁云过程中不受影响是头等大事。阿里云云原生应用平台的解决方案架构师对此已经有了完善的考虑,力助用户应用高效稳定的迁移到 ACK 服务上。在帮助这些用户落实迁云方案的同时,我们也在不断思考如何把这些案例中共性的东西做一些沉淀,总结出一些优秀的解决方案、最佳实践以及开发一些工具来帮助用户快速完成迁云的这件事情,这是我们迁移过程中为用户考虑到的点


原文链接
本文为云栖社区原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/517385.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

短网址系统设计与实战

&#x1f3a8;领域&#xff1a;Java后端开发&#x1f525;收录专栏&#xff1a; 系统设计与实战 &#x1f412;个人主页&#xff1a;BreezAm &#x1f496;Gitee&#xff1a;https://gitee.com/BreezAm ✨个人标签&#xff1a;【后端】【大数据】【前端】【运维】 文章目录&am…

“我,懂数据,不怕被裁”:这项核心能力到底有多香?

我见过市面上很多的 Python 讲解教程和书籍&#xff0c;他们大都这样讲 Python 的&#xff1a;先从 Python 的发展历史开始&#xff0c;介绍 Python 的基本语法规则&#xff0c;Python 的 list, dict, tuple 等数据结构&#xff0c;然后再介绍字符串处理和正则表达式&#xff0…

RuoYi-Cloud 登陆 /code 获取验证码出错

文章目录1. 异常信息2. 分析定位3. 解决方案1. 异常信息 [网关异常处理]请求路径:/code,异常信息:Invalid value ‘KaptchaTextCreator’ for config parameter ‘kaptcha.textproducer.impl’. 2. 分析定位 如果不修改包名的话&#xff0c;默认不会出现此问题&#xff0c;…

谁顶住双11的世界级流量洪峰?神龙架构负责人等9位大牛现场拆解阿里秘籍

阿里江湖中&#xff0c;很多资源和技术&#xff0c;如神龙服务器、OceanBase、POLARDB等等&#xff0c;在开源、自研、云这三架马车上形成协同效应&#xff0c;既是内功也是武器。 “不是任何一朵云都能撑住这个流量。中国有两朵云&#xff0c;一朵是阿里云&#xff0c;一朵叫…

如何回答性能优化的问题,才能打动阿里面试官?

阿里妹导读&#xff1a;日常工作中&#xff0c;我们多少都会遇到应用的性能问题。在阿里面试中&#xff0c;性能优化也是常被问到的题目&#xff0c;用来考察是否有实际的线上问题处理经验。面对这类问题&#xff0c;阿里工程师齐光给出了详细流程。来阿里面试前&#xff0c;先…

RuoYi-Cloud [网关异常处理]请求路径:/code,异常信息:null

文章目录1. 现象2. 分析定位3. 解决方案1. 现象 nacos配置文件中有值&#xff0c;但是代码初始化时未赋上值 2. 分析定位 既然nacos已经配置了&#xff0c;获取不到只能存在二种情况&#xff0c; 第一种&#xff1a;获取的不是最新的nacos的配置 第二种&#xff1a;没有…

这 10 行比较字符串相等的代码给我整懵了,不信你也来看看

来源 | 程序猿石头责编 | Carol 封图 | CSDN 下载自视觉中国先直接上代码&#xff1a;boolean safeEqual(String a, String b) {if (a.length() ! b.length()) {return false;}int equal 0;for (int i 0; i < a.length(); i) {equal | a.charAt(i) ^ b.charAt(i);}return …

SpringBoot整合websocket实现及时通信聊天

&#x1f3a8;领域&#xff1a;Java后端开发&#x1f525;收录专栏&#xff1a; 系统设计与实战 &#x1f412;个人主页&#xff1a;BreezAm &#x1f496;Gitee&#xff1a;https://gitee.com/BreezAm ✨个人标签&#xff1a;【后端】【大数据】【前端】【运维】 文章目录&am…

2019双11,支付宝有哪些“秘密武器”?

2019双11&#xff0c;支付宝参战的第十一年。 与十一年前相比&#xff0c;双11的许多东西都改变了。比如金额——2684亿&#xff0c;差不多是十一年前的5000倍&#xff1b;比如流量——订单峰值54.4万笔/秒&#xff0c;曾经是想都不敢想的数字&#xff1b;再比如层出不穷的新技…

一文看懂 K8s 日志系统设计和实践

导读&#xff1a;上一篇文章《6 个 K8s 日志系统建设中的典型问题&#xff0c;你遇到过几个&#xff1f;》中我们介绍了为什么需要一个日志系统、为什么云原生下的日志系统如此重要以及云原生背景下日志系统的建设难点&#xff0c;相信 DevOps、SRE、运维等同学看了之后深有体会…

如何在 Kubernetes 上配置 Jenkins?

作者 | Sudip Sengupta译者 | 火火酱&#xff0c;责编 | Carol封图 | CSDN 下载自视觉中国在本文中&#xff0c;我们将一起完成在Kubernetes上配置Jenkins的工作。作为一款被广泛使用的开源CI服务器&#xff0c;Jenkins提供了数百个插件&#xff0c;能够为我们项目的构建、部署…

MySQL做数据统计SQL语句整理大全(原理+实战)

&#x1f3a8;领域&#xff1a;Java后端开发&#x1f525;收录专栏&#xff1a; MySQL原理与实战 &#x1f412;个人主页&#xff1a;BreezAm &#x1f496;Gitee&#xff1a;https://gitee.com/BreezAm ✨个人标签&#xff1a;【后端】【大数据】【前端】【运维】 文章目录&a…

如何在一周内上线50个用户增长策略

在闲鱼用户增长业务上的实验 我们最先落地的业务是在用户增长上&#xff0c;闲鱼的用户增长业务有如下描述&#xff1a; 闲鱼的卖家都是普通小卖家&#xff0c;而非专业的B类商家。因此无法统一组织起来参加营销活动带来买家活跃。我们目前DAU已经突破到2000W&#xff0c;如何…

jstat gc各参数含义

参数说明S0C第一个幸存区的大小S1C第二个幸存区的大小S0U第一个幸存区的使用大小S1U第二个幸存区的使用大小EC伊甸园区的大小EU伊甸园区的使用大小OC老年代大小OU老年代使用大小MC方法区大小MU方法区使用大小CCSC压缩类空间大小CCSU压缩类空间使用大小YGC年轻代垃圾回收次数YGC…

MySQL用户如何构建实时数仓

依托数据库生态&#xff0c;AnalyticDB for MySQL可以给用户提供分析场景下的标准解决方案&#xff0c;尤其是在大数据和性能要求较高的情况下AnalyticDB for MySQL的价值可以更好的体现。 MySQL用户为什么要单独构建数据仓库 为什么要单独构建数据仓库&#xff0c;而不是直接…

138 张图带你 MySQL 入门!

作者 | cxuan来源 | Java建设者SQL 基础使用MySQL 是一种关系型数据库&#xff0c;说到关系&#xff0c;那么就离不开表与表之间的关系&#xff0c;而最能体现这种关系的其实就是我们接下来需要介绍的主角 SQL&#xff0c;SQL 的全称是 Structure Query Language &#xff0c;…

Centos/Red Hat6.8 安装、配置、启动Gitlab (内网环境)

文章目录一、软件和源准备1. Gitlab下载2. epel源下载二、环境配置2.1. 安装依赖项2.2. 安装epel源2.3. 安装Gitlab三、Gitlab和防火墙配置3.1. 设置external_url3.2. 重新加载配置3.3. 防火墙配置四、测试验证4.1. 浏览器访问Gitlab4.2. 重新设置密码4.3. Gitlab常用命令一、软…

Promise封装Ajax实现POST和GET请求

&#x1f3a8;领域&#xff1a;Java后端开发&#x1f525;收录专栏&#xff1a; 前端技术 &#x1f412;个人主页&#xff1a;BreezAm &#x1f496;Gitee&#xff1a;https://gitee.com/BreezAm ✨个人标签&#xff1a;【后端】【大数据】【前端】【运维】 文章目录介绍一、相…

轻松构建基于 Serverless 架构的弹性高可用视频处理系统

前言 随着计算机技术和 Internet 的日新月异&#xff0c;视频点播技术因其良好的人机交互性和流媒体传输技术倍受教育、娱乐等行业青睐&#xff0c;而在当前&#xff0c; 云计算平台厂商的产品线不断成熟完善&#xff0c; 如果想要搭建视频点播类应用&#xff0c;告别刀耕火种…

Centos/Red Hat6.8 安装、配置、启动Gitlab (内网环境)心得分享

文章目录一、Gitlab下载1. Gitlab官网下载二、分析思路2.1. 分析2.2. 代码托管平台2.3. 镜像站二、Gitlab 重新加载配置异常2.1. 异常现象2.2. 分析定位三、百度解决问题3.1. 百度类似异常3.2. 参考博文3.3. 解决方案3.4. 执行测试3.5. 结论四、官网issues 014.1. 找官网issues…