全部产品
Search
文档中心

容器服务 Kubernetes 版 ACK:通过image-syncer工具迁移容器镜像

更新时间:Jan 06, 2025

在Kubernetes集群中,镜像迁移和同步是基本需求。image-syncer工具可以批量迁移和同步容器镜像,将已有的容器镜像平滑地迁移到阿里云镜像服务ACR上。本文主要为您介绍如何通过image-syncer工具迁移容器镜像。

背景信息

在迁移Kubernetes负载到阿里云ACK服务的过程中,当镜像个数较少时,可以通过docker pull或docker push命令完成镜像迁移。但如果涉及到成千上百个镜像,甚至几TB的镜像仓库数据时,迁移过程就变得非常漫长,并且可能丢失数据。阿里云上的容器服务ACK在使用成本、运维成本、方便性、长期稳定性上大大超过云厂商自建自维护Kubernetes集群,因此不少云厂商纷纷选择迁移到阿里云ACK服务。为了应对大规模镜像迁移的挑战,阿里云开源了image-syncer工具,具备镜像同步复制的能力,并已经帮助多家云厂商成功迁移镜像,其中最大镜像仓库的总量达到3TB以上。同步任务时能跑满机器带宽,并且对进行同步任务的机器磁盘容量没有要求。

image-syncer简介

在Kubernetes集群迁移场景中,镜像仓库之间的镜像迁移和同步是基本需求。传统的docker pulldocker 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可以通过命令行参数以及环境变量配置。
    }     
}

使用示例

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