概述

用户业务在上云或者云迁徙过程中,须要对镜像进行批量迁徙。基于此背景,腾讯云容器专家团队开发了镜像批量迁徙工具:image-transfer。该工具反对多种云厂商镜像仓库之间的批量迁徙,同时反对腾讯云镜像仓库 TCR 个人版 CCR 一键全量迁徙至腾讯云镜像仓库企业版 TCR。
本文首先介绍业务上云/迁徙过程中镜像迁徙的痛点。随后具体介绍镜像批量迁徙工具 image-transfer 的设计思维,功能模块以及最佳实际。
工具已正式开源,我的项目地址:https://github.com/tkestack/i...

二进制包下载地址:https://github.com/tkestack/i...

业务上云,镜像怎么迁徙?

业务上云次要有几种场景,一是自建 idc 上云,二是第三方云迁徙,三是异地灾备,即混合云。这些场景中,无论是上云还是云迁徙,迁徙流程次要有如下几步。

  1. 网络布局。vpc 配置,子网划分等。
  2. 数据迁徙。对象存储,文件存储等。
  3. 利用迁徙。业务,配置等。

在数据迁徙过程中,如果业务大量应用容器化部署,则须要批量镜像迁徙。而目前大部分云厂商的镜像仓库服务没有提供镜像仓库批量迁徙的能力。业务想要迁徙,只能先在本地下载原镜像,批改 tag 后,再上传至目标镜像仓库。这个过程存在以下几个毛病:

  • 耗时耗力。仅仅对于单个镜像迁徙,就须要三步操作,并且须要时刻盯着,若呈现失败状况,需进一步解决。
  • 齐全人肉操作,易呈现过错。在对原镜像批改 tag 时,因为是人为批改,极易操作失误,tag 批改错了等。
  • 镜像量大时,成本增加,上云进度缓慢。如果有几百上千个镜像,这样人肉操作,迁徙进度会非常迟缓,且迁徙老本会大大增加。

image-transfer 的原理

设计指标

针对镜像迁徙的痛点。咱们心愿开发一种镜像批量迁徙工具。它对使用者而言,只须要简略的配置,就能够实现镜像批量迁徙,无需人工干预,进步业务上云/迁徙的进度,降低成本。具体而言,该工具有以下设计指标。

  1. 配置简略,无需简单输出。咱们心愿对使用者而言这个工具是简略易用的,仅需配置源、目标镜像地址和鉴权,即可实现批量迁徙。
  2. 疾速高效迁徙海量镜像,升高迁徙老本。针对大量的镜像迁徙需要,咱们心愿工具能够高效实现,借助高并发的一些技术,实现疾速迁徙。
  3. 肯定的容错能力,缩小人工干预保护。在迁徙过程中,咱们心愿工具能够进行一些谬误的辨认和主动修复,尽量减少人工保护,进步运维效率。
  4. 对运行环境没有依赖,进步工具普适性。咱们心愿工具是能够在任何 linux,mac os,windows 操作系统中运行,而不必依赖 docker 及其他程序。
  5. 反对腾讯云 CCR 一键全量迁徙模式。目前,腾讯云容器镜像服务 TCR 企业版正式上线,腾讯云 TCR 个人版(CCR)将在将来逐渐缩小保护,直到下线。因而工具须要反对 CCR 仓库一键全量迁徙至 TCR 企业版。
  6. 反对自定义 qps 限速。批量迁徙镜像,频繁的调用镜像仓库接口有可能导致镜像仓库解体,因而须要对 qps 进行限度。

架构

image-transfer 由多个模块形成,下图给出了 image-transfer 架构图。

  • 通用模式输出(默认):用于承受用户下发的镜像迁徙工作。包含镜像迁徙配置文件和鉴权配置文件。该模式用于实现云厂商之间的镜像迁徙。
  • CCR 一键迁徙模式输出:须要在工具输出参数增加 --ccrToTcr=true,该模式用于 CCR 仓库一键全量迁徙至 TCR 企业版。除了增加 --ccrToTcr=true 参数,还需鉴权配置文件和腾讯云 secret 配置文件。
  • pipeline:该模块是工具解决镜像迁徙的外围。负责解决用户下发的镜像迁徙工作,包含依据迁徙配置文件解决镜像仓库的同步规定,以及进行镜像的分层拉取和传输工作。模块采纳了高并发的 pipeline 模型,进步迁徙速度。
  • 重试 task:这个阶段会重试 pipeline 中传输失败的工作。重试次数可依据用户输出参数而定,默认为 2 次。

Pipeline

