Kubernetes 作為資源排程和應用編排的開源系統,正在成為雲端計算和現代 IT 基礎架構的通用平臺。JuiceFS CSI Driver 實現了容器編排系統的儲存介面,使得使用者可以在 Kubernetes 中以原生的方式使用 JuiceFS。
由於 Kubernetes 自身的複雜性,使用者反饋在部署和使用 JuiceFS CSI Driver 時,會遇到不少疑難問題。本文將為大家介紹JuiceFS CSI Driver架構、常見問題排查思路。
1. JuiceFS CSI Driver 架構介紹
元件
JuiceFS CSI Driver 的架構如下圖,共有兩個元件:
Controller Service:以 PV id 為名在 JuiceFS 檔案系統中建立子目錄。
Node Service:建立 Mount Pod(JuiceFS 客戶端),並掛載應用 Pod。
CSI Node 的工作機制如下圖,主要將 JuiceFS 客戶端放在單獨的 pod 中執行,這樣做有如下益處:
- 多個 Pod 共用 PV 時,不會新建 Mount Pod,而是對已有的 Mount Pod 做引用計數,計數歸零時刪除 Mount Pod。
- CSI 驅動元件與客戶端解耦,方便 CSI 驅動自身的升級。
建立 PV 和使用的流程
動態建立 PV(不使用 StorageClass 的跳過此步驟):
-
使用者建立 PVC ,使用 JuiceFS 作為 StorageClass;
-
CSI Controller 負責在 JuiceFS 檔案系統中做初始化,預設以 PV ID 為名字建立子目錄,同時建立對應的 PV;
-
Kubernetes (PV Controller 元件) 將上述使用者建立的 PVC 與 CSI Controller 建立的 PV 進行繫結,此時 PVC 與 PV 的狀態變為「Bound」;
Pod 中使用 PVC: -
使用者建立應用 Pod,Pod 中宣告使用先前建立的 PVC;
-
CSI Node Service 負責在應用 Pod 所在節點建立 Mount Pod;
-
Mount Pod 啟動,執行 JuiceFS 客戶端掛載,執行 JuiceFS 客戶端,掛載路徑暴露在宿主機上,路徑為
/var/lib/juicefs/volume/[pv-name]
; -
CSI Node Service 等待 Mount Pod 啟動成功後,將 PV 對應的 JuiceFS 子目錄 bind 到容器內,路徑為其宣告的 VolumeMount 路徑;
-
Kubelet 建立應用 Pod。
PVC - PV - MountPod 的關係可以用下圖表示,在同一個節點上,一個 PVC 會對應一個 Mount Pod。
2. 動態配置和靜態配置使用示範
建立 Secret:
apiVersion: v1
kind: Secret
metadata:
name: juicefs-secret
type: Opaque
stringData:
name: <JUICEFS_NAME>
metaurl: <META_URL>
storage: s3
bucket: https://<BUCKET>.s3.<REGION>.amazonaws.com
access-key: <ACCESS_KEY>
secret-key: <SECRET_KEY>
靜態配置
在應用 YAML 中申明 PVC,同時 PVC 指定 PV。
動態配置
在應用 YAML 中申明 PVC,同時 PVC 指定 StorageClass,PV 會自動建立。
3. Mount Pod 的管理
CSI Node 負責管理 Mount Pod 的生命週期,有一些特性可以根據業務情況選擇使用。
第一,多個應用 pod 使用同一個 PVC時,共用 Mount Pod。主要的做法是:
- Mount Pod 的 annotation 中記錄了應用的掛載路徑,作為引用計數
- CSI 在後臺檢查其記錄掛載的應用是否存活,當沒有應用引用時,對其進行回收
第二,Mount Pod 意外退出後,CSI 自動拉起,並恢復容器內的掛載點。該特性需要使用者在應用端開啟HostToContainer
或Bidirectional
。並且,在掛載點損壞前開啟的檔案不能恢復,需要使用者側做好重試。
第三,可以設定 Mount Pod 的資源請求及限制(CPU/Memory requests & limit
)。
第四,Mount Pod 延遲退出,所有的應用都退出後,Mount Pod 延後退出。主要的使用場景數大量應用使用同一 PVC,且應用會頻繁建立刪除。
第五,Mount Pod 退出時清理快取。預設情況下,Mount Pod 使用的快取會留在宿主機上,且退出後不會清理;開啟這個功能後,CSI 在回收 Mount Pod 時,會啟動一個 job,清理宿主機上的快取。
第六,設定 Mount Pod 所使用的快取路徑。預設情況快取使用的是本地磁碟;也可以使用獨立 PVC 作為快取路徑。
第七,設定 Mount Pod 的映象。首先,CSI Node 的環境變數設定預設的 Mount 映象;也可以在 PV/StorageClass
中設定特定的 Mount 映象。
4. CSI 使用建議
對於 JuiceFS CSI Driver 的使用,有以下幾點建議:
- 開啟 Mount pod 的監控,可以實時檢視當前叢集的使用負載、快取、I/O 等情況;
- 收集 Mount pod 的日誌,利於故障排查;
- 開啟掛載點自動恢復功能,提高可用性;
- 不要在 CSI 環境中使用 writeback 引數,writeback 需要有至少有一個客戶端非同步將資料上傳到物件儲存中,Mount Pod 與應用同生命週期,不會一直存在,有丟資料的風險。
5.問題排錯思路
常見錯誤有兩種:一種是 PV 建立失敗,屬於 CSI Controller 的職責;另一種是應用 Pod 建立失敗,屬於 CSI Node 和 Mount Pod 的職責。
詳細問題排查思路請訪問,排查方法文件。
關於更多 JuiceFS CSI Driver 的文件,包括使用方法、運維管理等,可以統一訪問 JuiceFS CSI Driver 文件。
一些關於 CSI 的 Q&A
- 如何掛載已經存在的 JuicFS 資料?
使用靜態掛載,應用宣告 PVC,指定 PV;動態配置會保證每個應用使用單獨的子目錄作為隔離,不能訪問已有的資料。
2.同一個 JuiceFS 卷,如何實現掛載不同引數?
宣告不同的 PVC 和 PV/StorageClass,在 PV/StorageClass 中指定不同的掛載引數。
- 同一個 PVC,多個 pod 如何實現不同子目錄掛載?
同一個PVC對應同一個MountPod(juicefs fuse 客戶端)的,應用 pod 中可以在 volumeMount 中定義不同的 subPath 實現掛載不同的子目錄。
- “trash-days”等配置引數如何設定?
juicefs format 的引數,如 trash-days、inodes、capacity 等,在 secret 的 format-options 裡設定。
- 如何在 CSI 環境中做快取預熱?
使用 kubectl exec 命令進入到 Mount Pod 中, df 命令檢視掛載點,再用 juicefs warmup 命令做預熱,其中社群版的二進位制路徑為 /usr/local/bin/juicefs,商業版的二進位制路徑為 /usr/bin/juicefs。
更多問題排查案例請訪問排查案例文件。
如有幫助的話歡迎關注我們專案 Juicedata/JuiceFS 喲! (0ᴗ0✿)