JuiceFS CSI Driver v0.10 全新架構解讀

語言: CN / TW / HK

什麼是 JuiceFS

JuiceFS 是一款面向雲環境設計的高效能共享檔案系統,提供完備的 POSIX 相容性,可將海量低價的雲端儲存作為本地磁碟使用,亦可同時被多臺主機同時掛載讀寫。

隨著雲原生的普及,越來越多的使用者都會將自己的應用遷移到 Kubernetes 容器平臺中。在 Kubernetes 容器平臺中,儲存是支撐使用者應用的基石。為了更好地服務雲原生應用,JuiceFS 開發了 CSI 外掛驅動,方便雲原生環境中的應用通過 Persistent Volume 來使用 JuiceFS。

目前,大多數使用者會在 Kubernetes 中使用 JuiceFS 的靜態或動態 PV 掛載。

遇到的挑戰:CSI Driver 無法平滑升級

然而,CSI 對使用者態檔案系統來說,存在設計上難以逾越的挑戰,很難在 Kubernetes 中管理使用者態的程序。CSI 提供的介面只涉及了掛載及解除安裝等,而使用者態檔案系統需要在掛載檔案的同時,啟動一個使用者態的 daemon 程序,用來和核心模組 FUSE 通訊。

JuiceFS CSI Driver 在掛載檔案時,直接在容器內啟動 daemon 程序,即將 daemon 程序的生命週期與 CSI Driver 關聯。這就造成了 CSI Driver 容器無法平滑升級,一旦容器停止服務,業務應用的掛載點將隨之受到影響。

而目前的升級方法是,將所有使用 JuiceFS Volume 的應用重啟或直接刪除 pod 等待重建。這對於雲上應用來說,在一定程度上影響了其可靠性,因此我們需要探索出一種更平滑的升級策略。

CSI Driver 架構升級

目前業界還沒有能夠很好地解決該問題的方法。比較流行的解決方法是直接將 daemon 程序掛載在宿主機中,掛在宿主機的 1 號程序下,由 init 程序來管理其生命週期。然而這脫離了 Kubernetes 的管控,且可觀測性較差,比如當應用使用 volume 被 hang 住時,使用者無法直接在 Kubernetes 叢集中觀測到程序情況,需要登陸到宿主機檢視。

本次 JuiceFS CSI Driver 採用了全新的方式來解決這個問題,架構圖如下:

將 JuiceFS 客戶端與 CSI Driver 分離,JuiceFS 客戶端單獨運行於 pod 中,CSI Driver node 通過 watch ApiServer 的方式管理其生命週期。

當多個 pod 共用 PV 時,不會新建 mount pod,而是在 mount pod 中記錄使用的目標掛載路徑。當使用該 PV 的 pod 被刪除時,node service 會在 umount 前判斷當前 mount pod 的使用者是否為最後一個,如果是最後一個,則將 mount pod 刪除;如果不是最後一個,則刪除其對應的 reference。

架構升級帶來的收益

首先,將 JuiceFS 客戶端單獨運行於 pod 內,這更好地適應了 Kubernetes 生態,保證其在 Kubernetes 的管控內。

其次,和以往單獨的程序相比,使用者可以直接在叢集中觀察到 pod,可觀測性強。

並且,每個業務應用的客戶端相互隔離,隔離性更強;同時針對單個業務應用,使用者也可以設定客戶端的資源配額,更好地保證優先順序更高的應用對應的客戶端分配到的資源配額更足。

上手使用

新版 CSI Driver 的使用方式與 v0.9.0 一致,具體可以檢視:

文件:https://github.com/juicedata/juicefs-csi-driver#example-links

唯一有變化的是使用者可以在 StorageClassPersistentVolume 中申明自己的應用的 JuiceFS 客戶端的資源配額,詳情見:

文件:https://github.com/juicedata/juicefs-csi-driver/blob/master/examples/static-provisioning-mount-resources/README.md

本次架構升級後,未來 JuiceFS CSI Driver 版本升級將不會再影響已在使用 JuiceFS 的應用。但從 v0.9.0 向 v0.10.0 版本升級時,需要先將業務應用停掉,我們提供了相對平穩的升級方法,詳情見:

升級文件:https://github.com/juicedata/juicefs-csi-driver/blob/master/docs/upgrade-csi-driver.md

寫在最後

本次釋出的 JuiceFS CSI Driver 成功解決了使用者態檔案系統普遍存在的 CSI Driver 難以平滑升級的問題,進一步降低了運維工作對應用的影響。而對於使用者態檔案系統來說,容器環境的 daemon 程序如何保證其高可用性依然是個很大的挑戰。

JuiceFS 正在持續研討相關問題,探索更多可能的解決方案,歡迎訪問 JuiceFS GitHub 關注專案進展:

https://github.com/juicedata/juicefs-csi-driver

:point_down: 掃碼加群 大咖都在 :point_down: