騰訊云鏡像批量遷移利器:image-transfer

來(lái)源: 騰訊云原生
作者:趙思晨
時(shí)間:2020-12-29
16610
本文首先介紹業(yè)務(wù)上云遷移過(guò)程中鏡像遷移的痛點(diǎn)。隨后詳細(xì)介紹鏡像批量遷移工具image-transfer的設(shè)計(jì)思想,功能模塊以及最佳實(shí)踐。

概述

用戶業(yè)務(wù)在上云或者云遷移過(guò)程中,需要對(duì)鏡像進(jìn)行批量遷移?;诖吮尘?,騰訊云容器專家團(tuán)隊(duì)開發(fā)了鏡像批量遷移工具:image-transfer。該工具支持多種云廠商鏡像倉(cāng)庫(kù)之間的批量遷移,同時(shí)支持騰訊云鏡像倉(cāng)庫(kù)TCR個(gè)人版CCR一鍵全量遷移至騰訊云鏡像倉(cāng)庫(kù)企業(yè)版TCR。本文首先介紹業(yè)務(wù)上云/遷移過(guò)程中鏡像遷移的痛點(diǎn)。隨后詳細(xì)介紹鏡像批量遷移工具image-transfer的設(shè)計(jì)思想,功能模塊以及最佳實(shí)踐。

工具已正式開源,項(xiàng)目地址:https://github.com/tkestack/image-transfer

二進(jìn)制包下載地址:https://github.com/tkestack/image-transfer/releases

業(yè)務(wù)上云,鏡像怎么遷移?

業(yè)務(wù)上云主要有幾種場(chǎng)景,一是自建idc上云,二是第三方云遷移,三是異地災(zāi)備,即混合云。這些場(chǎng)景中,無(wú)論是上云還是云遷移,遷移流程主要有如下幾步。

網(wǎng)絡(luò)規(guī)劃。vpc配置,子網(wǎng)劃分等。

數(shù)據(jù)遷移。對(duì)象存儲(chǔ),文件存儲(chǔ)等。

應(yīng)用遷移。業(yè)務(wù),配置等。

在數(shù)據(jù)遷移過(guò)程中,如果業(yè)務(wù)大量使用容器化部署,則需要批量鏡像遷移。而目前大部分云廠商的鏡像倉(cāng)庫(kù)服務(wù)沒(méi)有提供鏡像倉(cāng)庫(kù)批量遷移的能力。業(yè)務(wù)想要遷移,只能先在本地下載原鏡像,修改tag后,再上傳至目的鏡像倉(cāng)庫(kù)。這個(gè)過(guò)程存在以下幾個(gè)缺點(diǎn):

·耗時(shí)耗力。僅僅對(duì)于單個(gè)鏡像遷移,就需要三步操作,并且需要時(shí)刻盯著,若出現(xiàn)失敗情況,需進(jìn)一步處理。

·完全人肉操作,易出現(xiàn)差錯(cuò)。在對(duì)原鏡像修改tag時(shí),由于是人為修改,極易操作失誤,tag修改錯(cuò)了等。

·鏡像量大時(shí),成本增加,上云進(jìn)度緩慢。如果有幾百上千個(gè)鏡像,這樣人肉操作,遷移進(jìn)度會(huì)十分緩慢,且遷移成本會(huì)大大增加。

image-transfer的原理

設(shè)計(jì)目標(biāo)

針對(duì)鏡像遷移的痛點(diǎn)。我們希望開發(fā)一種鏡像批量遷移工具。它對(duì)使用者而言,只需要簡(jiǎn)單的配置,就可以實(shí)現(xiàn)鏡像批量遷移,無(wú)需人工干預(yù),提高業(yè)務(wù)上云/遷移的進(jìn)度,降低成本。具體而言,該工具有以下設(shè)計(jì)目標(biāo)。

1.配置簡(jiǎn)單,無(wú)需復(fù)雜輸入。我們希望對(duì)使用者而言這個(gè)工具是簡(jiǎn)單易用的,僅需配置源、目的鏡像地址和鑒權(quán),即可完成批量遷移。

