通過image-syncer工具遷移容器鏡像
在Kubernetes集群遷移場(chǎng)景中,鏡像倉庫之間進(jìn)行鏡像遷移和同步是基本需求,image-syncer工具可以解決通用的容器鏡像批量遷移和鏡像同步復(fù)制的問題,將已有的容器鏡像平滑的遷移到阿里云鏡像服務(wù)ACR上。本文主要為您介紹如何通過image-syncer工具遷移容器鏡像。
背景信息
阿里云上的容器服務(wù)ACK在使用成本、運(yùn)維成本、方便性、長(zhǎng)期穩(wěn)定性上大大超過云廠商自建自維護(hù)Kubernetes集群,有不少云廠商紛紛想把之前自己維護(hù)Kubernetes負(fù)載遷移到阿里云ACK服務(wù)上。在遷移過程中,當(dāng)鏡像個(gè)數(shù)較少時(shí),可以通過docker pull或docker push命令完成鏡像遷移,如果涉及到成千上百個(gè)鏡像,甚至幾T的鏡像倉庫數(shù)據(jù)時(shí),遷移過程就變得非常漫長(zhǎng),并且可能丟失數(shù)據(jù)。此時(shí),用戶在各種容器鏡像倉庫之間遷移時(shí),期望有鏡像同步復(fù)制的能力。阿里云開源image-syncer工具具備此能力并已經(jīng)幫助多家云廠商成功遷移鏡像,其中最大鏡像倉庫的總量達(dá)到3TB以上。同步任務(wù)時(shí)能跑滿機(jī)器帶寬,并且對(duì)進(jìn)行同步任務(wù)的機(jī)器磁盤容量沒有要求。
image-syncer簡(jiǎn)介
在Kubernetes集群遷移場(chǎng)景中,鏡像倉庫之間進(jìn)行鏡像遷移和鏡像同步復(fù)制是基本需求,而使用docker pull或docker push結(jié)合腳本的傳統(tǒng)方式進(jìn)行鏡像同步,有如下幾個(gè)局限性:
依賴磁盤存儲(chǔ),需要及時(shí)進(jìn)行本地鏡像的清理,并且落盤造成多余的時(shí)間開銷,難以勝任生產(chǎn)場(chǎng)景中大量鏡像的遷移。
依賴Docker程序,Docker Daemon對(duì)Pull和Push的并發(fā)數(shù)進(jìn)行了嚴(yán)格的限制,無法進(jìn)行高并發(fā)同步。
一些功能只能通過HTTP API進(jìn)行操作,僅使用Docker CLI無法做到,使腳本變得復(fù)雜。
image-syncer的定位是一個(gè)簡(jiǎn)單、易用的批量鏡像遷移和鏡像同步復(fù)制工具,支持幾乎所有目前主流的基于Docker Registry V2搭建的鏡像存儲(chǔ)服務(wù),例如ACR、Docker、Hub、Quay、自建Harbor等,目前已經(jīng)初步經(jīng)過了TB級(jí)別的生產(chǎn)環(huán)境鏡像遷移驗(yàn)證,詳情請(qǐng)參見image-syncer。
工具特點(diǎn)
image-syncer提供了以下幾項(xiàng)支持:
支持多對(duì)多鏡像倉庫同步。
支持基于Docker Registry V2搭建的Docker鏡像倉庫服務(wù)
例如,Docker Hub、Quay、 阿里云鏡像服務(wù)ACR、Harbor等。
鏡像同步復(fù)制只經(jīng)過內(nèi)存和網(wǎng)絡(luò),不依賴磁盤存儲(chǔ),同步速度快。
支持增量同步。
通過對(duì)同步過的鏡像blob信息落盤,不會(huì)對(duì)已同步的鏡像進(jìn)行重復(fù)同步。
支持并發(fā)同步。
可以通過配置文件調(diào)整并發(fā)數(shù)。
支持自動(dòng)重試失敗的同步任務(wù),解決大部分鏡像同步中的網(wǎng)絡(luò)抖動(dòng)問題。
不依賴Docker以及其他程序。
通過使用image-syncer,只需要保證image-syncer的運(yùn)行環(huán)境與需要同步的registry網(wǎng)絡(luò)連通,您可以快速地完成從鏡像倉庫的遷移、復(fù)制以及增量同步,并且image-syncer對(duì)硬件資源幾乎沒有要求(因?yàn)閕mage-syncer嚴(yán)格控制網(wǎng)絡(luò)連接數(shù)目=并發(fā)數(shù),所以只有在單個(gè)鏡像層過大的情況下,并發(fā)數(shù)目過大可能會(huì)打滿內(nèi)存,內(nèi)存占用 <= 并發(fā)數(shù)x最大鏡像層大小)。除了使用重傳機(jī)制規(guī)避同步過程中可能出現(xiàn)的偶發(fā)問題之外,image-syncer會(huì)在運(yùn)行結(jié)束時(shí)統(tǒng)計(jì)最后同步失敗的鏡像個(gè)數(shù),并且打印出詳細(xì)的日志,幫助使用者定位同步過程中出現(xiàn)的問題。
準(zhǔn)備工作
使用image-syncer時(shí),您只需要提供一個(gè)配置文件,內(nèi)容示例如下:
{
"auth": { // 認(rèn)證字段,其中每個(gè)對(duì)象為一個(gè)registry的一個(gè)賬號(hào)和。
// 密碼;通常,同步源需要具有pull以及訪問tags權(quán)限。
// 同步目標(biāo)需要擁有push以及創(chuàng)建倉庫權(quán)限,如果沒有提供,則默認(rèn)匿名訪問。
"quay.io": { // registry的url,需要和下面images中對(duì)應(yīng)registry的url相同。
"username": "xxx", // 用戶名,可選。
"password": "xxxxxxxxx", // 密碼,可選。
"insecure": true // registry是否是http服務(wù),如果是,insecure字段需要為true,默認(rèn)是false,可選,支持這個(gè)選項(xiàng)需要image-syncer版本 > v1.0.1。
},
"registry.cn-beijing.aliyuncs.com": {
"username": "xxx",
"password": "xxxxxxxxx"
},
"registry.hub.docker.com": {
"username": "xxx",
"password": "xxxxxxxxxx"
}
},
"images": {
// 同步鏡像規(guī)則字段,其中一條規(guī)則包括一個(gè)源倉庫(鍵)和一個(gè)目標(biāo)倉庫(值)。
// 同步的最大單位是倉庫(repo),不支持通過一條規(guī)則同步整個(gè)namespace以及registry。
// 源倉庫和目標(biāo)倉庫的格式與docker pull/push命令使用的鏡像url類似(registry/namespace/repository:tag)。
// 源倉庫和目標(biāo)倉庫(如果目標(biāo)倉庫不為空字符串)都至少包含registry/namespace/repository。
// 源倉庫字段不能為空,如果需要將一個(gè)源倉庫同步到多個(gè)目標(biāo)倉庫需要配置多條規(guī)則。
// 目標(biāo)倉庫名可以和源倉庫名不同(tag也可以不同),此時(shí)同步功能類似于:docker pull + docker tag + docker push。
"quay.io/coreos/kube-rbac-proxy": "quay.io/ruohe/kube-rbac-proxy",
"xxxx":"xxxxx",
"xxx/xxx/xx:tag1,tag2,tag3":"xxx/xxx/xx"
// 當(dāng)源倉庫字段中不包含tag時(shí),表示將該倉庫所有tag同步到目標(biāo)倉庫,此時(shí)目標(biāo)倉庫不能包含tag。
// 當(dāng)源倉庫字段中包含tag時(shí),表示只同步源倉庫中的一個(gè)tag到目標(biāo)倉庫,如果目標(biāo)倉庫中不包含tag,則默認(rèn)使用源tag。
// 源倉庫字段中的tag可以同時(shí)包含多個(gè)(比如"a/b/c:1,2,3"),tag之間通過","隔開,此時(shí)目標(biāo)倉庫不能包含tag,并且默認(rèn)使用原來的tag。
// 當(dāng)目標(biāo)倉庫為空字符串時(shí),會(huì)將源鏡像同步到默認(rèn)registry的默認(rèn)namespace下,并且repo以及tag與源倉庫相同,默認(rèn)registry和默認(rèn)namespace可以通過命令行參數(shù)以及環(huán)境變量配置,參考下面的描述。
}
}