本篇內(nèi)容主要講解“ImageApparate鏡像有什么用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“ImageApparate鏡像有什么用”吧!
創(chuàng)新互聯(lián)建站主要從事成都網(wǎng)站制作、成都網(wǎng)站設計、網(wǎng)頁設計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務。立足成都服務土默特左旗,10余年網(wǎng)站建設經(jīng)驗,價格優(yōu)惠、服務專業(yè),歡迎來電咨詢建站服務:18980820575
在業(yè)務普遍已經(jīng)完成容器化的大環(huán)境下,不同的業(yè)務場景對于容器啟動需求也是不同的,在離線計算和一些需要快速增加計算資源(伸縮組)的在線服務場景下,往往對于容器的啟動速度有較高的要求。
在容器啟動的整個周期中鏡像拉取的時間往往占據(jù) 70% 甚至更多。據(jù)統(tǒng)計,某離線計算業(yè)務因容器鏡像較大,每次擴容上千 Pod 耗時高達 40 分鐘。鏡像分發(fā)成為容器快速彈性伸縮的主要障礙。
為了解決這個問題,騰訊云容器服務 TKE 團隊開發(fā)了下一代鏡像分發(fā)方案 ImageApparate(幻影), 將大規(guī)模大鏡像分發(fā)的速度提升 5-10倍。
應對既有 Docker 下載鏡像模式帶來的問題,社區(qū)新方案的討論主要在鏡像數(shù)據(jù)的延遲加載(Lazy-Pull)和新鏡像格式的設計不再以層為最小單位,而是 chuck 或者鏡像內(nèi)文件本身。
不過,目前看OCI V2
離我們依然還很遠,當前我們通過何種方式來應對這類場景呢?
回到問題本身,當前OCI V1
和容器運行時交互邏輯需要先下載完整鏡像才能運行容器,但是容器啟動和運行時到底會使用鏡像內(nèi)的多少內(nèi)容,這篇論文 FAST '16 統(tǒng)計了 DockerHub 中一些常見的官方鏡像在其使用啟動后需要讀取的數(shù)據(jù)量,得出的結(jié)論是僅有平均 6.4% 的內(nèi)容需要讀取。也就是說鏡像中的大部分內(nèi)容可能在容器的整個生命周期內(nèi)根本不需要,那么如果我們只加載 6% 的數(shù)據(jù)就可以大幅減少鏡像拉取時間,從而加速容器啟動速度,這也就為后續(xù)的優(yōu)化提供了理論前提。
因此減少容器啟動時間的重點就在容器的 rootfs 即容器鏡像的獲取上。
基于此前提,在兼容OCI V1
的框架下,TCR 推出了 ImageApparate(幻影) 容器鏡像加速服務。首先直接放結(jié)論,在 200 節(jié)點且鏡像內(nèi)容占鏡像總大小的 5% 到 10%。如上所述,相比于傳統(tǒng)的下載全部鏡像的方式,ImageApparate 在容器全部啟動時間上都有 5-10倍的提升。而且本測試主要并不只是關(guān)注容器創(chuàng)建時間,而是繼續(xù)測試了從容器啟動到業(yè)務進程可以提供服務后的總體時間:
順序讀取 500MB 大文件
測試了包括從容器啟動后到順序讀取 500MB 文件完成后的時間
隨機讀取 1000 小文件
測試了包括從容器啟動后到隨即讀取 1000個 4k-16k 完成后的時間
執(zhí)行 python 程序
測試了包括從容器啟動后加載 Python 解釋器執(zhí)行一段簡單的 python 代碼完成后的時間
執(zhí)行 gcc 編譯
測試了包括從容器啟動后執(zhí)行 gcc 編譯一段簡單 C 代碼并運行完成后的時間
自 Docker 發(fā)布以來云計算領(lǐng)域發(fā)生了巨大的變革,傳統(tǒng)虛擬機逐步被容器替代。Docker 秉持 Build, Ship And Run 的理念出色的完成了容器運行時和容器鏡像的設計,引領(lǐng)整個容器行業(yè)。但是隨著時間的推移容器的 Ship And Run 在面對廣泛的用戶需求場景中也逐漸暴露出一些問題。
傳統(tǒng)容器啟動和鏡像下載方式為:
訪問鏡像倉庫服務獲取權(quán)限認證以及獲取鏡像存儲地址
通過網(wǎng)絡訪問鏡像存儲地址下載全部鏡像層并解壓
根據(jù)鏡像的層信息使用聯(lián)合文件系統(tǒng)掛載全部層作為rootfs
,在此文件系統(tǒng)上創(chuàng)建并啟動容器
容器鏡像的設計從 Docker 發(fā)布至今一直沿用下來,并已經(jīng)成為事實標準也就是我們現(xiàn)在使用的OCI V1
,使用分層的設計大大減少空間占用,利用各類聯(lián)合文件系統(tǒng)(Aufs、Overlayfs)將每層聯(lián)合掛載起來形成一個完整的RootFS
只讀根文件系統(tǒng),容器運行時的寫入操作會在聯(lián)合文件系統(tǒng)的最上層的讀寫層,非常精巧的設計。
但是,開發(fā)者和用戶對于速度追求是永無止境的,隨著業(yè)務上云的廣泛普及,為了充分發(fā)揮云上資源的彈性能力,用戶往往需要新擴出來的計算節(jié)點可以用最快的速度使用容器化的計算能力(容器啟動服務可以接受流量),而此時這個全新節(jié)點就需要下載容器鏡像全部的層,大大拖慢容器啟動速度,在這個場景下容器鏡像的分層設計沒有得到充分的利用,完全失效了。
針對OCI V1
容器鏡像格式的一些問題社區(qū)也開始有集中的討論,當前tar
包作為OCI V1
的鏡像層分發(fā)格式主要有以下問題:
不同層之間的內(nèi)容冗余
沒有基于文件的尋址訪問能力,需要全部解包后才能訪問
沒有并發(fā)解包能力
使用 whiteout 處理文件刪除在不同存儲類型中轉(zhuǎn)換導致解壓效率低下
我們設計的目標是面向生產(chǎn)級別,在節(jié)點上同時支持鏡像加速模式和普通模式,為了和正常OCI V1
鏡像存儲解耦,我們開發(fā)了鏡像附加存儲IAS
(ImageAttachStorage)結(jié)合鏡像Manifest
中的外部層類型(Foreign Layer),可以在契合OCI V1
語義下完成加速鏡像的制作、上傳和下載,繼承原有鏡像權(quán)限的同時,加速后的鏡像Manifest
索引以 OCI 制品形式存儲在鏡像倉庫本身的存儲中。
在鏡像格式方面為了支持按需加載和克服tar
格式之前的一些缺點,ImageApparate 使用了只讀文件系統(tǒng)代替了 tar 格式。只讀文件系統(tǒng)解決了鏡像層內(nèi)文件尋址能力同時又具備成為Rootfs
可靠的性能。ImageApparate 仍然使用分層的設計在Manifest
外部層中直接指定附件存儲地址,附加存儲層IAS
在下載鏡像時就可以按需掛載。
用戶開啟鏡像加速功能并設置相關(guān)規(guī)則后,push 鏡像后 ImageApparate 會在后臺運行如下流程:
用戶以任意符合OCI V1
接口標準的客戶端(包括 Docker)Push 鏡像到 TCR 倉庫
TCR 的鏡像服務會將用戶數(shù)據(jù)寫入到鏡像倉庫本身的后端存儲中,一般為 COS 對象存儲。
TCR 的鏡像服務會檢查鏡像加速規(guī)則,如果符合規(guī)則會給 Apparate-client 組件發(fā)出 Webhook 通知,請求轉(zhuǎn)換鏡像格式。
Apparate-client 組件收到通知后會把 COS 數(shù)據(jù)寫入到IAS
中,使用特定算法把此鏡像的每個 Layer 逐個轉(zhuǎn)換為支持 ImageApparate 掛載的 Layer 格式。
因此,對于 TCR 用戶來說只需要定義規(guī)則標記哪些鏡像需要加速,而 CI/CD 的使用方式上沒有任何變化,原來的開發(fā)模式順理成章地繼承下來。
顧名思義,狹義的鏡像附加存儲IAS
是除了本身的鏡像后端存儲之外的數(shù)據(jù)存儲地址,IAS
既可以和鏡像倉庫的使用相同的對象存儲,也可以使用 NFS 或者 Lustre。Apparate 中的鏡像附加存儲除了存儲地址外,還包含一套插件化的接口(兼容Posix)和鏡像層IAS
中的布局(Layout)。IAS
中每個目錄代表一個 Layer,這里依然會使用基于內(nèi)容尋址(Content Addressable)復用內(nèi)容相同層, 只讀文件系統(tǒng)文件包含了這個原始層中的全部內(nèi)容,隨時可以通過加載元數(shù)據(jù)索引獲取整個目錄樹。目前 Apparate 使用了騰訊云 CFS 高性能版作為IAS
的一種實現(xiàn),高吞吐低延遲 CFS 目前和鏡像下載場景非常契合。
鏡像本地緩存由不同的IAS
附加存儲插件自身實現(xiàn),目前 CFS 實現(xiàn)使用了 FScache 框架作為本地緩存可以自動按頁緩存訪問過的在遠端存儲上的部分數(shù)據(jù),根據(jù)當前磁盤通過本地緩存能力,有效提升鏡像數(shù)據(jù)重復訪問的性能和穩(wěn)定性。
當前 ImageApparate 在節(jié)點上使用的IAS
附加存儲插件被稱之為 Apparate-snapshotter,是通過 containerd 的 proxy-snapshotter 能力實現(xiàn)的。
Apparate-snapshotter 主要負責解析記錄在鏡像層中的IAS
信息,從而拿到另外數(shù)據(jù)存儲地址,接下來 Apparate-snapshotter 會去數(shù)據(jù)存儲服務中加載遠程數(shù)據(jù),并在本地提供訪問的 Posix 入口。
比如在 CFS 場景下,會把遠端數(shù)據(jù) mount 到本地,并把掛載點作為接下來本地訪問的入口。當需要使用遠端數(shù)據(jù)時便由 snapshotter 或內(nèi)核來提供按需加載的能力。
對于支持 Lazy-Pull 的鏡像文件系統(tǒng)來說,只讀是非常關(guān)鍵的屬性,因為只讀文件系統(tǒng)不需要考慮數(shù)據(jù)寫入和刪除造成的碎片和垃圾回收,可以提前在制作文件系統(tǒng)的時候優(yōu)化數(shù)據(jù)塊和索引的分布,這樣可以大幅提高文件系統(tǒng)的讀取性能。
當前 IAS 支持的只讀文件系統(tǒng)還增加了基于字母順序排序的目錄項索引(directory index),可以大大加速目錄項的Lookup
操作。
當前 ImageApparate 在 TCR 中為 alpha 功能需要白名單開啟。開啟加速組件需要選擇對應 CFS 的高性能版,請確認所在地域有此版本 CFS。
創(chuàng)建加速規(guī)則,只有規(guī)則中匹配的鏡像或者 Tag 才會自動加速。之后再向 TCR 推送鏡像后可以看到匹配加速規(guī)則的鏡像會生成后綴為-apparate
的OCI
制品。
在 TKE 集群中創(chuàng)建 TCR 插件時開啟鏡像加速配置,之后可以給需要加速的集群中節(jié)點打標簽kubectl label node xxx cloud.tencent.com/apparate=true
,集群中 Pod 的鏡像可以仍然使用原鏡像名字(例如上述test/nginx:1.9),加速插件支持自動選取已加速的鏡像來進行掛載。如果鏡像已被加速,那么觀察 TKE 集群中 Pod 的 image
字段可以看到已被替換為 test/nginx:1.9-apparate。
到此,相信大家對“ImageApparate鏡像有什么用”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學習!