在Kubernetes集群中,镜像迁移和同步是基本需求。image-syncer工具可以批量迁移和同步容器镜像,将已有的容器镜像平滑地迁移到阿里云镜像服务ACR上。本文主要为您介绍如何通过image-syncer工具迁移容器镜像。
背景信息
在迁移Kubernetes负载到阿里云ACK服务的过程中,当镜像个数较少时,可以通过docker pull或docker push命令完成镜像迁移。但如果涉及到成千上百个镜像,甚至几TB的镜像仓库数据时,迁移过程就变得非常漫长,并且可能丢失数据。阿里云上的容器服务ACK在使用成本、运维成本、方便性、长期稳定性上大大超过云厂商自建自维护Kubernetes集群,因此不少云厂商纷纷选择迁移到阿里云ACK服务。为了应对大规模镜像迁移的挑战,阿里云开源了image-syncer工具,具备镜像同步复制的能力,并已经帮助多家云厂商成功迁移镜像,其中最大镜像仓库的总量达到3TB以上。同步任务时能跑满机器带宽,并且对进行同步任务的机器磁盘容量没有要求。
image-syncer简介
在Kubernetes集群迁移场景中,镜像仓库之间的镜像迁移和同步是基本需求。传统的docker pull
或docker push
结合脚本的方式存在以下局限性:
依赖磁盘存储,造成时间开销,难以应对大量镜像的迁移。
依赖Docker程序,限制了高并发同步。
一些功能只能通过HTTP API操作,使得脚本复杂。
image-syncer是一个简单、易用的批量镜像迁移和同步工具,支持几乎所有基于Docker Registry V2的镜像存储服务(如ACR、Docker Hub、Quay、自建Harbor等),并已在TB级别的生产环境中验证。详情请参见image-syncer。
工具特点
image-syncer提供了以下几项支持:
支持多对多镜像仓库同步,包括Docker Hub、Quay、阿里云镜像服务ACR、Harbor等。
基于Docker Registry V2搭建的Docker镜像仓库服务。
镜像同步复制只经过内存和网络,不依赖磁盘存储,同步速度快。
支持增量同步,避免重复同步已同步的镜像。
支持并发同步,可通过配置文件调整并发数。
支持自动重试失败的同步任务,解决网络抖动问题。
不依赖Docker及其他程序,只需保证运行环境与需要同步的registry网络连通。
通过使用image-syncer,您可以快速完成镜像仓库的迁移、复制及增量同步。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可以通过命令行参数以及环境变量配置。
}
}