基于索引的按需下載容器鏡像格式
容器因其部署方便、輕量化等特點正在成為云平臺的基礎架構。然而粗粒度的層級共享使得鏡像中存在大量的重復數據和無用數據,不僅增加了用戶端容器部署過程中下載鏡像的耗時,也加重了倉庫端存放鏡像的負擔。為了加快鏡像下載并減小倉庫體積,我們提出了一種按需下載鏡像Gear。Gear將傳統鏡像分為索引和文件兩部分,并將索引部分置于與容器架構兼容的單層鏡像中。容器部署過程中用戶端只需下載包含索引的鏡像,并按索引實時下載容器運行所需文件即可。另外,Gear能夠進行文件級數據共享,不僅去除了倉庫端的冗余數據,也避免了用戶端重復下載相同文件。和現有的容器鏡像格式相比,Gear能夠將容器的部署速度提升5倍。另外,Gear還能夠為鏡像倉庫節約一半的空間。
該成果“Gear: Enable Efficient Container Storage and Deployment with a New Image Format”發表在ICDCS 2021(IEEE 41st International Conference on Distributed Computing Systems),是實驗室分布式系統組在容器技術領域的研究成果。

- 論文鏈接:
- https://ieeexplore.ieee.org/document/9546503
背景與動機

圖1 鏡像與容器化應用全生命周期管理
容器通過操作系統級虛擬技術和層次化鏡像管理為應用提供相比于虛擬機更輕量級的運行空間和更便捷的部署過程。因此,容器系統及相關應用得到了國內外越來越多的關注,研發和應用發展勢頭迅猛。容器鏡像在整個容器生態中處于核心地位,與容器化應用的整個生命周期息息相關。如圖1所示,開發者將系統文件、依賴包、自身文件等運行應用所需的數據構建成層次化的鏡像,并上傳到鏡像倉庫進行托管。位于不同場景的用戶可以通過簡單的命令行從倉庫下載所需鏡像,并基于鏡像在不同節點運行容器化應用。
初次部署容器時,用戶需要花費大量時間下載鏡像(平均占據76%的部署時間),造成服務質量下降。隨著容器系統的快速普及和容器化應用的持續更新,單個鏡像的體積和鏡像的總體數量不斷增加。不僅使得容器初次部署時間進一步增加也增大了倉庫端存儲開銷。
實際生產中,鏡像的層級粗粒度共享和快速迭代使得鏡像中包含大量重復數據和無用數據。然而,運行容器只需訪問鏡像中很小一部分數據。按需下載鏡像應運而生。但是,現有按需下載鏡像缺乏靈活性和兼容性。一方面,現有按需下載方案需要依托特定的網絡文件系統(NFS、CIFS)或虛擬塊設備以實現數據訪問。這些網絡文件系統只能適配POSIX應用,同時缺乏快照、壓縮等特性;而虛擬塊設備無法依據鏡像尺寸調節大小。另一方面,現有實現方案需要對I/O棧進行大量修改,包括設計存儲驅動、部署特定文件系統等。這些復雜改動導致現有方案無法在公有云平臺廣泛部署。此外,現有方案在用戶端缺乏細粒度緩存,鏡像間無法通過充分共享數據來加速下載過程。為此,我們設計了與當前容器架構兼容的按需下載鏡像,并設計細粒度緩存加速鏡像下載。
設計與實現
基于索引的按需下載鏡像

圖2 傳統鏡像與Gear鏡像轉換
為了實現與現有架構兼容的按需下載鏡像,我們提出了基于索引的容器鏡像格式Gear。如圖2所示,Gear鏡像將傳統鏡像分解為Gear索引和Gear文件兩部分。Gear索引包含于一個單層的傳統鏡像中,負責記錄對應傳統鏡像的文件系統結構,并將對應路徑的文件被替換為文件的索引值(數據指紋)。由于Gear索引移除了常規文件,所以體積很小。Gear文件為分離出的鏡像內文件,我們用這些文件的數據指紋為這些文件命名以保證Gear索引可以基于數據指紋找到對應文件。使用Gear鏡像部署容器時,用戶可以使用原生命令下載包含Gear索引的單層鏡像,并基于現有I/O棧訪問Gear索引,Gear索引根據數據指紋從倉庫端按需下載對應的Gear文件。倉庫端將Gear索引和Gear文件分開存儲。Gear索引存放在一個基于原始鏡像倉庫構建的索引倉庫。Gear文件被統一存放在一個對象存儲池中,存儲池只存儲數據指紋不同的文件。由于數據指紋能夠唯一標識文件,存儲池中不存在重復文件,倉庫規模顯著下降。
按需下載鏡像的用戶端存儲

圖3 Gear的用戶端存儲架構
如圖3所示,用戶端Gear鏡像的存儲系統分為三層。最底層的共享緩存負責存儲所有鏡像的Gear文件,文件通過數據指紋唯一標識。中間層負責存儲Gear索引。由于用戶可以基于Gear索引和Gear文件同時啟動多個容器,中間層的Gear索引和底層的Gear文件均為只讀格式。為了對Gear鏡像進行更新,Gear在最上層存儲為每個容器創建一個文件夾(/diff)用于記載每個容器各自的文件修改。需要提交新版本Gear鏡像時,首先將對應文件夾中的文件元數據和原始Gear索引結合生成新版本Gear索引。然后將新版本文件以其數據指紋命名,并存入最底層共享存儲。最后將新版本Gear索引和倉庫端缺失的Gear文件上傳至鏡像倉庫。
性能測評
性能測評中,我們分別使用傳統鏡像和Gear鏡像分別部署各類鏡像。在高帶寬(1000Mbps)和低帶寬(5Mbps)條件下,Gear鏡像平均能夠將容器的部署速度提升1.6倍和5倍。另外,我們在本地分別構建了一個傳統鏡像倉庫和一個Gear鏡像倉庫。兩個倉庫均包含DockerHub中TOP50鏡像的最近20個版本。相比于傳統鏡像倉庫,Gear鏡像倉庫的體積縮小了54%。

圖4 實驗結果