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: