美國專利:面向邊緣計算的容器鏡像構建方法
容器技術由于其快速啟動、較低資源開銷和輕量級資源隔離的特性,已經成為云環境中應用部署的規范。同時,容器輕量化的特點也使其在邊緣計算場景中得到了廣泛應用。然而,由于邊緣計算場景比云環境的可用網絡帶寬小,在邊緣計算場景使用傳統方式部署容器會因需要提前下載大量容器鏡像數據而造成帶寬占用過多和應用響應延遲低的問題。這是因為在生成標準容器鏡像時,用戶往往會引入許多不必要的數據,使鏡像體積遠大于實際需要。此外,鏡像使用層級結構以方便管理。這種分層結構的共享粒度較大、共享效果差,導致鏡像間存在大量冗余數據。為此,我們以減少容器部署過程中網絡資源的使用,并加速容器部署為目標,提出了一種面向邊緣計算的容器鏡像構建方法。該方法不再一次性下載完整鏡像,而是以文件為粒度根據容器運行情況實時地下載所需文件。此外,通過該方法構建出的新型鏡像對用戶透明,并且與現有框架的命令進行完全兼容。為實現上述特征,我們將傳統容器鏡像解耦為鏡像索引和鏡像文件兩部分。鏡像索引包含在一個單層標準鏡像中以方便其在現有架構下的傳輸。容器對鏡像的訪問被鏡像索引接收,并重定位到對應的鏡像文件。若請求的鏡像文件不在本地,新型鏡像能夠基于鏡像索引從遠程下載對應文件,從而避免在啟動前必須下載完整標注容器,減少了對網絡資源和存儲資源的消耗。此外,新型鏡像的共享粒度從原來的層級細化為文件級,使鏡像數據共享效果得到提升,從而去除了大量冗余數據。基于新型鏡像我們設計了面向邊緣計算的容器鏡像構建方法,使邊緣節點可以按需獲得容器運行所需數據,并通過節點上的數據緩存,進一步降低數據下載量。
該成果“Edge Computing-oriented Construction Method for Container Mirror Image”已獲得美國專利授權,授權號US 11,341,181 B2, 授權時間2022年5月22日。

背景和動機
容器因其部署便捷、啟動迅速、響應快速等特點已經成為云環境中應用開發、運行以及維護的事實標準。在容器實例啟動前,需要將其對應的鏡像下載至本地。下載容器鏡像的時間平均占據76%的容器部署時間。一個標準容器鏡像包含了應用代碼、依賴項打包以及環境變量,從而可以使用戶無視系統和平臺的差異無縫地部署容器實例。容器鏡像采用了分層結構對鏡像文件進行組織管理。容器啟動時,節點使用聯合掛載技術將多個鏡像層合并掛載到一個目錄下,從而為容器實例提供完整統一的文件系統視圖,實現對鏡像內文件的訪問。容器鏡像的分層設計,使得鏡像層可以在不同鏡像之間共享,即多鏡像之間若存在相同的鏡像層依賴,則該鏡像層僅會被下載一次,從而避免重復下載、冗余存儲引入的不必要開銷。常用的容器系統框架為客戶端-倉庫模型,倉庫集中對容器鏡像進行管理,本地節點部署容器時,通過網絡從倉庫下載對應鏡像。
容器輕量化的優點也使其被廣泛應用于邊緣場景。對比中心化的云計算,邊緣計算場景是指在靠近數據源的一側搭建集網絡、計算、存儲、應用能力為一體的計算節點,以就近提供處理少量數據的能力。然而,由于邊緣計算場景的資源往往是受限的,基于現有的標準容器鏡像部署容器實例會消耗大量網絡資源,并產生極高的應用服務時延。原因有以下三點:第一,鏡像以層為粒度進行構建,寫時復制,依賴升級等鏡像層數據部分更新操作會導致同一個鏡像內的鏡像層間存在大量的文件冗余。第二,鏡像分層結構數據共享粒度過粗,不同鏡像間的鏡像層往往因極小的差異而無法共享。第三,在容器運行過程中,大部分的容器鏡像數據不會被容器使用。當使用標準鏡像部署容器時,這些冗余數據和無用數據會大量下載。我們對業界流行的鏡像倉庫Docker Hub中的鏡像進行了觀察。我們發現Docker Hub中下載量前50的鏡像間文件冗余可達87%,且容器部署過程中僅有7%~33%的文件被訪問到。標準容器鏡像的上述不足會嚴重影響容器部署效率,并在一定程度阻礙容器技術在邊緣計算場景中的應用。因此,需要設計一種面向邊緣計算的容器鏡像構建方法。
系統設計
基于上述問題,本文提出了一種面向邊緣計算的容器鏡像構建方法。該方法將標準容器鏡像重構成支持文件級共享和加載的新型鏡像,并基于現有容器系統架構對新型容器鏡像進行存儲和傳輸。如圖1所示,面向邊緣計算的容器鏡像構建方法主要包含以下四個步驟:(1)標準容器鏡像的細粒度解耦;(2)基于索引的新型按需加載容器鏡像的生成;(3)本地容器的快速部署;(4)本地鏡像數據的文件級共享。

