让容器应用管理更快更安全,Dragonfly 发布 Nydus 容器镜像加速服务
鏡像對容器部署的挑戰(zhàn)
在容器的生產(chǎn)實踐中,偏小的容器鏡像能夠很快地部署啟動。當(dāng)應(yīng)用的鏡像達(dá)到幾個 GB 以上的時候,在節(jié)點(diǎn)上下載鏡像通常會消耗大量的時間。Dragonfly 通過引入 P2P 網(wǎng)絡(luò)有效提升了容器鏡像大規(guī)模分發(fā)的效率。然而,用戶還是必須等待鏡像數(shù)據(jù)完整下載到本地,然后才能創(chuàng)建自己的容器。我們希望進(jìn)一步縮減鏡像下載的時間,讓用戶能夠更快地部署容器應(yīng)用。同時,如何更好地保護(hù)用戶數(shù)據(jù),也是容器行業(yè)近年來的重要關(guān)注點(diǎn)。
為此,我們?yōu)?Dragonfly 項目引入了一個容器鏡像加速服務(wù) Nydus。Nydus 能夠極大縮短鏡像下載時間,并提供端到端的鏡像數(shù)據(jù)一致性校驗,從而讓用戶能夠更安全快捷地管理容器應(yīng)用。Nydus 由阿里云和螞蟻集團(tuán)的工程師合作開發(fā),并大規(guī)模部署在內(nèi)部的生產(chǎn)環(huán)境中。作為云原生生態(tài)的一部分, Nydus 在生產(chǎn)環(huán)境的優(yōu)秀表現(xiàn),讓我們有信心現(xiàn)在將項目開源,讓更多的容器用戶能夠體驗到容器快速啟動和安全加載方面的能力。
容器鏡像加速服務(wù) Nydus 地址:https://github.com/dragonflyoss/image-service
Nydus: Dragonfly 的容器鏡像服務(wù)
Nydus 項目優(yōu)化了現(xiàn)有的 OCI 鏡像標(biāo)準(zhǔn)格式,并以此設(shè)計了一個用戶態(tài)的文件系統(tǒng)。通過這些優(yōu)化,Nydus 能夠提供這些特性:
- 容器鏡像按需下載,用戶不再需要下載完整鏡像就能啟動容器
- 塊級別的鏡像數(shù)據(jù)去重,最大限度為用戶節(jié)省存儲資源
- 鏡像只有最終可用的數(shù)據(jù),不需要保存和下載過期數(shù)據(jù)
- 端到端的數(shù)據(jù)一致性校驗,為用戶提供更好的數(shù)據(jù)保護(hù)
- 兼容 OCI 分發(fā)標(biāo)準(zhǔn)和 artifacts 標(biāo)準(zhǔn),開箱即可用
- 支持不同的鏡像存儲后端,鏡像數(shù)據(jù)不只可以存放在鏡像倉庫,還可以放到 NAS 或者類似 S3 的對象存儲上
- 與 Dragonfly 的良好集成
架構(gòu)上, Nydus 主要包含一個新的鏡像格式,和一個負(fù)責(zé)解析容器鏡像的 FUSE 用戶態(tài)文件系統(tǒng)進(jìn)程。
Nydus 能夠解析 FUSE 或者 virtiofs 協(xié)議來支持傳統(tǒng)的 runc 容器或者 Kata 容器。容器倉庫、OSS 對象存儲、NAS 以及 Dragonfly 的超級節(jié)點(diǎn)和 peer 節(jié)點(diǎn)都可以作為 Nydus 的鏡像數(shù)據(jù)源。同時,Nydus 還可以配置一個本地緩存,從而避免每次啟動都從遠(yuǎn)端數(shù)據(jù)源拉取數(shù)據(jù)。
鏡像格式方面, Nydus 把一個容器鏡像分成元數(shù)據(jù)和數(shù)據(jù)兩層。其中元數(shù)據(jù)層是一棵自校驗的哈希樹,每個文件和目錄都是哈希樹中的一個附帶哈希值的節(jié)點(diǎn)。一個文件節(jié)點(diǎn)的哈希值由文件的數(shù)據(jù)確定,一個目錄節(jié)點(diǎn)的哈希值則由該目錄下所有文件和目錄的哈希值確定。每個文件的數(shù)據(jù)被按照固定大小切片并保存到數(shù)據(jù)層中,數(shù)據(jù)切片可以在不同文件以及不同鏡像中的不同文件共享。
Nydus 能為用戶帶來什么?
用戶如果部署了 Nydus 鏡像服務(wù),最直觀的一個感受就是,容器啟動變快了,從以前的明顯時間消耗,變成了幾乎瞬間就能啟動起來。在我們的測試中, Nydus 能夠把常見鏡像的啟動時間,從數(shù)分鐘縮短到數(shù)秒鐘。
另外一個不那么明顯但也很重要的改進(jìn),是 Nydus 能夠為用戶提供容器運(yùn)行時數(shù)據(jù)一致性校驗。在傳統(tǒng)的鏡像中,鏡像數(shù)據(jù)會先被解壓到本地文件系統(tǒng),再由容器應(yīng)用去訪問使用。解壓前,鏡像數(shù)據(jù)是完整校驗的。但是解壓之后,鏡像數(shù)據(jù)不再能夠被校驗。這帶來的一個問題就是,如果解壓后的鏡像數(shù)據(jù)被無意或惡意地修改,用戶是無法感知的。而 Nydus 鏡像不會被解壓到本地,同時可以對每一次數(shù)據(jù)訪問進(jìn)行校驗,如果數(shù)據(jù)被篡改,則可以從遠(yuǎn)端數(shù)據(jù)源重新拉取。
未來規(guī)劃
前面我們介紹了 Nydus 的架構(gòu)和優(yōu)點(diǎn)。在過去的一年里,我們和內(nèi)部的產(chǎn)品團(tuán)隊一起致力于讓 Nydus 項目更穩(wěn)定、安全和易用。在把 Nydus 項目開源之后,我們將會更關(guān)注廣泛的云原生容器生態(tài)。我們的愿景是,當(dāng)用戶在集群中部署 Dragonfly 和 Nydus 服務(wù)的時候,無論鏡像大小,用戶都能夠方便快捷地運(yùn)行他們的容器應(yīng)用,同時不需要為容器鏡像的數(shù)據(jù)安全性擔(dān)憂。
OCI 社區(qū)容器鏡像標(biāo)準(zhǔn)
我們已經(jīng)在內(nèi)部生產(chǎn)環(huán)境中大規(guī)模部署 Nydus,而我們堅信對 OCI 鏡像標(biāo)準(zhǔn)的改進(jìn)需要廣泛的社區(qū)合作。為此,我們積極地參與了 OCI 社區(qū)關(guān)于下一代鏡像標(biāo)準(zhǔn)的討論,并發(fā)現(xiàn) Nydus 能夠廣泛地符合 OCI 社區(qū)對下一代鏡像格式的要求。所以我們提議把 Nydus 作為 OCI 社區(qū)下一代鏡像格式的示例實現(xiàn),并期待和更多的云原生行業(yè)領(lǐng)導(dǎo)者們一起推進(jìn)下一代鏡像標(biāo)準(zhǔn)的制定和實現(xiàn)。
FAQ
Q1:現(xiàn)有的 OCI 鏡像標(biāo)準(zhǔn)有什么問題?
A1:SUSE 的 Aleksa Sarai 寫過一個 blog (The Road to OCIv2 Images: What’s Wrong with Tar?),詳細(xì)描述了現(xiàn)有 OCI 鏡像標(biāo)準(zhǔn)的一系列問題,簡單總結(jié)就是 OCI 鏡像標(biāo)準(zhǔn)使用的 tar 格式太古老,并不適合作為容器鏡像格式。
Q2:Nydus 和 CRFS 有什么區(qū)別?
A2:CRFS 是 GO build team 設(shè)計的一個鏡像格式。二者在主要設(shè)計思想上非常相似。細(xì)節(jié)上, Nydus 支持塊級別的數(shù)據(jù)去重和端到端的數(shù)據(jù)一致性校驗,可以說是在 CRFS 的 stargz 格式上的進(jìn)一步改進(jìn)。
Q3:Nydus 和 Azure 的 Teleport 有什么區(qū)別?
A3:Azure Teleport 更像是現(xiàn)有 OCI 鏡像標(biāo)準(zhǔn)在基于 SMB 文件共享協(xié)議的 snapshotter 上的一個部署實現(xiàn),能夠支持容器鏡像數(shù)據(jù)按需下載,但保留了所有目前 OCI 鏡像 tar 格式的缺陷。相對的,Nydus 拋棄了過時的 tar 格式,并使用 merkle tree 格式來提供更多的高級特性。
Q4:如果運(yùn)行基于 Nydus 的容器的時候網(wǎng)絡(luò)斷了怎么辦?
A4:使用現(xiàn)有 OCI 鏡像的時候,如果在容器鏡像還沒有完整下載的時候網(wǎng)絡(luò)斷了,容器會一開始就無法啟動。Nydus 很大程度上改變了容器啟動的流程,用戶不需要再等待鏡像數(shù)據(jù)完整下載就能啟動容器。而容器運(yùn)行時如果網(wǎng)絡(luò)斷了,將無法訪問沒有下載到本地的鏡像數(shù)據(jù)。Nydus 支持在容器啟動后在后臺下載容器鏡像數(shù)據(jù),所以當(dāng)容器鏡像數(shù)據(jù)完整下載到本地后,基于 Nydus 的容器也不會受到網(wǎng)絡(luò)中斷的影響。
附錄:OClv2 鏡像標(biāo)準(zhǔn)
從 2020 年 6 月開始,OCI 社區(qū)花了一個多月時間密集討論了當(dāng)前 OCI 鏡像標(biāo)準(zhǔn)的缺陷,以及 OCIv2 鏡像格式需要滿足哪些要求。OCIv2 在這里只是一個宣傳命名,實際上 OCIv2 是當(dāng)前 OCI 鏡像標(biāo)準(zhǔn)的改進(jìn),而不會是一個全新的鏡像標(biāo)準(zhǔn)。
這次鏡像格式大討論從一個郵件和一份共享文檔開始,并促成了多次在線的 OCI 社區(qū)討論會議。最后的結(jié)論也很鼓舞人心,OCIv2 鏡像格式需要滿足下列要求:
- 更少的重復(fù)數(shù)據(jù)
- 可重建的鏡像格式
- 明確的更少的文件系統(tǒng)元數(shù)據(jù)
- 可以 mount 的文件系統(tǒng)格式
- 鏡像內(nèi)容列表
- 鏡像數(shù)據(jù)按需加載
- 可擴(kuò)展性
- 可校驗和/或可修復(fù)
- 更少的上傳數(shù)據(jù)
- 可以工作在不可信存儲上
在共享文檔中可以找到每一個要求的詳細(xì)描述。我們?nèi)虆⑴c了整個 OCIv2 鏡像格式要求的討論,并發(fā)現(xiàn) Nydus 很好地滿足了全部的這些要求。這進(jìn)一步促使我們開源 Nydus 項目來為社區(qū)討論提供一個工作的代碼基礎(chǔ)。
共享文檔鏈接:https://hackmd.io/@cyphar/ociv2-brainstorm
“阿里巴巴云原生關(guān)注微服務(wù)、Serverless、容器、Service Mesh 等技術(shù)領(lǐng)域、聚焦云原生流行技術(shù)趨勢、云原生大規(guī)模的落地實踐,做最懂云原生開發(fā)者的公眾號。”
總結(jié)
以上是生活随笔為你收集整理的让容器应用管理更快更安全,Dragonfly 发布 Nydus 容器镜像加速服务的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 重磅 | 阿里开源首个 Serverle
- 下一篇: 如何通过 Serverless 技术降低