2.快速高效遷移海量鏡像,降低遷移成本。針對(duì)大量的鏡像遷移需求,我們希望工具可以高效完成,借助高并發(fā)的一些技術(shù),實(shí)現(xiàn)快速遷移。

3.一定的容錯(cuò)能力,減少人工干預(yù)維護(hù)。在遷移過(guò)程中,我們希望工具可以進(jìn)行一些錯(cuò)誤的識(shí)別和自動(dòng)修復(fù),盡量減少人工維護(hù),提高運(yùn)維效率。

4.對(duì)運(yùn)行環(huán)境沒(méi)有依賴,提高工具普適性。我們希望工具是可以在任何linux,mac os,windows操作系統(tǒng)中運(yùn)行,而不用依賴docker及其他程序。

5.支持騰訊云CCR一鍵全量遷移模式。目前,騰訊云容器鏡像服務(wù)TCR企業(yè)版正式上線,騰訊云TCR個(gè)人版(CCR)將在未來(lái)逐步減少維護(hù),直到下線。因此工具需要支持CCR倉(cāng)庫(kù)一鍵全量遷移至TCR企業(yè)版。

6.支持自定義qps限速。批量遷移鏡像,頻繁的調(diào)用鏡像倉(cāng)庫(kù)接口有可能導(dǎo)致鏡像倉(cāng)庫(kù)崩潰,因此需要對(duì)qps進(jìn)行限制。

架構(gòu)

image-transfer由多個(gè)模塊構(gòu)成,下圖給出了image-transfer架構(gòu)圖。

640.png

·通用模式輸入(默認(rèn)):用于接受用戶下發(fā)的鏡像遷移任務(wù)。包括鏡像遷移配置文件和鑒權(quán)配置文件。該模式用于實(shí)現(xiàn)云廠商之間的鏡像遷移。

·CCR一鍵遷移模式輸入:需要在工具輸入?yún)?shù)添加--ccrToTcr=true,該模式用于CCR倉(cāng)庫(kù)一鍵全量遷移至TCR企業(yè)版。除了添加--ccrToTcr=true參數(shù),還需鑒權(quán)配置文件和騰訊云secret配置文件。

·pipeline:該模塊是工具處理鏡像遷移的核心。負(fù)責(zé)處理用戶下發(fā)的鏡像遷移任務(wù),包括根據(jù)遷移配置文件處理鏡像倉(cāng)庫(kù)的同步規(guī)則,以及進(jìn)行鏡像的分層拉取和傳輸任務(wù)。模塊采用了高并發(fā)的pipeline模型,提高遷移速度。

·重試task:這個(gè)階段會(huì)重試pipeline中傳輸失敗的任務(wù)。重試次數(shù)可根據(jù)用戶輸入?yún)?shù)而定,默認(rèn)為2次。

Pipeline

由于工具采用golang語(yǔ)言編寫,因此核心處理模塊采用了go的pipeline高并發(fā)模型。整個(gè)pipeline模塊分為三個(gè)小模塊。

多協(xié)程處理鏡像倉(cāng)庫(kù)同步規(guī)則

這里是對(duì)用戶輸入的鏡像遷移配置文件進(jìn)行處理解析,獲取每一個(gè)需要傳輸?shù)脑寸R像地址(包括repo和tag),以及對(duì)應(yīng)的目的鏡像地址。然后針對(duì)每個(gè)源鏡像地址和目的鏡像地址組成一個(gè)job。如果鏡像配置文件中沒(méi)有指定源鏡像的tag,則會(huì)拉取該repo下的所有tag,再針對(duì)每個(gè)tag,組成一個(gè)job。這個(gè)過(guò)程采用golang的多協(xié)程方式處理,增加處理速度。協(xié)程數(shù)量可由用戶在輸入?yún)?shù)指定--proc,默認(rèn)是5個(gè)。每個(gè)job組成后,會(huì)被放入task channel中,等待被消費(fèi)。

Task傳輸通道

task通道可看作一個(gè)簡(jiǎn)易中間件,由golang的channel實(shí)現(xiàn),每個(gè)job被生產(chǎn)后,會(huì)被放入該channel中,等待被消費(fèi)。該設(shè)計(jì)可以保證生產(chǎn)者生產(chǎn)出job就會(huì)立即被放入消費(fèi)線,一旦消費(fèi)端有空閑,即可進(jìn)行消費(fèi)處理。提高job處理效率。

