騰訊云:ImageApparate(幻影)鏡像加速服務(wù)讓鏡像分發(fā)效率提升5-10倍

來(lái)源: 騰訊云原生
作者:李昂 志宇 志國(guó)
時(shí)間:2021-03-01
16842
在業(yè)務(wù)普遍已經(jīng)完成容器化的大環(huán)境下,不同的業(yè)務(wù)場(chǎng)景對(duì)于容器啟動(dòng)需求也是不同的,在離線計(jì)算和一些需要快速增加計(jì)算資源(伸縮組)的在線服務(wù)場(chǎng)景下,往往對(duì)于容器的啟動(dòng)速度有較高的要求。

ZGMxZmU1Ni5qcGVn.jpg

在業(yè)務(wù)普遍已經(jīng)完成容器化的大環(huán)境下,不同的業(yè)務(wù)場(chǎng)景對(duì)于容器啟動(dòng)需求也是不同的,在離線計(jì)算和一些需要快速增加計(jì)算資源(伸縮組)的在線服務(wù)場(chǎng)景下,往往對(duì)于容器的啟動(dòng)速度有較高的要求。

在容器啟動(dòng)的整個(gè)周期中鏡像拉取的時(shí)間往往占據(jù)70%甚至更多。據(jù)統(tǒng)計(jì),某離線計(jì)算業(yè)務(wù)因容器鏡像較大,每次擴(kuò)容上千Pod耗時(shí)高達(dá)40分鐘。鏡像分發(fā)成為容器快速?gòu)椥陨炜s的主要障礙。

ImageApparate(幻影)

為了解決這個(gè)問(wèn)題,騰訊云容器服務(wù)TKE團(tuán)隊(duì)開(kāi)發(fā)了下一代鏡像分發(fā)方案ImageApparate(幻影),將大規(guī)模大鏡像分發(fā)的速度提升5-10倍。

640.png

應(yīng)對(duì)既有Docker下載鏡像模式帶來(lái)的問(wèn)題,社區(qū)新方案的討論主要在鏡像數(shù)據(jù)的延遲加載(Lazy-Pull)和新鏡像格式的設(shè)計(jì)不再以層為最小單位,而是chuck或者鏡像內(nèi)文件本身。

不過(guò),目前看OCI V2離我們依然還很遠(yuǎn),當(dāng)前我們通過(guò)何種方式來(lái)應(yīng)對(duì)這類(lèi)場(chǎng)景呢?

回到問(wèn)題本身,當(dāng)前OCI V1和容器運(yùn)行時(shí)交互邏輯需要先下載完整鏡像才能運(yùn)行容器,但是容器啟動(dòng)和運(yùn)行時(shí)到底會(huì)使用鏡像內(nèi)的多少內(nèi)容,這篇論文FAST'16[1]統(tǒng)計(jì)了DockerHub中一些常見(jiàn)的官方鏡像在其使用啟動(dòng)后需要讀取的數(shù)據(jù)量,得出的結(jié)論是僅有平均6.4%的內(nèi)容需要讀取。也就是說(shuō)鏡像中的大部分內(nèi)容可能在容器的整個(gè)生命周期內(nèi)根本不需要,那么如果我們只加載6%的數(shù)據(jù)就可以大幅減少鏡像拉取時(shí)間,從而加速容器啟動(dòng)速度,這也就為后續(xù)的優(yōu)化提供了理論前提。

因此減少容器啟動(dòng)時(shí)間的重點(diǎn)就在容器的rootfs即容器鏡像的獲取上。

基于此前提,在兼容OCI V1的框架下,TCR推出了ImageApparate(幻影)容器鏡像加速服務(wù)。首先直接放結(jié)論,在200節(jié)點(diǎn)且鏡像內(nèi)容占鏡像總大小的5%到10%。如上所述,相比于傳統(tǒng)的下載全部鏡像的方式,ImageApparate在容器全部啟動(dòng)時(shí)間上都有5-10倍的提升。而且本測(cè)試主要并不只是關(guān)注容器創(chuàng)建時(shí)間,而是繼續(xù)測(cè)試了從容器啟動(dòng)到業(yè)務(wù)進(jìn)程可以提供服務(wù)后的總體時(shí)間:

·順序讀取500MB大文件測(cè)試了包括從容器啟動(dòng)后到順序讀取500MB文件完成后的時(shí)間

·隨機(jī)讀取1000小文件測(cè)試了包括從容器啟動(dòng)后到隨即讀取1000個(gè)4k-16k完成后的時(shí)間

·執(zhí)行python程序測(cè)試了包括從容器啟動(dòng)后加載Python解釋器執(zhí)行一段簡(jiǎn)單的python代碼完成后的時(shí)間

