容器镜像迁移工具之image-syncer

1,789 阅读6分钟

这是我参与更文挑战的第7天,活动详情查看: 更文挑战

1、背景

当Kubernetes容器编排管理工具已成为企业首选时,各个公有云厂商的云Kubernetes凭借在使用成本、运维成本、方便性、长期稳定性上大大超过了用户自建自维护Kubernets集群,有不少用户纷纷想把之前自己维护Kubernetes负载迁移到公有云Kubernetes服务上。

在迁移过程中,当镜像个数较少时,可以通过docker pulldocker push命令完成镜像迁移,如果涉及到成千上百个镜像,甚至几T的镜像仓库数据时,迁移过程就变得非常漫长,并且可能丢失数据。此时,用户在各种容器镜像仓库之间迁移时,期望有镜像同步复制的能力。

2、image-syncer

2.1 简介

一个简单、易用的批量镜像迁移和镜像同步复制工具,支持几乎所有目前主流的基于Docker Registry V2搭建的镜像存储服务,例如ACR、Docker、Hub、Quay、自建Harbor等,目前已经初步经过了TB级别的生产环境镜像迁移验证

2.2 安装

wget https://github.com/AliyunContainerService/image-syncer/releases/download/v1.0.3/image-syncer-v1.0.3-linux-amd64.tar.gz
tar zxf image-syncer-v1.0.3-linux-amd64.tar.gz && mv image-syncer /usr/local/bin/

3、使用

3.1 Harbor To Aliyun ACR

配置文件模板

{
    "auth": {                   // 认证字段,其中每个对象为一个registry的一个账号和
                                // 密码;通常,同步源需要具有pull以及访问tags权限,
                                // 同步目标需要拥有push以及创建仓库权限,如果没有提供,则默认匿名访问
        "quay.io": {            // registry的url,需要和下面images中对应registry的url相同
            "username": "xxx",               // 用户名,可选
            "password": "xxxxxxxxx",         // 密码,可选
            "insecure": true                 // registry是否是http服务,如果是,insecure字段需要为true
        },
        "registry.cn-beijing.aliyuncs.com": {
            "username": "xxx",
            "password": "xxxxxxxxx"
        },
        "registry.hub.docker.com": {
            "username": "xxx",
            "password": "xxxxxxxxxx"
        }
    },
    images: {
    	        "quay.io/coreos/kube-rbac-proxy": "quay.io/ruohe/kube-rbac-proxy",
        			"xxxx":"xxxxx",
        			"xxx/xxx/xx:tag1,tag2,tag3":"xxx/xxx/xx"
    }
}

1、同步镜像规则字段,其中一条规则包括一个源仓库(键)和一个目标仓库(值)

2、同步的最大单位是仓库(repo),不支持通过一条规则同步整个namespace以及registry

3、源仓库和目标仓库的格式与docker pull/push命令使用的镜像url类似(registry/namespace/repository:tag)

4、源仓库和目标仓库(如果目标仓库不为空字符串)都至少包含registry/namespace/repository

5、源仓库字段不能为空,如果需要将一个源仓库同步到多个目标仓库需要配置多条规则

6、目标仓库名可以和源仓库名不同(tag也可以不同),此时同步功能类似于:docker pull + docker tag + docker push

7、当源仓库字段中不包含tag时,表示将该仓库所有tag同步到目标仓库,此时目标仓库不能包含tag 8、当源仓库字段中包含tag时,表示只同步源仓库中的一个tag到目标仓库,如果目标仓库中不包含tag,则默认使用源tag 9、源仓库字段中的tag可以同时包含多个(比如"a/b/c:1,2,3"),tag之间通过","隔开,此时目标仓库不能包含tag,并且默认使用原来的tag

10、当目标仓库为空字符串时,会将源镜像同步到默认registry的默认namespace下,并且repo以及tag与源仓库相同,默认registry和默认namespace可以通过命令行参数以及环境变量配置,参考下面的描述

创建配置文件

{
    "auth": {
        "172.20.5.10": {
            "username": "admin",
            "password": "Xxzx@789",
            "insecure": true
        },
        "registry.cn-beijing.aliyuncs.com": {
            "username": "352@qq.com",
            "password": "docker"
        }
    },
    "images": {
        "172.20.5.10/library/kube-apiserver": ""
    }
}

开始迁移

# 并发数为10,重试次数为10
# 日志输出到./log文件下,不存在会自动创建,不指定的话默认会将日志打印到Stderr
# 指定配置文件为harbor-to-acr.json,内容如上所述

image-syncer --proc=10 --config=./harbor_to_acr.json --registry=registry.cn-beijing.aliyuncs.com --namespace=cloud-devops --retries=10 --log=./log  
Start to generate sync tasks, please wait ...
Start to handle sync tasks, please wait ...
Finished, 0 sync tasks failed, 0 tasks generate failed

日志

