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

Kubernetes 1.27:StatefulSet PVC 自動刪除 (beta)

Kubernetes v1.27 升級到 Beta 版,為 StatefulSets 提供新的策略機制,以控制其 PersistentVolumeClaims (PVC) 的生命週期。新的 PVC 保留策略允許使用者指定當 StatefulSet 被刪除或 StatefulSet 中的副本縮減時,是否應自動刪除或重新訓練從 StatefulSet 規格範本產生的 PVC。

這解決了什麼問題?

StatefulSet 規格可以包含 Pod 和 PVC 範本。當首次建立副本時,如果 PVC 尚不存在,Kubernetes 控制平面會為該副本建立 PVC。在 PVC 保留策略之前的行為是控制平面從不清理為 StatefulSets 建立的 PVC - 這留給叢集管理員,或一些附加自動化功能,您必須找到、檢查適用性並部署。管理 PVC 的常見模式(手動或透過 Helm 等工具)是 PVC 由管理它們的工具追蹤,並具有明確的生命週期。使用 StatefulSets 的工作流程必須自行確定哪些 PVC 是由 StatefulSet 建立的,以及它們的生命週期應該是什麼。

在這個新功能之前,當 StatefulSet 管理的副本消失時,無論是因為 StatefulSet 正在減少其副本計數,還是因為其 StatefulSet 被刪除,PVC 及其後端磁碟區仍然存在,並且必須手動刪除。雖然當資料至關重要時,此行為是適當的,但在許多情況下,這些 PVC 中的持久性資料是暫時的,或者可以從另一個來源重建。在這些情況下,在刪除其 StatefulSet 或副本後仍然存在的 PVC 及其後端磁碟區是不必要的,會產生費用,並且需要手動清理。

新的 StatefulSet PVC 保留策略

新的 StatefulSet PVC 保留策略用於控制是否以及何時刪除從 StatefulSetvolumeClaimTemplate 建立的 PVC。在兩種情況下可能會發生這種情況。

第一種情況是當 StatefulSet 資源被刪除時(這意味著所有副本也被刪除)。這由 whenDeleted 策略控制。第二種情況由 whenScaled 控制,是當 StatefulSet 縮減時,這會刪除 StatefulSet 中的部分但不是全部副本。在這兩種情況下,策略可以是 Retain,表示對應的 PVC 不會被觸及,也可以是 Delete,表示 PVC 會被刪除。刪除是使用正常的 物件刪除 完成的,因此,例如,基礎 PV 的所有保留策略都會受到尊重。

此策略形成一個包含四種情況的矩陣。我將逐步說明並為每種情況提供一個範例。

  • whenDeletedwhenScaled 都是 Retain

    這與 StatefulSets 的現有行為相符,其中沒有 PVC 被刪除。這也是預設的保留策略。當 StatefulSet 磁碟區上的資料可能是不可替代的,並且應該僅手動刪除時,使用它是適當的。

  • whenDeletedDelete,而 whenScaledRetain

    在這種情況下,PVC 僅在整個 StatefulSet 被刪除時才被刪除。如果 StatefulSet 縮減,則 PVC 不會被觸及,這意味著如果發生擴展,它們可以重新連接,並帶有來自先前副本的任何資料。這可能用於臨時 StatefulSet,例如 CI 實例或 ETL 管道,其中 StatefulSet 上的資料僅在 StatefulSet 生命週期內需要,但在任務執行期間,資料不容易重建。任何保留的狀態都是縮減然後擴展的任何副本所需要的。

  • whenDeletedwhenScaled 都是 Delete

    當副本不再需要時,PVC 會立即刪除。請注意,這不包括當 Pod 被刪除且重新排程新版本時,例如當節點被排空且 Pods 需要遷移到其他地方時。PVC 僅在副本不再需要時才被刪除,這表示縮減或 StatefulSet 刪除。此用例適用於資料不需要在其副本的生命週期之外存在的情況。也許資料很容易重建,並且刪除未使用的 PVC 的成本節省比快速擴展更重要,或者也許當建立新副本時,來自先前副本的任何資料都不可用,並且必須重新建構。

  • whenDeletedRetain,而 whenScaledDelete

    這與前一種情況類似,當在擴展期間快速重複使用 PVC 沒有太多好處時。您可能使用它的情況範例是 Elasticsearch 叢集。通常,您會根據需求擴展和縮減該工作負載,同時確保最小數量的副本(例如:3 個)。縮減時,資料會從已移除的副本遷移出去,並且保留這些 PVC 沒有任何好處。但是,暫時關閉整個 Elasticsearch 叢集以進行維護可能很有用。如果您需要使 Elasticsearch 系統離線,您可以透過暫時刪除 StatefulSet 來完成此操作,然後透過重新建立 StatefulSet 來恢復 Elasticsearch 叢集。保存 Elasticsearch 資料的 PVC 仍將存在,並且新副本將自動使用它們。

請訪問文件以查看所有詳細資訊。

下一步是什麼?

試試看!StatefulSetAutoDeletePVC 功能閘道是 Beta 版,並且在執行 Kubernetes 1.27 的叢集上預設啟用。使用新策略建立 StatefulSet,進行測試並告訴我們您的想法!

我很好奇想知道這種所有者參考機制在實踐中是否運作良好。例如,我意識到 Kubernetes 中沒有任何機制可以知道誰設定了參考,因此 StatefulSet 控制器可能會與設定自己參考的自訂控制器發生衝突。幸運的是,維護現有的保留行為不涉及任何新的所有者參考,因此預設行為將是相容的。

請使用標籤 sig/apps 標記您報告的任何問題,並將其分配給 Matthew Cary (@mattcary 在 GitHub 上)。

祝您使用愉快!