·執(zhí)行g(shù)cc編譯測(cè)試了包括從容器啟動(dòng)后執(zhí)行g(shù)cc編譯一段簡(jiǎn)單C代碼并運(yùn)行完成后的時(shí)間

ImageApparate方案設(shè)計(jì)

傳統(tǒng)模式的問(wèn)題

自Docker發(fā)布以來(lái)云計(jì)算領(lǐng)域發(fā)生了巨大的變革,傳統(tǒng)虛擬機(jī)逐步被容器替代。Docker秉持Build,Ship And Run的理念出色的完成了容器運(yùn)行時(shí)和容器鏡像的設(shè)計(jì),引領(lǐng)整個(gè)容器行業(yè)。但是隨著時(shí)間的推移容器的Ship And Run在面對(duì)廣泛的用戶(hù)需求場(chǎng)景中也逐漸暴露出一些問(wèn)題。

傳統(tǒng)容器啟動(dòng)和鏡像下載方式為:

1.訪問(wèn)鏡像倉(cāng)庫(kù)服務(wù)獲取權(quán)限認(rèn)證以及獲取鏡像存儲(chǔ)地址

2.通過(guò)網(wǎng)絡(luò)訪問(wèn)鏡像存儲(chǔ)地址下載全部鏡像層并解壓

3.根據(jù)鏡像的層信息使用聯(lián)合文件系統(tǒng)掛載全部層作為rootfs,在此文件系統(tǒng)上創(chuàng)建并啟動(dòng)容器

640 (1).png

容器鏡像的設(shè)計(jì)從Docker發(fā)布至今一直沿用下來(lái),并已經(jīng)成為事實(shí)標(biāo)準(zhǔn)也就是我們現(xiàn)在使用的OCI V1,使用分層的設(shè)計(jì)大大減少空間占用,利用各類(lèi)聯(lián)合文件系統(tǒng)(Aufs、Overlayfs)將每層聯(lián)合掛載起來(lái)形成一個(gè)完整的RootFS只讀根文件系統(tǒng),容器運(yùn)行時(shí)的寫(xiě)入操作會(huì)在聯(lián)合文件系統(tǒng)的最上層的讀寫(xiě)層,非常精巧的設(shè)計(jì)。

但是,開(kāi)發(fā)者和用戶(hù)對(duì)于速度追求是永無(wú)止境的,隨著業(yè)務(wù)上云的廣泛普及,為了充分發(fā)揮云上資源的彈性能力,用戶(hù)往往需要新擴(kuò)出來(lái)的計(jì)算節(jié)點(diǎn)可以用最快的速度使用容器化的計(jì)算能力(容器啟動(dòng)服務(wù)可以接受流量),而此時(shí)這個(gè)全新節(jié)點(diǎn)就需要下載容器鏡像全部的層,大大拖慢容器啟動(dòng)速度,在這個(gè)場(chǎng)景下容器鏡像的分層設(shè)計(jì)沒(méi)有得到充分的利用,完全失效了。

針對(duì)OCI V1容器鏡像格式的一些問(wèn)題社區(qū)也開(kāi)始有集中的討論,當(dāng)前tar包作為OCI V1的鏡像層分發(fā)格式主要有以下問(wèn)題:

1.不同層之間的內(nèi)容冗余

2.沒(méi)有基于文件的尋址訪問(wèn)能力,需要全部解包后才能訪問(wèn)

3.沒(méi)有并發(fā)解包能力

4.使用whiteout處理文件刪除在不同存儲(chǔ)類(lèi)型中轉(zhuǎn)換導(dǎo)致解壓效率低下

TCR-Apparate OCI制品

我們?cè)O(shè)計(jì)的目標(biāo)是面向生產(chǎn)級(jí)別,在節(jié)點(diǎn)上同時(shí)支持鏡像加速模式和普通模式,為了和正常OCI V1鏡像存儲(chǔ)解耦,我們開(kāi)發(fā)了鏡像附加存儲(chǔ)IAS(ImageAttachStorage)結(jié)合鏡像Manifest中的外部層類(lèi)型(Foreign Layer),可以在契合OCI V1語(yǔ)義下完成加速鏡像的制作、上傳和下載,繼承原有鏡像權(quán)限的同時(shí),加速后的鏡像Manifest索引以O(shè)CI制品形式存儲(chǔ)在鏡像倉(cāng)庫(kù)本身的存儲(chǔ)中。

在鏡像格式方面為了支持按需加載和克服tar格式之前的一些缺點(diǎn),ImageApparate使用了只讀文件系統(tǒng)代替了tar格式。只讀文件系統(tǒng)解決了鏡像層內(nèi)文件尋址能力同時(shí)又具備成為Rootfs可靠的性能。ImageApparate仍然使用分層的設(shè)計(jì)在Manifest外部層中直接指定附件存儲(chǔ)地址,附加存儲(chǔ)層IAS在下載鏡像時(shí)就可以按需掛載。

