本文發表於一年多前。舊文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。

為 Kubernetes 引入 Windows CSI 支援 Alpha

用於 Windows 的 CSI 代理的 Alpha 版本將隨 Kubernetes 1.18 釋出。CSI 代理透過允許 Windows 中的容器執行特權儲存操作來啟用 Windows 上的 CSI 驅動程式。

背景

Kubernetes 的容器儲存介面 (CSI) 在 Kubernetes 1.13 版本中達到 GA。CSI 已成為將塊和檔案儲存公開給 Kubernetes 等容器編排系統 (CO) 上容器化工作負載的標準。它使第三方儲存提供商能夠編寫和部署外掛,而無需修改核心 Kubernetes 程式碼庫。所有新的儲存功能都將利用 CSI,因此讓 CSI 驅動程式在 Windows 上工作至關重要。

Kubernetes 中的 CSI 驅動程式有兩個主要元件:控制器外掛和節點外掛。控制器外掛通常不需要直接訪問主機,可以透過 Kubernetes API 和外部控制平面服務(例如雲儲存服務)執行所有操作。然而,節點外掛需要直接訪問主機,以便將塊裝置和/或檔案系統提供給 Kubernetes kubelet。這在以前對於 Windows 上的容器是不可能實現的。隨著 CSI 代理的釋出,CSI 驅動程式現在可以在節點上執行儲存操作。這反過來又使容器化的 CSI 驅動程式能夠在 Windows 上執行。

對 Windows 叢集的 CSI 支援

CSI 驅動程式(例如 AzureDisk、GCE PD 等)建議部署為容器。CSI 驅動程式的節點外掛通常在叢集中的每個工作節點上執行(作為 DaemonSet)。節點外掛容器需要以提升的許可權執行才能執行與儲存相關的操作。但是,Windows 目前不支援特權容器。為了解決這個問題,CSI 代理使得節點外掛現在可以作為非特權 Pod 部署,然後使用代理在節點上執行特權儲存操作。

節點外掛與 CSI 代理的互動

CSI 代理的設計已在此 KEP 中捕獲。下圖描述了與 CSI 節點外掛和 CSI 代理的互動。

CSI 代理作為程序直接在每個 Windows 節點上的主機上執行——與 kubelet 非常相似。kubelet 中的 CSI 程式碼與節點驅動註冊器元件和 CSI 節點外掛進行互動。節點驅動註冊器是一個社群維護的 CSI 專案,負責註冊特定於供應商的節點外掛。kubelet 啟動 CSI gRPC 呼叫,例如圖中描述的節點外掛上的 NodeStageVolume/NodePublishVolume。節點外掛與 CSI 代理程序介面以執行本地主機作業系統儲存相關操作,例如卷的建立/列舉、掛載/解除安裝等。

CSI 代理架構和實現

在 Alpha 版本中,CSI 代理支援以下 API 組:

  1. 檔案系統
  2. 磁碟
  3. SMB

CSI 代理透過 Windows 命名管道公開每個 API 組。通訊透過這些管道使用 gRPC 執行。CSI 代理專案的客戶端庫使用這些管道與 CSI 代理 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 代理之間為新卷提供儲存的互動。在節點外掛收到 CSI RPC 呼叫後,它會相應地向 CSI 代理發出一些呼叫。NodeStageVolume 呼叫後,首先使用磁碟 API 呼叫之一(AzureDisk 驅動程式中的 ListDiskLocations 或 GCE PD 驅動程式中的 GetDiskNumberByName)識別所需磁碟。如果磁碟未分割槽,則呼叫 PartitionDisk(磁碟 API 組)。隨後,呼叫 ListVolumesOnDisk、FormatVolume 和 MountVolume 等卷 API 呼叫來執行其餘所需操作。在 NodeUnstageVolume、NodePublishVolume、NodeUnpublishedVolume 等情況下執行類似操作。

當前支援

CSI 代理現已推出 Alpha 版本。您可以在 CSI 代理 GitHub 儲存庫中找到更多詳細資訊。目前有兩個雲提供商為 Windows 上的 CSI 驅動程式提供 Alpha 支援:Azure 和 GCE。

未來計劃

Beta 版的一個主要重點領域將是基於 Windows 的構建和 CI/CD 設定,以提高程式碼庫的穩定性和質量。另一個領域是直接使用基於 Go 的呼叫而不是 PowerShell cmdlet 來提高效能。增強可除錯性並新增更多測試是團隊將關注的其他領域。

如何參與?

和所有 Kubernetes 專案一樣,這個專案也是來自不同背景的眾多貢獻者共同努力的成果。那些有興趣參與 CSI 代理設計和開發或 Kubernetes 儲存系統任何部分的人,可以加入 Kubernetes 儲存特別興趣小組 (SIG)。我們正在快速發展,並始終歡迎新的貢獻者。

對於那些對更多細節感興趣的人,CSIProxy GitHub 儲存庫是一個很好的起點。此外,kubernetes slack 上的 #csi-windows 頻道可用於討論 Windows 上的 CSI 特定問題。

致謝

我們要感謝 Michelle Au 在整個 Alpha 之旅中給予我們的指導。我們要感謝 Jean Rougé 在 CSI 代理初期工作中的貢獻。我們要感謝 Saad Ali 在專案方面提供的所有指導以及對本部落格草稿的評論/反饋。我們要感謝 Patrick Lang 和 Mark Rossetti 在 Windows 特定問題和細節方面的幫助。特別感謝 Andy Zhang 在 Azuredisk 和 Azurefile 工作方面的評論和指導。非常感謝 Paul Burt 和 Karen Chu 對本部落格文章的評論和改進建議。

最後但並非最不重要,我們要感謝在專案每個階段都做出貢獻的廣大 Kubernetes 社群。