多協(xié)程處理task

這些協(xié)程就是job的消費(fèi)端。拿到j(luò)ob后,會(huì)首先拉去job中源地址的manifest,判斷是否為多manifest鏡像,接著對(duì)每個(gè)blob進(jìn)行拉取,再將blob傳輸?shù)侥康牡刂罚詈笤賹anifest傳輸?shù)侥康牡刂?,整個(gè)過(guò)程都是利用緩存,數(shù)據(jù)不落盤,提高效率。這個(gè)過(guò)程采用golang的多協(xié)程方式處理,增加處理速度。協(xié)程數(shù)量可由用戶在輸入?yún)?shù)指定--routines,默認(rèn)是5個(gè)。

鏡像遷移最佳實(shí)踐

本節(jié)將介紹如何利用image-transfer工具,實(shí)現(xiàn)不同場(chǎng)景下的批量鏡像遷移。包含場(chǎng)景如下:

1.不同云廠商之間的鏡像遷移。例,從阿里云鏡像倉(cāng)庫(kù)ACR遷移到騰訊云鏡像倉(cāng)庫(kù)TCR。

2.開源/自建鏡像倉(cāng)庫(kù)遷移上云。例,從harbor鏡像倉(cāng)庫(kù)遷移到騰訊云鏡像倉(cāng)庫(kù)TCR。

3.騰訊云TCR個(gè)人版(CCR)一鍵遷移至騰訊云鏡像倉(cāng)庫(kù)企業(yè)版TCR。

工具安裝:

首先對(duì)工具進(jìn)行下載編譯,有兩種方式,一種是直接獲取二進(jìn)制文件,第二種是下載源碼編譯。

二進(jìn)制release包下載地址:

https://github.com/tkestack/image-transfer/releases

示例采用下載源碼編譯進(jìn)行演示:

編譯過(guò)程也非常簡(jiǎn)單,進(jìn)入源碼目錄,直接make。

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

cd./image-transfer

make

編譯完成后,會(huì)在當(dāng)前目錄生成image-transfer二進(jìn)制文件。即可使用。接下來(lái)進(jìn)行最佳實(shí)踐演示。

最佳實(shí)踐之場(chǎng)景一:不同云廠商之間的鏡像遷移

以從阿里云鏡像倉(cāng)庫(kù)ACR遷移到騰訊云鏡像倉(cāng)庫(kù)TCR為例。

1.準(zhǔn)備騰訊云鏡像倉(cāng)庫(kù)TCR以及阿里云鏡像倉(cāng)庫(kù)ACR的訪問(wèn)憑證信息文件: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

配置很簡(jiǎn)單,輸入需要訪問(wèn)源鏡像倉(cāng)庫(kù)地址,和目的鏡像倉(cāng)庫(kù)地址。并輸入對(duì)應(yīng)鏡像倉(cāng)庫(kù)的用戶名和密碼即可。

其中insecure表示,registry是否是http服務(wù),如果是,insecure字段需要為true,默認(rèn)是false,可選。

而目的鏡像倉(cāng)庫(kù)的用戶需要擁有push以及創(chuàng)建倉(cāng)庫(kù)權(quán)限,如果沒(méi)有提供,則默認(rèn)匿名訪問(wèn)。

其中騰訊云TCR訪問(wèn)憑證如下方法獲?。?/span>

640 (1).png

阿里云鏡像倉(cāng)庫(kù)ACR的訪問(wèn)憑證如下獲?。?/span>

640 (2).png

2.準(zhǔn)備好需要遷移的鏡像規(guī)則文件:rule.yaml

registry.cn-hangzhou.aliyuncs.com/grantzhao/sichenzhao:xx":"grant-test.tencentcloudcr.com/grantzhao/sichenzhao