用戶(hù)開(kāi)啟鏡像加速功能并設(shè)置相關(guān)規(guī)則后,push鏡像后ImageApparate會(huì)在后臺(tái)運(yùn)行如下流程:

1.用戶(hù)以任意符合OCI V1接口標(biāo)準(zhǔn)的客戶(hù)端(包括Docker)Push鏡像到TCR倉(cāng)庫(kù)

2.TCR的鏡像服務(wù)會(huì)將用戶(hù)數(shù)據(jù)寫(xiě)入到鏡像倉(cāng)庫(kù)本身的后端存儲(chǔ)中,一般為COS對(duì)象存儲(chǔ)。

3.TCR的鏡像服務(wù)會(huì)檢查鏡像加速規(guī)則,如果符合規(guī)則會(huì)給Apparate-client組件發(fā)出Webhook通知,請(qǐng)求轉(zhuǎn)換鏡像格式。

4.Apparate-client組件收到通知后會(huì)把COS數(shù)據(jù)寫(xiě)入到IAS中,使用特定算法把此鏡像的每個(gè)Layer逐個(gè)轉(zhuǎn)換為支持ImageApparate掛載的Layer格式。

因此,對(duì)于TCR用戶(hù)來(lái)說(shuō)只需要定義規(guī)則標(biāo)記哪些鏡像需要加速,而CI/CD的使用方式上沒(méi)有任何變化,原來(lái)的開(kāi)發(fā)模式順理成章地繼承下來(lái)。

640 (2).png

鏡像附加存儲(chǔ)IAS(ImageAttachStorage)

顧名思義,狹義的鏡像附加存儲(chǔ)IAS是除了本身的鏡像后端存儲(chǔ)之外的數(shù)據(jù)存儲(chǔ)地址,IAS既可以和鏡像倉(cāng)庫(kù)的使用相同的對(duì)象存儲(chǔ),也可以使用NFS或者Lustre。Apparate中的鏡像附加存儲(chǔ)除了存儲(chǔ)地址外,還包含一套插件化的接口(兼容Posix)和鏡像層IAS中的布局(Layout)。IAS中每個(gè)目錄代表一個(gè)Layer,這里依然會(huì)使用基于內(nèi)容尋址(Content Addressable)復(fù)用內(nèi)容相同層,只讀文件系統(tǒng)文件包含了這個(gè)原始層中的全部?jī)?nèi)容,隨時(shí)可以通過(guò)加載元數(shù)據(jù)索引獲取整個(gè)目錄樹(shù)。目前Apparate使用了騰訊云CFS[2]高性能版作為IAS的一種實(shí)現(xiàn),高吞吐低延遲CFS目前和鏡像下載場(chǎng)景非常契合。

鏡像本地緩存由不同的IAS附加存儲(chǔ)插件自身實(shí)現(xiàn),目前CFS實(shí)現(xiàn)使用了FScache框架作為本地緩存可以自動(dòng)按頁(yè)緩存訪問(wèn)過(guò)的在遠(yuǎn)端存儲(chǔ)上的部分?jǐn)?shù)據(jù),根據(jù)當(dāng)前磁盤(pán)通過(guò)本地緩存能力,有效提升鏡像數(shù)據(jù)重復(fù)訪問(wèn)的性能和穩(wěn)定性。

640 (3).png

運(yùn)行時(shí)實(shí)現(xiàn)

當(dāng)前ImageApparate在節(jié)點(diǎn)上使用的IAS附加存儲(chǔ)插件被稱(chēng)之為Apparate-snapshotter,是通過(guò)containerd的proxy-snapshotter能力實(shí)現(xiàn)的。

Apparate-snapshotter主要負(fù)責(zé)解析記錄在鏡像層中的IAS信息,從而拿到另外數(shù)據(jù)存儲(chǔ)地址,接下來(lái)Apparate-snapshotter會(huì)去數(shù)據(jù)存儲(chǔ)服務(wù)中加載遠(yuǎn)程數(shù)據(jù),并在本地提供訪問(wèn)的Posix入口。

比如在CFS場(chǎng)景下,會(huì)把遠(yuǎn)端數(shù)據(jù)mount到本地,并把掛載點(diǎn)作為接下來(lái)本地訪問(wèn)的入口。當(dāng)需要使用遠(yuǎn)端數(shù)據(jù)時(shí)便由snapshotter或內(nèi)核來(lái)提供按需加載的能力。

只讀鏡像格式

