概述
用戶業(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)圖。
·通用模式輸入(默認(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>
阿里云鏡像倉(cāng)庫(kù)ACR的訪問(wèn)憑證如下獲?。?/span>
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é)果
最后一行
#################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é)果
最后一行
#################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>
包含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é)果
一鍵批量遷移時(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。