Kubernetes 作為資源排程和應用編排的開源系統,正在成為雲端計算和現代 IT 基礎架構的通用平臺。JuiceFS CSI Driver 實現了容器編排系統的儲存介面,使得使用者可以在 Kubernetes 中以原生的方式使用 JuiceFS。
由於 Kubernetes 自身的複雜性,使用者反饋在部署和使用 JuiceFS CSI Driver 時,會遇到不少疑難問題。本文將為大家介紹JuiceFS CSI Driver架構、常見問題排查思路。
JuiceFS CSI Driver 的架構如下圖,共有兩個元件:
Controller Service:以 PV id 為名在 JuiceFS 檔案系統中建立子目錄。
Node Service:建立 Mount Pod(JuiceFS 使用者端),並掛載應用 Pod。
CSI Node 的工作機制如下圖,主要將 JuiceFS 使用者端放在單獨的 pod 中執行,這樣做有如下益處:
動態建立 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。
建立 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 會自動建立。
CSI Node 負責管理 Mount Pod 的生命週期,有一些特性可以根據業務情況選擇使用。
第一,多個應用 pod 使用同一個 PVC時,共用 Mount Pod。主要的做法是:
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 映象。
對於 JuiceFS CSI Driver 的使用,有以下幾點建議:
常見錯誤有兩種:一種是 PV 建立失敗,屬於 CSI Controller 的職責;另一種是應用 Pod 建立失敗,屬於 CSI Node 和 Mount Pod 的職責。
詳細問題排查思路請存取,排查方法檔案。
關於更多 JuiceFS CSI Driver 的檔案,包括使用方法、運維管理等,可以統一存取 JuiceFS CSI Driver 檔案。
使用靜態掛載,應用宣告 PVC,指定 PV;動態設定會保證每個應用使用單獨的子目錄作為隔離,不能存取已有的資料。
2.同一個 JuiceFS 卷,如何實現掛載不同引數?
宣告不同的 PVC 和 PV/StorageClass,在 PV/StorageClass 中指定不同的掛載引數。
同一個PVC對應同一個MountPod(juicefs fuse 使用者端)的,應用 pod 中可以在 volumeMount 中定義不同的 subPath 實現掛載不同的子目錄。
juicefs format 的引數,如 trash-days、inodes、capacity 等,在 secret 的 format-options 裡設定。
使用 kubectl exec 命令進入到 Mount Pod 中, df 命令檢視掛載點,再用 juicefs warmup 命令做預熱,其中社群版的二進位制路徑為 /usr/local/bin/juicefs,商業版的二進位制路徑為 /usr/bin/juicefs。
更多問題排查案例請存取排查案例檔案。
如有幫助的話歡迎關注我們專案 Juicedata/JuiceFS 喲! (0ᴗ0✿)