概述
用戶業(yè)務(wù)在上云或者云遷移過程中,需要對鏡像進行批量遷移?;诖吮尘?,騰訊云容器專家團隊開發(fā)了鏡像批量遷移工具:image-transfer。該工具支持多種云廠商鏡像倉庫之間的批量遷移,同時支持騰訊云鏡像倉庫TCR個人版CCR一鍵全量遷移至騰訊云鏡像倉庫企業(yè)版TCR。本文首先介紹業(yè)務(wù)上云/遷移過程中鏡像遷移的痛點。隨后詳細介紹鏡像批量遷移工具image-transfer的設(shè)計思想,功能模塊以及最佳實踐。
工具已正式開源,項目地址:https://github.com/tkestack/image-transfer
二進制包下載地址:https://github.com/tkestack/image-transfer/releases
業(yè)務(wù)上云,鏡像怎么遷移?
業(yè)務(wù)上云主要有幾種場景,一是自建idc上云,二是第三方云遷移,三是異地災(zāi)備,即混合云。這些場景中,無論是上云還是云遷移,遷移流程主要有如下幾步。
網(wǎng)絡(luò)規(guī)劃。vpc配置,子網(wǎng)劃分等。
數(shù)據(jù)遷移。對象存儲,文件存儲等。
應(yīng)用遷移。業(yè)務(wù),配置等。
在數(shù)據(jù)遷移過程中,如果業(yè)務(wù)大量使用容器化部署,則需要批量鏡像遷移。而目前大部分云廠商的鏡像倉庫服務(wù)沒有提供鏡像倉庫批量遷移的能力。業(yè)務(wù)想要遷移,只能先在本地下載原鏡像,修改tag后,再上傳至目的鏡像倉庫。這個過程存在以下幾個缺點:
·耗時耗力。僅僅對于單個鏡像遷移,就需要三步操作,并且需要時刻盯著,若出現(xiàn)失敗情況,需進一步處理。
·完全人肉操作,易出現(xiàn)差錯。在對原鏡像修改tag時,由于是人為修改,極易操作失誤,tag修改錯了等。
·鏡像量大時,成本增加,上云進度緩慢。如果有幾百上千個鏡像,這樣人肉操作,遷移進度會十分緩慢,且遷移成本會大大增加。
image-transfer的原理
設(shè)計目標
針對鏡像遷移的痛點。我們希望開發(fā)一種鏡像批量遷移工具。它對使用者而言,只需要簡單的配置,就可以實現(xiàn)鏡像批量遷移,無需人工干預,提高業(yè)務(wù)上云/遷移的進度,降低成本。具體而言,該工具有以下設(shè)計目標。
1.配置簡單,無需復雜輸入。我們希望對使用者而言這個工具是簡單易用的,僅需配置源、目的鏡像地址和鑒權(quán),即可完成批量遷移。
2.快速高效遷移海量鏡像,降低遷移成本。針對大量的鏡像遷移需求,我們希望工具可以高效完成,借助高并發(fā)的一些技術(shù),實現(xiàn)快速遷移。
3.一定的容錯能力,減少人工干預維護。在遷移過程中,我們希望工具可以進行一些錯誤的識別和自動修復,盡量減少人工維護,提高運維效率。
4.對運行環(huán)境沒有依賴,提高工具普適性。我們希望工具是可以在任何linux,mac os,windows操作系統(tǒng)中運行,而不用依賴docker及其他程序。
5.支持騰訊云CCR一鍵全量遷移模式。目前,騰訊云容器鏡像服務(wù)TCR企業(yè)版正式上線,騰訊云TCR個人版(CCR)將在未來逐步減少維護,直到下線。因此工具需要支持CCR倉庫一鍵全量遷移至TCR企業(yè)版。
6.支持自定義qps限速。批量遷移鏡像,頻繁的調(diào)用鏡像倉庫接口有可能導致鏡像倉庫崩潰,因此需要對qps進行限制。
架構(gòu)
image-transfer由多個模塊構(gòu)成,下圖給出了image-transfer架構(gòu)圖。
·通用模式輸入(默認):用于接受用戶下發(fā)的鏡像遷移任務(wù)。包括鏡像遷移配置文件和鑒權(quán)配置文件。該模式用于實現(xiàn)云廠商之間的鏡像遷移。
·CCR一鍵遷移模式輸入:需要在工具輸入?yún)?shù)添加--ccrToTcr=true,該模式用于CCR倉庫一鍵全量遷移至TCR企業(yè)版。除了添加--ccrToTcr=true參數(shù),還需鑒權(quán)配置文件和騰訊云secret配置文件。
·pipeline:該模塊是工具處理鏡像遷移的核心。負責處理用戶下發(fā)的鏡像遷移任務(wù),包括根據(jù)遷移配置文件處理鏡像倉庫的同步規(guī)則,以及進行鏡像的分層拉取和傳輸任務(wù)。模塊采用了高并發(fā)的pipeline模型,提高遷移速度。
·重試task:這個階段會重試pipeline中傳輸失敗的任務(wù)。重試次數(shù)可根據(jù)用戶輸入?yún)?shù)而定,默認為2次。
Pipeline
由于工具采用golang語言編寫,因此核心處理模塊采用了go的pipeline高并發(fā)模型。整個pipeline模塊分為三個小模塊。
多協(xié)程處理鏡像倉庫同步規(guī)則
這里是對用戶輸入的鏡像遷移配置文件進行處理解析,獲取每一個需要傳輸?shù)脑寸R像地址(包括repo和tag),以及對應(yīng)的目的鏡像地址。然后針對每個源鏡像地址和目的鏡像地址組成一個job。如果鏡像配置文件中沒有指定源鏡像的tag,則會拉取該repo下的所有tag,再針對每個tag,組成一個job。這個過程采用golang的多協(xié)程方式處理,增加處理速度。協(xié)程數(shù)量可由用戶在輸入?yún)?shù)指定--proc,默認是5個。每個job組成后,會被放入task channel中,等待被消費。
Task傳輸通道
task通道可看作一個簡易中間件,由golang的channel實現(xiàn),每個job被生產(chǎn)后,會被放入該channel中,等待被消費。該設(shè)計可以保證生產(chǎn)者生產(chǎn)出job就會立即被放入消費線,一旦消費端有空閑,即可進行消費處理。提高job處理效率。
多協(xié)程處理task
這些協(xié)程就是job的消費端。拿到j(luò)ob后,會首先拉去job中源地址的manifest,判斷是否為多manifest鏡像,接著對每個blob進行拉取,再將blob傳輸?shù)侥康牡刂罚詈笤賹anifest傳輸?shù)侥康牡刂?,整個過程都是利用緩存,數(shù)據(jù)不落盤,提高效率。這個過程采用golang的多協(xié)程方式處理,增加處理速度。協(xié)程數(shù)量可由用戶在輸入?yún)?shù)指定--routines,默認是5個。
鏡像遷移最佳實踐
本節(jié)將介紹如何利用image-transfer工具,實現(xiàn)不同場景下的批量鏡像遷移。包含場景如下:
1.不同云廠商之間的鏡像遷移。例,從阿里云鏡像倉庫ACR遷移到騰訊云鏡像倉庫TCR。
2.開源/自建鏡像倉庫遷移上云。例,從harbor鏡像倉庫遷移到騰訊云鏡像倉庫TCR。
3.騰訊云TCR個人版(CCR)一鍵遷移至騰訊云鏡像倉庫企業(yè)版TCR。
工具安裝:
首先對工具進行下載編譯,有兩種方式,一種是直接獲取二進制文件,第二種是下載源碼編譯。
二進制release包下載地址:
https://github.com/tkestack/image-transfer/releases
示例采用下載源碼編譯進行演示:
編譯過程也非常簡單,進入源碼目錄,直接make。
git clone https://github.com/tkestack/image-transfer.git
cd./image-transfer
make
編譯完成后,會在當前目錄生成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
配置很簡單,輸入需要訪問源鏡像倉庫地址,和目的鏡像倉庫地址。并輸入對應(yīng)鏡像倉庫的用戶名和密碼即可。
其中insecure表示,registry是否是http服務(wù),如果是,insecure字段需要為true,默認是false,可選。
而目的鏡像倉庫的用戶需要擁有push以及創(chuàng)建倉庫權(quán)限,如果沒有提供,則默認匿名訪問。
其中騰訊云TCR訪問憑證如下方法獲?。?/span>
阿里云鏡像倉庫ACR的訪問憑證如下獲?。?/span>
2.準備好需要遷移的鏡像規(guī)則文件:rule.yaml
registry.cn-hangzhou.aliyuncs.com/grantzhao/sichenzhao:xx":"grant-test.tencentcloudcr.com/grantzhao/sichenzhao
該文件是配置需要傳輸?shù)脑寸R像和目的鏡像。文件規(guī)則是:源鏡像地址:目的鏡像地址其中源鏡像地址,可以指定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
參數(shù)解釋:
--ns指定了一個默認的ns,若目的倉庫的ns為空,則由該默認的ns代替。
--registry指定了一個默認的registry,若目的倉庫的registry為空,則由該默認的registry代替。
--routines=5,表示設(shè)置并發(fā)數(shù)為5。默認為5。
--retry=2,表示失敗后的重試次數(shù)為2,默認為2。
--securityFile,指定鑒權(quán)文件。
--ruleFile,指定鏡像倉庫配置文件。
--qps,限制請求的qps不高于100/s。
4.運行結(jié)果
最后一行
#################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.準備好需要遷移的鏡像規(guī)則文件: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.運行結(jié)果
最后一行
#################Finished,0 transfer jobs failed,0 jobs generate failed#################
表示運行成功。
最佳實踐之場景三:騰訊云TCR個人版(CCR)一鍵遷移至騰訊云鏡像倉庫企業(yè)版TCR
該場景下的使用方式和上面兩種場景稍有不同。主要表現(xiàn)為輸入?yún)?shù)的變化。
1.準備鏡像鑒權(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.準備騰訊云secret配置文件secret.yaml
對于TCR的一鍵遷移模式,不需倉庫的用戶名和密碼作為訪問鑒權(quán),而是通過騰訊云的secret信息。
ccr:
secretId:xxx
secretKey:xxx
tcr:
secretId:xxx
secretKey:xxx
注意:文件格式如上所示,只允許修改secretId和secretKey項。
如果沒有ccr的secret信息,則會用tcr的代替。相反如果沒有tcr的secret信息,也會用ccr的代替。
其中secret信息按如下方式獲取:
包含secretid和secretkey兩個信息
3.運行工具
這里的參數(shù)輸入與上面兩種場景略有區(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倉庫的名字。
--tcrRegion,指定目的tcr倉庫所在的地域。
--ccrRegion,指定源ccr倉庫所在的地域。
4.運行結(jié)果
一鍵批量遷移時間會很久,因為需要把ccr的全部鏡像傳輸?shù)絫cr。
最后可以看到,有16個job失敗了。工具最后會列出失敗的job的源鏡像地址和目的鏡像地址。對于這些失敗的job,去倉庫檢查后發(fā)現(xiàn),這些job的tag是失效的。因此傳輸失敗。
總結(jié)
本文從問題分析,設(shè)計目標,原理解析,最佳實踐等方面詳細介紹了鏡像批量遷移工具:image-transfer。