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

Kubernetes 1.23:Kubernetes 樹內到 CSI 卷遷移狀態更新

Kubernetes 樹記憶體儲外掛到容器儲存介面 (CSI) 遷移基礎設施自 v1.17 版本以來已進入Beta 階段。CSI 遷移功能在 Kubernetes v1.14 中作為 Alpha 版本引入。

自那時起,SIG Storage 和其他 Kubernetes 專項小組一直在努力確保功能穩定性和相容性,為 GA 做準備。本文旨在提供該功能的最新狀態以及 Kubernetes 1.17 到 1.23 之間的變化。此外,我還將介紹每個儲存外掛 CSI 遷移功能 GA 的未來路線圖。

快速回顧:什麼是 CSI 遷移,為什麼要遷移?

容器儲存介面 (CSI) 旨在幫助 Kubernetes 替換其現有的樹記憶體儲驅動機制——特別是特定於供應商的外掛。Kubernetes 對容器儲存介面的支援自 Kubernetes v1.13 以來已經普遍可用。引入 CSI 驅動程式支援是為了更容易地在 Kubernetes 和儲存後端技術之間新增和維護新的整合。使用 CSI 驅動程式可以帶來更好的可維護性(驅動程式作者可以定義自己的釋出週期和支援生命週期)並減少漏洞發生的機會(樹內程式碼越少,出錯的風險就越小,並且叢集操作員可以選擇叢集所需的儲存驅動程式)。

隨著更多 CSI 驅動程式的建立並投入生產使用,SIG Storage 組希望所有 Kubernetes 使用者都能從 CSI 模型中受益。然而,我們不能破壞與現有儲存 API 型別的 API 相容性。我們提出的解決方案是 CSI 遷移:一個將樹內 API 轉換為等效 CSI API 並將操作委託給替代 CSI 驅動程式的功能。

CSI 遷移工作支援將現有的樹記憶體儲外掛(如 kubernetes.io/gce-pdkubernetes.io/aws-ebs)替換為儲存後端的相應 CSI 驅動程式。如果 CSI 遷移正常工作,Kubernetes 終端使用者應該不會注意到任何差異。現有的 StorageClassPersistentVolumePersistentVolumeClaim 物件應繼續工作。當 Kubernetes 叢集管理員更新叢集以啟用 CSI 遷移時,利用由樹記憶體儲外掛支援的 PVC 的現有工作負載將繼續像以前一樣執行。然而,在幕後,Kubernetes 將所有儲存管理操作(以前針對樹內驅動程式)的控制權交給 CSI 驅動程式。

例如,假設您是 kubernetes.io/gce-pd 使用者,在 CSI 遷移之後,您仍然可以使用 kubernetes.io/gce-pd 來配置新卷、掛載現有 GCE-PD 卷或刪除現有卷。所有現有 API/介面仍將正常執行。然而,底層函式呼叫都透過 GCE PD CSI 驅動程式,而不是樹內 Kubernetes 函式。

這使得終端使用者能夠順利過渡。此外,作為儲存外掛開發人員,我們可以減輕維護樹記憶體儲外掛的負擔,並最終將它們從核心 Kubernetes 二進位制檔案中移除。

有什麼變化,有什麼新功能?

在 Kubernetes v1.17 及更早版本的工作基礎上,自那以後釋出的版本進行了一系列更改

新功能門

Kubernetes v1.21 版本廢棄了 CSIMigration{provider}Complete 功能標誌,並停止對其進行處理。取而代之的是新的功能標誌 InTreePlugin{vendor}Unregister,它取代了舊的功能標誌並保留了 CSIMigration{provider}Complete 提供的所有功能。

CSIMigration{provider}Complete 之前作為 CSI 遷移在所有節點上啟用後的補充功能門引入。此標誌登出您使用標誌名稱的 {provider} 部分指定的樹記憶體儲外掛。

當您啟用該功能門時,您的叢集將直接選擇並使用相關的 CSI 驅動程式,而不是使用樹內驅動程式程式碼。這發生在不檢查 CSI 遷移是否在節點上啟用或您是否實際部署了該 CSI 驅動程式的情況下。

雖然這個功能門是一個很好的幫手,但 SIG Storage(我敢肯定,還有許多叢集操作員)也希望有一個功能門,讓您可以在不啟用 CSI 遷移的情況下停用樹記憶體儲外掛。例如,您可能希望在 GCE 叢集上停用 EBS 儲存外掛,因為 EBS 卷是特定於不同供應商的雲(AWS)。

為了實現這一點,Kubernetes v1.21 引入了一組新的功能標誌:InTreePlugin{vendor}Unregister

InTreePlugin{vendor}Unregister 是一個獨立的功能門,可以獨立於 CSI 遷移啟用和停用。啟用後,元件不會將特定的樹記憶體儲外掛註冊到支援列表中。如果叢集操作員只啟用此標誌,當使用該外掛時,終端使用者將收到 PVC 錯誤,指出無法找到該外掛。如果叢集操作員不希望支援舊的樹內 API,而只希望在未來支援 CSI,則無論 CSI 遷移是否啟用,都可能希望啟用此功能。

可觀測性