因为工具采纳 golang 语言编写,因而外围解决模块采纳了 go 的 pipeline 高并发模型。整个 pipeline 模块分为三个小模块。

多协程解决镜像仓库同步规定

这里是对用户输出的镜像迁徙配置文件进行解决解析,获取每一个须要传输的源镜像地址(包含 repo 和 tag),以及对应的目标镜像地址。而后针对每个源镜像地址和目标镜像地址组成一个 job。如果镜像配置文件中没有指定源镜像的 tag,则会拉取该 repo 下的所有 tag,再针对每个 tag,组成一个 job。这个过程采纳 golang 的多协程形式解决,减少处理速度。协程数量可由用户在输出参数指定 --proc,默认是 5 个。每个 job 组成后,会被放入task channel 中,期待被生产。

Task传输通道

task 通道可看作一个繁难中间件,由 golang 的 channel 实现,每个 job 被生产后,会被放入该 channel 中,期待被生产。该设计能够保障生产者生产出 job 就会立刻被放入生产线,一旦生产端有闲暇,即可进行生产解决。进步 job 解决效率。

多协程解决 task

这些协程就是 job 的生产端。拿到 job 后,会首先拉去 job 中源地址的 manifest,判断是否为多 manifest 镜像,接着对每个 blob 进行拉取,再将 blob 传输到目标地址,最初再将 manifest 传输到目标地址,整个过程都是利用缓存,数据不落盘,提高效率。这个过程采纳 golang 的多协程形式解决,减少处理速度。协程数量可由用户在输出参数指定 --routines,默认是 5 个。

镜像迁徙最佳实际

本节将介绍如何利用 image-transfer 工具,实现不同场景下的批量镜像迁徙。蕴含场景如下:

  1. 不同云厂商之间的镜像迁徙。例,从阿里云镜像仓库 ACR 迁徙到腾讯云镜像仓库 TCR。
  2. 开源/自建镜像仓库迁徙上云。例,从 harbor 镜像仓库迁徙到腾讯云镜像仓库 TCR。
  3. 腾讯云 TCR 个人版 (CCR) 一键迁徙至腾讯云镜像仓库企业版 TCR。

工具装置:

首先对工具进行下载编译,有两种形式,一种是间接获取二进制文件,第二种是下载源码编译。

二进制 release 包下载地址:

https://github.com/tkestack/i...

示例采纳下载源码编译进行演示:

编译过程也非常简单,进入源码目录,间接 make。

git clone https://github.com/tkestack/image-transfer.gitcd ./image-transfermake

编译实现后,会在当前目录生成 image-transfer 二进制文件。即可应用。接下来进行最佳实际演示。

最佳实际之场景一:不同云厂商之间的镜像迁徙

以从阿里云镜像仓库 ACR 迁徙到腾讯云镜像仓库 TCR 为例。

1. 筹备腾讯云镜像仓库 TCR 以及阿里云镜像仓库 ACR 的拜访凭证信息文件:auth.json
   grant-test.tencentcloudcr.com:   username: xxx   password: xxx   grant-test2.tencentcloudcr.com:   username: xxx   password: xxx   registry.cn-hangzhou.aliyuncs.com:   username: xxx   password: xxx   ccr.ccs.tencentyun.com:   username: xxx   password: xxx   registry.hub.docker.com:   username: xxx   password: xxx

配置很简略,输出须要拜访源镜像仓库地址,和目标镜像仓库地址。并输出对应镜像仓库的用户名和明码即可。

其中 insecure 示意,registry 是否是 http 服务,如果是,insecure 字段须要为 true,默认是 false,可选。

而目标镜像仓库的用户须要领有 push 以及创立仓库权限,如果没有提供,则默认匿名拜访。

其中腾讯云 TCR 拜访凭证如下办法获取:

阿里云镜像仓库 ACR 的拜访凭证如下获取:

2. 筹备好须要迁徙的镜像规定文件:rule.yaml
registry.cn-hangzhou.aliyuncs.com/grantzhao/sichenzhao:xx": "grant-test.tencentcloudcr.com/grantzhao/sichenzhao

该文件是配置须要传输的源镜像和目标镜像。文件规定是:源镜像地址: 目标镜像地址
其中源镜像地址,能够指定 tag,也能够不指定 tag,也能够指定多个 tag。
指定单个 tag 时:目标地址能够蕴含 tag,也能够不蕴含。不蕴含 tag 时则应用源镜像的 tag。
不指定 tag 时:目标地址必须蕴含 tag。
指定多个 tag 时:多 tag 之间用英文逗号隔开,比方 grant-test.tencentcloudcr.com/grantzhao/sichenzhao:1.0,2.0,3.0。此时目标地址不能蕴含 tag,默认应用源地址的 tag。