{"level":"info","msg":"Get tags of 172.20.5.10/library/kube-apiserver successfully: [v1.20.1]","time":"2021-01-08 10:54:23"}
{"level":"info","msg":"Generate a task for 172.20.5.10/library/kube-apiserver:v1.20.1 to registry.cn-beijing.aliyuncs.com/cloud-devops/kube-apiserver:v1.20.1","time":"2021-01-08 10:54:23"}
{"level":"info","msg":"Get manifest from 172.20.5.10/library/kube-apiserver:v1.20.1","time":"2021-01-08 10:54:23"}
{"level":"info","msg":"Get a blob sha256:f398b465657ed53ee83af22197ef61be9daec6af791c559ee5220dee5f3d94fe(647423) from 172.20.5.10/library/kube-apiserver:v1.20.1 success","time":"2021-01-08 10:54:23"}
{"level":"info","msg":"Put blob sha256:f398b465657ed53ee83af22197ef61be9daec6af791c559ee5220dee5f3d94fe(647423) to registry.cn-beijing.aliyuncs.com/cloud-devops/kube-apiserver:v1.20.1 success","time":"2021-01-08 10:54:24"}
{"level":"info","msg":"Get a blob sha256:cbcdf8ef32b41cd954f25c9d85dee61b05acc3b20ffa8620596ed66ee6f1ae1d(723022) from 172.20.5.10/library/kube-apiserver:v1.20.1 success","time":"2021-01-08 10:54:24"}
{"level":"info","msg":"Put blob sha256:cbcdf8ef32b41cd954f25c9d85dee61b05acc3b20ffa8620596ed66ee6f1ae1d(723022) to registry.cn-beijing.aliyuncs.com/cloud-devops/kube-apiserver:v1.20.1 success","time":"2021-01-08 10:54:24"}
{"level":"info","msg":"Get a blob sha256:d7d21f5bdd8303a60bac834f99867a58e6f3e1abcb6d486158a1ccb67dbf85bf(29033259) from 172.20.5.10/library/kube-apiserver:v1.20.1 success","time":"2021-01-08 10:54:24"}
{"level":"info","msg":"Put blob sha256:d7d21f5bdd8303a60bac834f99867a58e6f3e1abcb6d486158a1ccb67dbf85bf(29033259) to registry.cn-beijing.aliyuncs.com/cloud-devops/kube-apiserver:v1.20.1 success","time":"2021-01-08 10:54:24"}
{"level":"info","msg":"Get a blob sha256:75c7f711208082c548b935ab31e681ea30acccdce6b7abeecabae5bbfd326627(2630) from 172.20.5.10/library/kube-apiserver:v1.20.1 success","time":"2021-01-08 10:54:24"}
{"level":"info","msg":"Put blob sha256:75c7f711208082c548b935ab31e681ea30acccdce6b7abeecabae5bbfd326627(2630) to registry.cn-beijing.aliyuncs.com/cloud-devops/kube-apiserver:v1.20.1 success","time":"2021-01-08 10:54:25"}
{"level":"info","msg":"Put manifest to registry.cn-beijing.aliyuncs.com/cloud-devops/kube-apiserver:v1.20.1","time":"2021-01-08 10:54:25"}
{"level":"info","msg":"Synchronization successfully from 172.20.5.10/library/kube-apiserver:v1.20.1 to registry.cn-beijing.aliyuncs.com/cloud-devops/kube-apiserver:v1.20.1","time":"2021-01-08 10:54:25"}
{"level":"info","msg":"Finished, 0 sync tasks failed, 0 tasks generate failed","time":"2021-01-08 10:54:25"}

3.2 Harbor To Huawei SWR

创建配置文件

{
    "auth": {
        "172.20.5.10": {
            "username": "admin",
            "password": "Xxzx@789",
            "insecure": true
        },
        "swr.cn-east-3.myhuaweicloud.com": {
            "username": "cn-east-3@8B5B8GC",
            "password": "8b0f1e69f2"
        }
    },
    "images": {
        "172.20.5.10/library/kube-apiserver": "",
        "172.20.5.10/library/controller": ""
    }
}

启动任务

image-syncer --proc=10 --config=./harbor_to_swr.json --registry=swr.cn-east-3.myhuaweicloud.com --namespace=cloud-devops --retries=10 --log=./log
Start to generate sync tasks, please wait ...
Start to handle sync tasks, please wait ...
Finished, 0 sync tasks failed, 0 tasks generate failed

3.3 Huawei SWR To Aliyun ACR

创建配置文件

{
    "auth": {
        "swr.cn-east-3.myhuaweicloud.com": {
            "username": "cn-east-3@8B5B8GC",
            "password": "8b0f1e6a46af8dff0ae519a09f2"
        },
        "registry.cn-beijing.aliyuncs.com": {
            "username": "352@qq.com",
            "password": "docker"
        }
    },
    "images": {
        "swr.cn-east-3.myhuaweicloud.com/cloud-devops/kube-apiserver": "",
        "swr.cn-east-3.myhuaweicloud.com/cloud-devops/controller": ""
    }
}

开始迁移

image-syncer --proc=10 --config=./harbor_to_swr.json --registry=registry.cn-beijing.aliyuncs.com --namespace=cloud-devops --retries=10 --log=./log
Start to generate sync tasks, please wait ...
Start to handle sync tasks, please wait ...
Finished, 0 sync tasks failed, 0 tasks generate failed