Kubernetes v1.21 引入了用於跟蹤 CSI 遷移的指標。您可以使用這些指標來觀察您的叢集如何使用儲存服務,以及對該儲存的訪問是使用舊的樹內驅動程式還是其基於 CSI 的替代方案。

元件指標備註
Kube-Controller-Managerstorage_operation_duration_seconds指標中添加了一個新標籤 migrated,用於指示此儲存操作是否為 CSI 遷移操作(true 表示已啟用,false 表示未啟用)。
Kubeletcsi_operations_seconds新指標公開了包括 driver_namemethod_namegrpc_status_codemigrated 在內的標籤。這些標籤的含義與 csi_sidecar_operations_seconds 相同。
CSI 邊車(provisioner、attacher、resizer)csi_sidecar_operations_seconds指標中添加了一個新標籤 migrated,用於指示此儲存操作是否為 CSI 遷移操作(true 表示已啟用,false 表示未啟用)。

錯誤修復和功能改進

在 Beta 測試人員的幫助下,我們修復了許多錯誤,例如懸空附件、垃圾回收和不正確的拓撲標籤。

雲提供商和叢集生命週期協作

SIG Storage 一直與 SIG Cloud Provider 和 SIG Cluster Lifecycle 密切合作,以推出 CSI 遷移。

如果您是託管 Kubernetes 服務的使用者,請諮詢您的提供商是否需要採取任何措施。在許多情況下,提供商將管理遷移,不需要額外的工作。

如果您使用 Kubernetes 發行版,請查閱其官方文件,瞭解有關此功能支援的資訊。對於 CSI 遷移功能畢業到 GA,SIG Storage 和 SIG Cluster Lifecycle 正在合作,以便在 Kubernetes 本身可用時,儘快在工具(例如 kubeadm)中提供遷移機制。

時間表/狀態如何?

下表顯示了每個驅動程式的當前和目標釋出版本

驅動程式AlphaBeta(樹內已棄用)測試版 (預設啟用)GA目標“樹內外掛”移除版本
AWS EBS1.141.171.231.24 (目標)1.26 (目標)
GCE PD1.141.171.231.24 (目標)1.26 (目標)
OpenStack Cinder1.141.181.211.24 (目標)1.26 (目標)
Azure Disk1.151.191.231.24 (目標)1.26 (目標)
Azure File1.151.211.24 (目標)1.25 (目標)1.27 (目標)
vSphere1.181.191.24 (目標)1.25 (目標)1.27 (目標)
Ceph RBD1.23
Portworx1.23

以下儲存驅動程式將不支援 CSI 遷移。ScaleIO 驅動程式已被移除;其他驅動程式已被棄用並將從核心 Kubernetes 中移除。

驅動程式已棄用程式碼移除
ScaleIO1.161.22
Flocker1.221.25 (目標)
Quobyte1.221.25 (目標)
StorageOS1.221.25 (目標)

接下來是什麼?

隨著更多 CSI 驅動程式畢業到 GA,我們希望很快將整個 CSI 遷移功能標記為 GA。我們預計雲提供商的樹記憶體儲外掛程式碼將在 Kubernetes v1.26 和 v1.27 之前移除。

作為使用者,我應該怎麼做?

請注意,Kubernetes 儲存系統的所有新功能(例如卷快照)將僅新增到 CSI 介面。因此,如果您正在啟動一個新叢集、首次建立有狀態應用程式或需要這些新功能,我們建議原生使用 CSI 驅動程式(而不是樹內卷外掛 API)。請遵循 更新的 CSI 驅動程式使用者指南 並使用新的 CSI API。

然而,如果您選擇升級叢集或繼續使用帶有傳統卷 API 的規範,CSI 遷移將確保我們繼續使用新的 CSI 驅動程式支援這些部署。但是,如果您想利用快照等新功能,則需要手動遷移才能將現有樹內 PV 重新匯入為 CSI PV。

我如何參與?

Kubernetes Slack 頻道 #csi-migration 以及任何標準 SIG Storage 通訊渠道 都是聯絡 SIG Storage 和遷移工作組團隊的絕佳方式。

這個專案,和所有 Kubernetes 專案一樣,是來自不同背景的許多貢獻者共同努力的成果。我們非常感謝這些季度以來幫助推動專案前進的貢獻者

  • Michelle Au (msau42)
  • Jan Šafránek (jsafrane)
  • Hemant Kumar (gnufied)

特別感謝以下人員對 CSI 遷移功能的富有見地的審查、周密的考慮和寶貴的貢獻

  • Andy Zhang (andyzhangz)
  • Divyen Patel (divyenpatel)
  • Deep Debroy (ddebroy)
  • Humble Devassy Chirammal (humblec)
  • Jing Xu (jingxu97)
  • Jordan Liggitt (liggitt)
  • Matthew Cary (mattcary)
  • Matthew Wong (wongma7)
  • Neha Arora (nearora-msft)
  • Oksana Naumov (trierra)
  • Saad Ali (saad-ali)
  • Tim Bannister (sftim)
  • Xing Yang (xing-yang)

那些有興趣參與 CSI 或 Kubernetes 儲存系統任何部分的設計和開發的人,請加入 Kubernetes 儲存特別興趣小組 (SIG)。我們正在快速成長,並隨時歡迎新的貢獻者。