3. 运行工具
   ./image-transfer --routines=5 --securityFile=./security.yaml --ruleFile=./rule.yaml --ns=default \   --registry=grant-test.tencentcloudcr.com --retry=2 --qps=100

参数解释:

--ns 指定了一个默认的 ns,若目标仓库的 ns 为空,则由该默认的 ns 代替。

--registry指定了一个默认的 registry,若目标仓库的 registry 为空,则由该默认的 registry 代替。

--routines=5,示意设置并发数为 5。默认为 5。

--retry=2,示意失败后的重试次数为 2,默认为 2。

--securityFile,指定鉴权文件。

--ruleFile,指定镜像仓库配置文件。

--qps,限度申请的 qps 不高于100/s。

4. 运行后果


最初一行

################# Finished, 0 transfer jobs failed, 0 jobs generate failed #################

示意运行胜利。

最佳实际之场景二:开源/自建镜像仓库迁徙上云

以从开源镜像仓库 docker hub 迁徙到腾讯云镜像仓库 TCR 为例。

1. 筹备 docker hub 以及腾讯云镜像仓库 TCR 的拜访凭证信息文件:security.yaml
   grant-test2.tencentcloudcr.com:   username: xxx   password: xxx   registry.hub.docker.com:   username: xxx   password: xxx
2. 筹备好须要迁徙的镜像规定文件:image.json
   sichenzhao/private-test:xxx": "grant-test2.tencentcloudcr.com/grantzhao/sichenzhao
3. 运行工具
   ./image-transfer --routines=5 --securityFile=./security.yaml --ruleFile=./rule.yaml --ns=default \   --registry=grant-test.tencentcloudcr.com --retry=2
4. 运行后果


最初一行

################# Finished, 0 transfer jobs failed, 0 jobs generate failed #################

示意运行胜利。

最佳实际之场景三:腾讯云 TCR 个人版(CCR)一键迁徙至腾讯云镜像仓库企业版 TCR

该场景下的应用形式和下面两种场景稍有不同。次要体现为输出参数的变动。

1. 筹备镜像鉴权配置文件 security.yaml
   grant-test.tencentcloudcr.com:   username: xxx   password: xxx   grant-test2.tencentcloudcr.com:   username: xxx   password: xxx   ccr.ccs.tencentyun.com:   username: xxx   password: xxx
2. 筹备腾讯云 secret 配置文件 secret.yaml

对于 TCR 的一键迁徙模式,不需仓库的用户名和明码作为拜访鉴权,而是通过腾讯云的 secret 信息。

   ccr:   secretId: xxx   secretKey: xxx   tcr:   secretId: xxx   secretKey: xxx

留神:
文件格式如上所示,只容许批改 secretId 和 secretKey 项。

如果没有 ccr 的 secret 信息,则会用 tcr 的代替。相同如果没有 tcr 的 secret 信息,也会用 ccr 的代替。

其中 secret 信息按如下形式获取:

蕴含 secretid 和 secretkey 两个信息

3. 运行工具

这里的参数输出与下面两种场景略有区别。

   ./image-transfer --ccrToTcr=true --routines=5 --securityFile=./security.yaml --secretFile=./secret.yaml --tcrName=tcr-test \   --retry=3 --tcrRegion=ap-guangzhou --ccrRegion=ap-guangzhou --qps=3000

参数解释:

--ccrToTcr=true,示意开启 TCR 一键全量迁徙模式。

--secretFile,提供 secret.yaml 配置文件。

--tcrName=tcr-test,指定目标 tcr 仓库的名字。

--tcrRegion,指定目标 tcr 仓库所在的地区。

--ccrRegion,指定源 ccr 仓库所在的地区。

4. 运行后果

一键批量迁徙工夫会很久,因为须要把 ccr 的全副镜像传输到 tcr。

最初能够看到,有 16 个 job 失败了。工具最初会列出失败的 job 的源镜像地址和目标镜像地址。对于这些失败的 job,去仓库查看后发现,这些 job 的 tag 是生效的。因而传输失败。

总结

本文从问题剖析,设计指标,原理解析,最佳实际等方面具体介绍了镜像批量迁徙工具:image-transfer。欢送大家奉献源码,也欢送提 issue 需要。

【腾讯云原生】云说新品、云研新术、云游新活、云赏资讯,扫码关注同名公众号,及时获取更多干货!!