本文章已發布超過一年。較舊的文章可能包含過時的內容。請確認本頁面中的資訊自發布以來是否已變得不正確。
Kubernetes 隆重介紹 Windows CSI 支援 Alpha 版
適用於 Windows 的 CSI Proxy alpha 版本隨著 Kubernetes 1.18 一起發布。CSI proxy 透過允許 Windows 中的容器執行特權儲存操作,在 Windows 上啟用 CSI 驅動程式。
背景
Kubernetes 的容器儲存介面 (CSI) 在 Kubernetes 1.13 版本中正式發布 (GA)。CSI 已成為在容器編排系統 (CO) (如 Kubernetes) 上,將區塊和檔案儲存空間公開給容器化工作負載的標準。它使第三方儲存供應商能夠編寫和部署外掛程式,而無需修改核心 Kubernetes 程式碼庫。所有新的儲存功能都將使用 CSI,因此讓 CSI 驅動程式在 Windows 上運作非常重要。
Kubernetes 中的 CSI 驅動程式有兩個主要組件:控制器外掛程式和節點外掛程式。控制器外掛程式通常不需要直接存取主機,並且可以透過 Kubernetes API 和外部控制平面服務 (例如雲端儲存服務) 執行其所有操作。然而,節點外掛程式需要直接存取主機,才能使區塊裝置和/或檔案系統可供 Kubernetes kubelet 使用。這在以前對於 Windows 上的容器來說是不可能的。隨著 CSIProxy 的發布,CSI 驅動程式現在可以在節點上執行儲存操作。這反過來使容器化的 CSI 驅動程式能夠在 Windows 上運行。
Windows 叢集的 CSI 支援
建議將 CSI 驅動程式 (例如 AzureDisk、GCE PD 等) 部署為容器。CSI 驅動程式的節點外掛程式通常在叢集中的每個工作節點上運行 (作為 DaemonSet)。節點外掛程式容器需要以提升的權限運行,才能執行與儲存相關的操作。然而,Windows 目前不支援特權容器。為了解決這個問題,CSIProxy 使節點外掛程式現在可以部署為非特權 Pod,然後使用代理程式在節點上執行特權儲存操作。
節點外掛程式與 CSIProxy 的互動
CSI proxy 的設計已記錄在 KEP 中。下圖描述了 CSI 節點外掛程式和 CSI proxy 的互動。
CSI proxy 作為一個程序直接在每個 Windows 節點的主機上運行 - 非常類似於 kubelet。kubelet 中的 CSI 程式碼與 節點驅動程式註冊器 組件和 CSI 節點外掛程式互動。節點驅動程式註冊器是一個社群維護的 CSI 專案,負責處理供應商特定節點外掛程式的註冊。kubelet 在節點外掛程式上啟動 CSI gRPC 呼叫,例如 NodeStageVolume/NodePublishVolume,如圖所示。節點外掛程式與 CSIProxy 程序介面,以執行本機主機作業系統儲存相關操作,例如建立/列舉磁碟區、掛載/卸載等。
CSI proxy 架構與實作
在 alpha 版本中,CSIProxy 支援以下 API 群組
- 檔案系統
- 磁碟
- 磁碟區
- SMB
CSI proxy 透過 Windows 具名管道公開每個 API 群組。通訊是使用 gRPC 透過這些管道執行的。CSI proxy 專案中的用戶端程式庫使用這些管道與 CSI proxy API 互動。例如,檔案系統 API 是透過類似 \\.\pipe\csi-proxy-filesystem-v1alpha1
的管道公開,而磁碟區 API 則在 \\.\pipe\csi-proxy-volume-v1alpha1
下公開,依此類推。
從每個 API 群組服務,呼叫都會路由到主機 API 層。主機 API 透過 Powershell 或 Go 標準程式庫呼叫進入主機 Windows 作業系統。例如,當呼叫檔案系統 API Rmdir 時,API 群組服務將解碼 grpc 結構 RmdirRequest,並找到要移除的目錄,然後呼叫進入主機 API 層。這將導致呼叫 os.Remove,一個 Go 標準程式庫呼叫,以執行移除操作。
控制流程詳細資訊
下圖使用 CSI 呼叫 NodeStageVolume 作為範例,來說明 kubelet、CSI 外掛程式和 CSI proxy 之間在佈建全新磁碟區時的互動。在節點外掛程式收到 CSI RPC 呼叫後,它會相應地對 CSIproxy 進行一些呼叫。作為 NodeStageVolume 呼叫的結果,首先使用磁碟 API 呼叫之一來識別所需的磁碟:ListDiskLocations (在 AzureDisk 驅動程式中) 或 GetDiskNumberByName (在 GCE PD 驅動程式中)。如果磁碟未分割,則會呼叫 PartitionDisk (磁碟 API 群組)。隨後,會呼叫磁碟區 API 呼叫,例如 ListVolumesOnDisk、FormatVolume 和 MountVolume,以執行其餘的必要操作。在 NodeUnstageVolume、NodePublishVolume、NodeUnpublishedVolume 等情況下,也會執行類似的操作。
目前支援
CSI proxy 現在以 alpha 版本提供。您可以在 CSIProxy GitHub 儲存庫中找到更多詳細資訊。目前有兩家雲端供應商為 Windows 上的 CSI 驅動程式提供 alpha 支援:Azure 和 GCE。
未來計畫
beta 版本的一個主要重點領域將是基於 Windows 的建置和 CI/CD 設定,以提高程式碼庫的穩定性和品質。另一個領域是直接使用基於 Go 的呼叫而不是 Powershell Cmdlet 來提高效能。增強可除錯性和新增更多測試是團隊將研究的其他領域。
如何參與?
這個專案與所有 Kubernetes 專案一樣,是來自不同背景的許多貢獻者共同努力的成果。有興趣參與 CSI Proxy 或 Kubernetes 儲存系統任何部分的設計和開發的人員,可以加入 Kubernetes 儲存特殊興趣小組 (SIG)。我們正在快速成長,並且隨時歡迎新的貢獻者。
對於那些有興趣了解更多詳細資訊的人,CSIProxy GitHub 儲存庫是一個很好的起點。此外,kubernetes slack 上的 #csi-windows 頻道可用於討論特定於 Windows 上 CSI 的問題。
誌謝
我們要感謝 Michelle Au 在我們 alpha 版本開發歷程中的指導。我們要感謝 Jean Rougé 在最初的 CSI proxy 工作中的貢獻。我們要感謝 Saad Ali 在專案方面的所有指導,以及對本部落格草稿的審閱/回饋。我們要感謝 Patrick Lang 和 Mark Rossetti 協助我們解決 Windows specific 的問題和細節。特別感謝 Andy Zhang 對 Azuredisk 和 Azurefile 工作的審閱和指導。非常感謝 Paul Burt 和 Karen Chu 對本部落格文章的審閱和改進建議。
最後但同樣重要的是,我們要感謝在專案的每個階段都做出貢獻的更廣泛的 Kubernetes 社群。