圖1 面向邊緣計算的容器鏡像構建方法
標準容器鏡像的細粒度解耦
為了打破層級限制,實現細粒度的數據共享,我們將標準容器鏡像解耦為鏡像文件結構關系信息和鏡像文件兩部分。如圖2所示,鏡像文件結構關系信息被放置于一個單層的標準容器鏡像中,使其能夠在鏡像倉庫中存放,并能夠通過現有的傳統架構中的命令進行拉取和上傳。由于鏡像文件結構關系信息只包含元數據而不包含具體文件,該單層標準鏡像具有極小的體積。容器鏡像各層中的文件被取出并置于文件存儲系統中。在文件存儲系統中,這些文件以該文件的數據指紋命名,并通過刪除具有相同文件名的文件即可達到去重的目的。

圖2 標準容器鏡像解耦與新型容器鏡像生成
基于索引的新型按需加載容器鏡像的生成
打破部署容器必須提前下載完整容器鏡像的限制,使容器能夠在運行過程中實時下載所需文件,我們設計了基于索引的新型按需加載容器鏡像。如圖2所示,我們利用文件結構關系信息實現了鏡像索引。索引功能通過在文件結構關系信息中添加文件的數據指紋實現,即將文件系統中的文件替換為文件的數據指紋。數據指紋的生成需要讀取完整文件并基于文件內容計算SHA256,對I/O資源和計算資源需求量高,因此對標準容器鏡像的解耦在倉庫端進行。
本地容器的快速部署
當本地節點需要部署一個容器,不再請求完整的標準容器鏡像,而是下載其對應的鏡像索引至本地節點。一方面,鏡像索引置于單層的標準鏡像中,鏡像索引可以存放于傳統的鏡像倉庫,并且節點可以使用通用的鏡像操作命令對其進行管理。另一方面,由于鏡像索引只包含元數據,其下載時間和所需帶寬都很小。包含鏡像索引的單層鏡像下載完成后,容器在運行過程中基于鏡像索引記錄的文件結構關系信息生成容器的文件系統視圖。當容器需要訪問一個鏡像文件,節點先基于文件結構關系信息找到對應文件的數據指紋,再通過數據指紋找到對應鏡像文件。在容器部署過程中,只有需要被訪問的鏡像文件才會被下載到本地,因此容器部署速度極快。
本地鏡像數據的文件級共享
不同容器部署過程中會涉及大量相同文件的訪問,特別是對于相同種類容器的不同鏡像版本,這些容器部署過程中的重復訪問數據超過70%。為此,我們在本地節點設計了文件共享池以進一步減少數據的下載量。由于在本地節點相同文件是共享的,需要避免對共享文件進行修改。為此,我們為每個容器創建一個獨立的文件域用于存放新文件和修改后的文件。本地為文件生成數據指紋作為該文件的文件名,并將文件的路徑和指紋合并入容器對應的鏡像索引。

圖3 實驗結果
系統評估
我們從鏡像數據規模、鏡像數據傳輸量和容器部署時間三個方面對我們的構建方法進行了測評。如圖3所示,相比于標準容器鏡像,存放新型按需加載容器鏡像的倉庫數據量減少了54%。相比于標準容器鏡像的層級共享,新型容器鏡像的文件級共享和按需加載減少了84%的數據傳輸量。另外,我們提出的鏡像構建方法在帶寬受限的場景下(5Mbps)對容器部署過程的加速可達5倍。