用戶業務在上雲或者雲遷移過程當中,須要對鏡像進行批量遷移。基於此背景,騰訊雲容器專家團隊開發了鏡像批量遷移工具:image-transfer。該工具支持多種雲廠商鏡像倉庫之間的批量遷移,同時支持騰訊雲鏡像倉庫 TCR 我的版 CCR 一鍵全量遷移至騰訊雲鏡像倉庫企業版 TCR。
本文首先介紹業務上雲/遷移過程當中鏡像遷移的痛點。隨後詳細介紹鏡像批量遷移工具 image-transfer 的設計思想,功能模塊以及最佳實踐。
工具已正式開源,項目地址:https://github.com/tkestack/image-transferlinux
二進制包下載地址:https://github.com/tkestack/image-transfer/releasesgit
業務上雲主要有幾種場景,一是自建 idc 上雲,二是第三方雲遷移,三是異地災備,即混合雲。這些場景中,不管是上雲仍是雲遷移,遷移流程主要有以下幾步。github
在數據遷移過程當中,若是業務大量使用容器化部署,則須要批量鏡像遷移。而目前大部分雲廠商的鏡像倉庫服務沒有提供鏡像倉庫批量遷移的能力。業務想要遷移,只能先在本地下載原鏡像,修改 tag 後,再上傳至目的鏡像倉庫。這個過程存在如下幾個缺點:golang
針對鏡像遷移的痛點。咱們但願開發一種鏡像批量遷移工具。它對使用者而言,只須要簡單的配置,就能夠實現鏡像批量遷移,無需人工干預,提升業務上雲/遷移的進度,下降成本。具體而言,該工具備如下設計目標。docker
配置簡單,無需複雜輸入。咱們但願對使用者而言這個工具是簡單易用的,僅需配置源、目的鏡像地址和鑑權,便可完成批量遷移。json
快速高效遷移海量鏡像,下降遷移成本。針對大量的鏡像遷移需求,咱們但願工具能夠高效完成,藉助高併發的一些技術,實現快速遷移。windows
必定的容錯能力,減小人工干預維護。在遷移過程當中,咱們但願工具能夠進行一些錯誤的識別和自動修復,儘可能減小人工維護,提升運維效率。緩存
對運行環境沒有依賴,提升工具普適性。咱們但願工具是能夠在任何 linux,mac os,windows 操做系統中運行,而不用依賴 docker 及其餘程序。網絡
支持騰訊雲 CCR 一鍵全量遷移模式。目前,騰訊雲容器鏡像服務 TCR 企業版正式上線,騰訊雲 TCR 我的版(CCR)將在將來逐步減小維護,直到下線。所以工具須要支持 CCR 倉庫一鍵全量遷移至 TCR 企業版。架構
image-transfer 由多個模塊構成,下圖給出了 image-transfer 架構圖。
通用模式輸入(默認):用於接受用戶下發的鏡像遷移任務。包括鏡像遷移配置文件和鑑權配置文件。該模式用於實現雲廠商之間的鏡像遷移。
CCR 一鍵遷移模式輸入:須要在工具輸入參數添加 --ccrToTcr=true,該模式用於 CCR 倉庫一鍵全量遷移至 TCR 企業版。除了添加 --ccrToTcr=true 參數,還需鑑權配置文件和騰訊雲 secret 配置文件。
pipeline:該模塊是工具處理鏡像遷移的核心。負責處理用戶下發的鏡像遷移任務,包括根據遷移配置文件處理鏡像倉庫的同步規則,以及進行鏡像的分層拉取和傳輸任務。模塊採用了高併發的 pipeline 模型,提升遷移速度。
因爲工具採用 golang 語言編寫,所以核心處理模塊採用了 go 的 pipeline 高併發模型。整個 pipeline 模塊分爲三個小模塊。
這裏是對用戶輸入的鏡像遷移配置文件進行處理解析,獲取每個須要傳輸的源鏡像地址(包括 repo 和 tag),以及對應的目的鏡像地址。而後針對每一個源鏡像地址和目的鏡像地址組成一個 job。若是鏡像配置文件中沒有指定源鏡像的 tag,則會拉取該 repo 下的全部 tag,再針對每一個 tag,組成一個 job。這個過程採用 golang 的多協程方式處理,增長處理速度。協程數量可由用戶在輸入參數指定 --proc,默認是 5 個。每一個 job 組成後,會被放入task channel 中,等待被消費。
task 通道可看做一個簡易中間件,由 golang 的 channel 實現,每一個 job 被生產後,會被放入該 channel 中,等待被消費。該設計能夠保證生產者生產出 job 就會當即被放入消費線,一旦消費端有空閒,便可進行消費處理。提升 job 處理效率。
這些協程就是 job 的消費端。拿到 job 後,會首先拉去 job 中源地址的 manifest,判斷是否爲多 manifest 鏡像,接着對每一個 blob 進行拉取,再將 blob 傳輸到目的地址,最後再將 manifest 傳輸到目的地址,整個過程都是利用緩存,數據不落盤,提升效率。這個過程採用 golang 的多協程方式處理,增長處理速度。協程數量可由用戶在輸入參數指定 --routines,默認是 5 個。
本節將介紹如何利用 image-transfer 工具,實現不一樣場景下的批量鏡像遷移。包含場景以下:
不一樣雲廠商之間的鏡像遷移。例,從阿里雲鏡像倉庫 ACR 遷移到騰訊雲鏡像倉庫 TCR。
開源/自建鏡像倉庫遷移上雲。例,從 harbor 鏡像倉庫遷移到騰訊雲鏡像倉庫 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 爲例。
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 的訪問憑證以下獲取:
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。
./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。
最後一行
################# Finished, 0 transfer jobs failed, 0 jobs generate failed #################
表示運行成功。
以從開源鏡像倉庫 docker hub 遷移到騰訊雲鏡像倉庫 TCR 爲例。
grant-test2.tencentcloudcr.com: username: xxx password: xxx registry.hub.docker.com: username: xxx password: xxx
sichenzhao/private-test:xxx": "grant-test2.tencentcloudcr.com/grantzhao/sichenzhao
./image-transfer --routines=5 --securityFile=./security.yaml --ruleFile=./rule.yaml --ns=default \ --registry=grant-test.tencentcloudcr.com --retry=2
最後一行
################# Finished, 0 transfer jobs failed, 0 jobs generate failed #################
表示運行成功。
該場景下的使用方式和上面兩種場景稍有不一樣。主要表現爲輸入參數的變化。
grant-test.tencentcloudcr.com: username: xxx password: xxx grant-test2.tencentcloudcr.com: username: xxx password: xxx ccr.ccs.tencentyun.com: username: xxx password: xxx
對於 TCR 的一鍵遷移模式,不需倉庫的用戶名和密碼做爲訪問鑑權,而是經過騰訊雲的 secret 信息。
ccr: secretId: xxx secretKey: xxx tcr: secretId: xxx secretKey: xxx
注意:
文件格式如上所示,只容許修改 secretId 和 secretKey 項。
若是沒有 ccr 的 secret 信息,則會用 tcr 的代替。相反若是沒有 tcr 的 secret 信息,也會用 ccr 的代替。
其中 secret 信息按以下方式獲取:
包含 secretid 和 secretkey 兩個信息
這裏的參數輸入與上面兩種場景略有區別。
./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 倉庫所在的地域。
一鍵批量遷移時間會好久,由於須要把 ccr 的所有鏡像傳輸到 tcr。
最後能夠看到,有 16 個 job 失敗了。工具最後會列出失敗的 job 的源鏡像地址和目的鏡像地址。對於這些失敗的 job,去倉庫檢查後發現,這些 job 的 tag 是失效的。所以傳輸失敗。
本文從問題分析,設計目標,原理解析,最佳實踐等方面詳細介紹了鏡像批量遷移工具:image-transfer。歡迎你們貢獻源碼,也歡迎提 issue 需求。