該文件是配置需要傳輸?shù)脑寸R像和目的鏡像。文件規(guī)則是:源鏡像地址:目的鏡像地址其中源鏡像地址,可以指定tag,也可以不指定tag,也可以指定多個(gè)tag。指定單個(gè)tag時(shí):目的地址可以包含tag,也可以不包含。不包含tag時(shí)則使用源鏡像的tag。不指定tag時(shí):目的地址必須包含tag。指定多個(gè)tag時(shí):多tag之間用英文逗號(hào)隔開,比如grant-test.tencentcloudcr.com/grantzhao/sichenzhao:1.0,2.0,3.0。此時(shí)目的地址不能包含tag,默認(rèn)使用源地址的tag。

3.運(yùn)行工具

./image-transfer--routines=5--securityFile=./security.yaml--ruleFile=./rule.yaml--ns=default

--registry=grant-test.tencentcloudcr.com--retry=2--qps=100

參數(shù)解釋:

--ns指定了一個(gè)默認(rèn)的ns,若目的倉(cāng)庫(kù)的ns為空,則由該默認(rèn)的ns代替。

--registry指定了一個(gè)默認(rèn)的registry,若目的倉(cāng)庫(kù)的registry為空,則由該默認(rèn)的registry代替。

--routines=5,表示設(shè)置并發(fā)數(shù)為5。默認(rèn)為5。

--retry=2,表示失敗后的重試次數(shù)為2,默認(rèn)為2。

--securityFile,指定鑒權(quán)文件。

--ruleFile,指定鏡像倉(cāng)庫(kù)配置文件。

--qps,限制請(qǐng)求的qps不高于100/s。

4.運(yùn)行結(jié)果

640 (3).png

最后一行

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

表示運(yùn)行成功。

最佳實(shí)踐之場(chǎng)景二:開源/自建鏡像倉(cāng)庫(kù)遷移上云

以從開源鏡像倉(cāng)庫(kù)docker hub遷移到騰訊云鏡像倉(cāng)庫(kù)TCR為例。

1.準(zhǔn)備docker hub以及騰訊云鏡像倉(cāng)庫(kù)TCR的訪問(wèn)憑證信息文件:security.yaml

grant-test2.tencentcloudcr.com:

username:xxx

password:xxx

registry.hub.docker.com:

username:xxx

password:xxx

2.準(zhǔn)備好需要遷移的鏡像規(guī)則文件:image.json

sichenzhao/private-test:xxx":"grant-test2.tencentcloudcr.com/grantzhao/sichenzhao

3.運(yùn)行工具

./image-transfer--routines=5--securityFile=./security.yaml--ruleFile=./rule.yaml--ns=default

--registry=grant-test.tencentcloudcr.com--retry=2

4.運(yùn)行結(jié)果

640 (4).png

最后一行

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

表示運(yùn)行成功。

最佳實(shí)踐之場(chǎng)景三:騰訊云TCR個(gè)人版(CCR)一鍵遷移至騰訊云鏡像倉(cāng)庫(kù)企業(yè)版TCR

該場(chǎng)景下的使用方式和上面兩種場(chǎng)景稍有不同。主要表現(xiàn)為輸入?yún)?shù)的變化。

1.準(zhǔn)備鏡像鑒權(quán)配置文件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.準(zhǔn)備騰訊云secret配置文件secret.yaml

對(duì)于TCR的一鍵遷移模式,不需倉(cāng)庫(kù)的用戶名和密碼作為訪問(wèn)鑒權(quán),而是通過(guò)騰訊云的secret信息。

ccr:

secretId:xxx

secretKey:xxx

tcr:

secretId:xxx

secretKey:xxx

注意:文件格式如上所示,只允許修改secretId和secretKey項(xiàng)。

如果沒(méi)有ccr的secret信息,則會(huì)用tcr的代替。相反如果沒(méi)有tcr的secret信息,也會(huì)用ccr的代替。

其中secret信息按如下方式獲?。?/span>

640 (5).png

包含secretid和secretkey兩個(gè)信息

3.運(yùn)行工具

這里的參數(shù)輸入與上面兩種場(chǎng)景略有區(qū)別。

./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

參數(shù)解釋:

--ccrToTcr=true,表示開啟TCR一鍵全量遷移模式。

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

--tcrName=tcr-test,指定目的tcr倉(cāng)庫(kù)的名字。

