近期釋出的 JuiceFS CSI Driver v0.18 版本中,我們提供了一種全新的方式存取檔案系統,即 JuiceFS 使用者端以 Sidecar 方式執行於應用 Pod 中,且使用者端與應用同生命週期。
這個全新的功能將幫助使用者在 Serverless Kubernetes 環境中使用 JuiceFS;與傳統的 Mount Pod 模式相比,問題排查更方便、使用者端管理更簡單。
今天在這篇文章中,將為大家介紹 Sidecar 模式的工作原理以及應用場景, 另外在文末還附上了使用者關心的問題與解答。
What is a sidecar in cloud?
Sidecar 是一種常見的設計模式,這個概念在容器和微服務的領域中非常流行。回到 sidecar 的字面意思,如下圖所示,就是指摩托車邊上安裝的這個小車,以增加摩托車的承載能力,它非常形象地表達了Sidecar 容器和應用容器的關係。在雲環境中,他們成為一體,共用 Kubernetes pod 的環境,並且同一 pod 內的所有容器生命週期一致。
• Pod:可以在 Kubernetes 中建立和管理的、最小的可部署的計算單元
• Deployment / DaemonSet / StatefulSet / Job:宣告式資源,對 Pod 的不同管理方式
• PV(PersistentVolume):叢集中的一塊儲存
• PVC(PersistentVolumeClaim):表達的是使用者對儲存的請求
• StorageClass:為管理員提供了描述儲存 "類" 的方法
• CSI(Container Storage Interface):容器儲存介面
儲存的管理是一個與計算範例的管理完全不同的問題。PV 表示的是叢集中的一塊儲存,可以由管理員事先建立;或者使用 StorageClass 來動態建立,然後使用者在 Pod 中通過指定 PVC 來使用。根據 PV 的建立方式,可以分為靜態設定和動態設定兩種使用方式,下面一一介紹。
靜態設定
由系統管理員建立若干 PV,在 PV 中宣告包含了 JuiceFS 系統引數的 Secret,以備使用者使用。使用者建立 PVC,宣告使用具體的 PV,在應用 Pod 中設定使用 PVC 即可。
資源間的關係如下圖所示:
靜態設定每一個應用使用都需要系統管理員對應建立一個 PV,在簡單測試場景或者應用間資料共用時使用比較廣泛。
動態設定
由系統管理員建立 StorageClass,在 StorageClass 中宣告包含了 JuiceFS 系統引數的 Secret;然後使用者建立 PVC,宣告使用具體的 StorageClass,PVC 建立之後,Kubernetes 會根據 StorageClass 自動建立出一個 PV 與 PVC 進行繫結,最後使用者在應用 Pod 中設定使用 PVC。
資源間的關係如下圖所示:
使用者通過在 PV / StorageClass 中指定 JuiceFS 的引數,進而在叢集中使用 JuiceFS。JuiceFS CSI Driver 則負責掛載 JuiceFS 檔案系統。
JuiceFS CSI Driver 提供了兩種方式掛載檔案系統,一種是現有的 Mount Pod 模式,另一種則是本次釋出的版本中提供的 Sidecar 容器的方式。下面一一介紹兩種模式以及二者的對比。
元件
Mount Pod 模式涉及到的元件包括 CSI Controller Service 和 CSI Node Service,職責分別為:
• Controller Service:以 PV id 為名,在 JuiceFS 檔案系統中建立子目錄。
• Node Service:建立 Mount Pod(JuiceFS 使用者端),並掛載應用 Pod。下文會詳細介紹其工作機制。
這種模式對環境的要求:
• 可以使用 FUSE 裝置,在容器中體現為需要特權(Privilege);
• 可以執行 DaemonSet ,預設每臺機器上都需要執行一個 CSI Node pod。
工作原理
CSI Node Service 的工作機制如下圖所示:
PVC 與 Mount Pod 的關係
PVC、PV 和 Pod 的關係可以用下圖表示,即在同一個節點上,一個 PVC 會對應一個 Mount Pod。
元件
JuiceFS FUSE 使用者端以 sidecar 容器的方式與應用容器一起執行在同一個 Pod 中。
CSI Driver 元件只有 CSI Controller Service。其職責為:
工作原理
工作機制如下圖所示:
PVC 與 Sidecar 的關係
PVC、PV 和 Pod 的關係可以用下圖表示,即每個應用 pod 單獨擁有自己的 JuiceFS 使用者端,應用的掛載點相互隔離。
這種模式下,對環境的要求是可以使用 FUSE 裝置,在容器中體現為需要特權(Privilege)容器。
Sidecar 容器的資源請求預設為 1 CPU 和 1GiB 記憶體,資源約束預設為 2 CPU 和 5GiB 記憶體。當叢集資源緊俏時,我們還可以在 PV/StorageClass 中對 Sidecar 容器的使用資源進行設定。
另外,Sidecar 容器和應用容器的掛載點共用是通過 HostPath 實現的,不是直接共用,所以當 Sidecar 容器發生意外重啟後,應用容器中的掛載點不會自行恢復,需要整個 Pod 重新建立。
Sidecar 模式:
• 優勢:故障排查簡單;所有環境都可用;
• 缺點:資源開銷大,每個應用 Pod 獨享 JuiceFS 使用者端;
• 使用場景:Serverless Kubernetes 環境(可以使用 FUSE);應用任務量不大的標準 Kubernetes 環境。
Mount Pod 模式:
• 優勢:資源開銷小,使用相同 PVC 的所用應用 Pod 共用同一個 JuiceFS 使用者端;
• 缺點:故障排查複雜;Serverless 環境不可用。
• 使用場景:應用任務較多、標準的 Kubernetes 環境。