對(duì)于支持Lazy-Pull的鏡像文件系統(tǒng)來(lái)說(shuō),只讀是非常關(guān)鍵的屬性,因?yàn)橹蛔x文件系統(tǒng)不需要考慮數(shù)據(jù)寫(xiě)入和刪除造成的碎片和垃圾回收,可以提前在制作文件系統(tǒng)的時(shí)候優(yōu)化數(shù)據(jù)塊和索引的分布,這樣可以大幅提高文件系統(tǒng)的讀取性能。

當(dāng)前IAS支持的只讀文件系統(tǒng)還增加了基于字母順序排序的目錄項(xiàng)索引(directory index),可以大大加速目錄項(xiàng)的Lookup操作。

640 (4).png

ImageApparate在TCR中使用方式

創(chuàng)建加速組件

當(dāng)前ImageApparate在TCR中為alpha功能需要白名單開(kāi)啟。開(kāi)啟加速組件需要選擇對(duì)應(yīng)CFS的高性能版,請(qǐng)確認(rèn)所在地域有此版本CFS。

640 (5).png

640 (6).png

創(chuàng)建加速規(guī)則

創(chuàng)建加速規(guī)則,只有規(guī)則中匹配的鏡像或者Tag才會(huì)自動(dòng)加速。之后再向TCR推送鏡像后可以看到匹配加速規(guī)則的鏡像會(huì)生成后綴為-apparate的OCI制品。

640 (7).png

640 (8).png

TKE集群側(cè)開(kāi)啟加速功能

在TKE集群中創(chuàng)建TCR插件時(shí)開(kāi)啟鏡像加速配置,之后可以給需要加速的集群中節(jié)點(diǎn)打標(biāo)簽kubectl label node xxx cloud.tencent.com/apparate=true,集群中Pod的鏡像可以仍然使用原鏡像名字(例如上述test/nginx:1.9),加速插件支持自動(dòng)選取已加速的鏡像來(lái)進(jìn)行掛載。如果鏡像已被加速,那么觀察TKE集群中Pod的image字段可以看到已被替換為test/nginx:1.9-apparate。

640 (9).png

后續(xù)工作

當(dāng)容器鏡像是按需加載后,Layer(層)可能已經(jīng)不再是復(fù)用的最小單位了,ImageApparate后續(xù)也會(huì)探索基于文件或者塊鏡像格式以及轉(zhuǎn)換工具以獲得更高的性能和效率。在接口側(cè)鏡像附加存儲(chǔ)IAS也會(huì)支持更多數(shù)據(jù)源,包括和TKE P2P組件的集成,按需加載與P2P結(jié)合可以更好的應(yīng)對(duì)超大規(guī)模鏡像加載場(chǎng)景,大大減輕源站壓力。

參考資料

[1]FAST'16:https://www.usenix.org/conference/fast16/technical-sessions/presentation/harter

[2]CFS:https://console.cloud.tencent.com/cfs

[3]Slacker:Fast Distribution with Lazy Docker Containers:https://www.usenix.org/conference/fast16/technical-sessions/presentation/harter

[4]Image Manifest V 2,Schema 2:https://docs.docker.com/registry/spec/manifest-v2-2/

[5]General Filesystem Caching:https://www.kernel.org/doc/Documentation/filesystems/caching/fscache.txt

[6]EROFS:A Compression-friendly Readonly File System for Resource-scarce Devices:https://www.usenix.org/system/files/atc19-gao.pdf

立即登錄,閱讀全文
版權(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。所有用戶(hù)可使用大版本升級(jí)能力升級(jí)至最新的PostgreSQL 17.0進(jìn)行體驗(yàn),也可以在產(chǎn)品購(gòu)買(mǎi)頁(yè)直接購(gòu)買(mǎi)。
騰訊云
云服務(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ù)雜查詢(xún)性能弱,只讀分析引擎來(lái)幫忙
復(fù)雜查詢(xún)性能弱,只讀分析引擎來(lái)幫忙
隨著當(dāng)今業(yè)務(wù)的高速發(fā)展,復(fù)雜多表關(guān)聯(lián)的場(chǎng)景越來(lái)越普遍。但基于行式存儲(chǔ)的數(shù)據(jù)庫(kù)在進(jìn)行復(fù)雜查詢(xún)時(shí)性能相對(duì)較弱。
騰訊云
云服務(wù)
2024-11-022024-11-02
優(yōu)質(zhì)服務(wù)商推薦
更多
掃碼登錄
打開(kāi)掃一掃, 關(guān)注公眾號(hào)后即可登錄/注冊(cè)
加載中
二維碼已失效 請(qǐng)重試
刷新
賬號(hào)登錄/注冊(cè)
小程序
快出海小程序
公眾號(hào)
快出海公眾號(hào)
商務(wù)合作
商務(wù)合作
投稿采訪
投稿采訪
出海管家
出海管家