--tcrRegion,指定目的tcr倉(cāng)庫(kù)所在的地域。

--ccrRegion,指定源ccr倉(cāng)庫(kù)所在的地域。

4.運(yùn)行結(jié)果

640 (6).png

一鍵批量遷移時(shí)間會(huì)很久,因?yàn)樾枰裞cr的全部鏡像傳輸?shù)絫cr。

最后可以看到,有16個(gè)job失敗了。工具最后會(huì)列出失敗的job的源鏡像地址和目的鏡像地址。對(duì)于這些失敗的job,去倉(cāng)庫(kù)檢查后發(fā)現(xiàn),這些job的tag是失效的。因此傳輸失敗。

總結(jié)

本文從問(wèn)題分析,設(shè)計(jì)目標(biāo),原理解析,最佳實(shí)踐等方面詳細(xì)介紹了鏡像批量遷移工具:image-transfer。

立即登錄,閱讀全文
版權(quán)說(shuō)明:
本文內(nèi)容來(lái)自于騰訊云原生,本站不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。文章內(nèi)容系作者個(gè)人觀點(diǎn),不代表快出海對(duì)觀點(diǎn)贊同或支持。如有侵權(quán),請(qǐng)聯(lián)系管理員(zzx@kchuhai.com)刪除!
相關(guān)文章
騰訊云數(shù)據(jù)庫(kù)PostgreSQL全面支持PG 17
騰訊云數(shù)據(jù)庫(kù)PostgreSQL全面支持PG 17
即日起,騰訊云PostgreSQL全面支持PostgreSQL 17.0。所有用戶可使用大版本升級(jí)能力升級(jí)至最新的PostgreSQL 17.0進(jìn)行體驗(yàn),也可以在產(chǎn)品購(gòu)買頁(yè)直接購(gòu)買。
騰訊云
云服務(wù)
2024-12-152024-12-15
高可用這個(gè)問(wèn)題,加機(jī)器就能解決?
高可用這個(gè)問(wèn)題,加機(jī)器就能解決?
互聯(lián)網(wǎng)服務(wù)的可用性問(wèn)題是困擾企業(yè)IT人員的達(dá)摩克利斯之劍:防于未然,體現(xiàn)不出價(jià)值。已然發(fā)生,又面臨P0危機(jī)。就更別提穩(wěn)定性建設(shè)背后顯性的IT預(yù)算問(wèn)題與隱性的人員成本問(wèn)題。
騰訊云
云服務(wù)
2024-11-252024-11-25
TDSQL TDStore引擎版替換HBase:在歷史庫(kù)場(chǎng)景中的成本與性能優(yōu)勢(shì)
TDSQL TDStore引擎版替換HBase:在歷史庫(kù)場(chǎng)景中的成本與性能優(yōu)勢(shì)
HBase憑借其高可用性、高擴(kuò)展性和強(qiáng)一致性,以及在廉價(jià)PC服務(wù)器上的低部署成本,廣泛應(yīng)用于大規(guī)模數(shù)據(jù)分析。
騰訊云
云服務(wù)
2024-11-042024-11-04
復(fù)雜查詢性能弱,只讀分析引擎來(lái)幫忙
復(fù)雜查詢性能弱,只讀分析引擎來(lái)幫忙
隨著當(dāng)今業(yè)務(wù)的高速發(fā)展,復(fù)雜多表關(guān)聯(lián)的場(chǎng)景越來(lái)越普遍。但基于行式存儲(chǔ)的數(shù)據(jù)庫(kù)在進(jìn)行復(fù)雜查詢時(shí)性能相對(duì)較弱。
騰訊云
云服務(wù)
2024-11-022024-11-02
掃碼登錄
打開掃一掃, 關(guān)注公眾號(hào)后即可登錄/注冊(cè)
加載中
二維碼已失效 請(qǐng)重試
刷新
賬號(hào)登錄/注冊(cè)
個(gè)人VIP
小程序
快出海小程序
公眾號(hào)
快出海公眾號(hào)
商務(wù)合作
商務(wù)合作
投稿采訪
投稿采訪
出海管家
出海管家