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

Kubernetes 1.23:StatefulSet PVC 自動刪除(alpha)

Kubernetes v1.23引入了一項新的 Alpha 級別策略,用於 StatefulSets。該策略控制了從 StatefulSet 規範模板生成的 PersistentVolumeClaims (PVCs) 的生命週期,以便在刪除 StatefulSet 或縮減 StatefulSet 中的 Pod 時,PVCs 可以自動刪除。

這解決了什麼問題?

StatefulSet 規範可以包含 Pod 和 PVC 模板。當首次建立副本時,如果副本的 PVC 不存在,Kubernetes 控制平面會為其建立 PVC。Kubernetes v1.23 之前的行為是,控制平面從不清理為 StatefulSets 建立的 PVCs——這留給了叢集管理員,或者需要您尋找、檢查適用性並部署一些附加自動化工具。手動管理 PVCs 或透過 Helm 等工具管理 PVCs 的常見模式是,PVCs 由管理它們的工具明確跟蹤生命週期。使用 StatefulSets 的工作流必須自行確定 StatefulSet 建立了哪些 PVCs 以及它們的生命週期應如何。

在此新功能之前,當由 StatefulSet 管理的副本消失時(無論是 StatefulSet 減少了副本數量,還是 StatefulSet 被刪除),PVC 及其後端卷會保留下來,必須手動刪除。雖然當資料至關重要時這種行為是適當的,但在許多情況下,這些 PVC 中的持久化資料要麼是臨時的,要麼可以從其他來源重建。在這些情況下,其 StatefulSet 或副本被刪除後仍然存在的 PVCs 及其後端卷是不必要的,會產生費用,並需要手動清理。

新的 StatefulSet PVC 保留策略

如果啟用 Alpha 功能,StatefulSet 規範將包含一個 PersistentVolumeClaim 保留策略。這用於控制是否以及何時刪除從 StatefulSet 的 `volumeClaimTemplate` 建立的 PVC。此保留策略的首次迭代包含兩種情況下可以刪除 PVCs。

第一種情況是當 StatefulSet 資源被刪除時(這意味著所有副本也被刪除)。這由 `whenDeleted` 策略控制。第二種情況由 `whenScaled` 控制,即當 StatefulSet 縮減時,這會刪除 StatefulSet 中部分而不是所有副本。在這兩種情況下,策略可以是 `Retain`(不觸動相應的 PVCs),也可以是 `Delete`(表示刪除 PVCs)。刪除是正常的物件刪除,因此例如,底層 PV 的所有保留策略都會被遵守。

此策略形成了四種情況的矩陣。我將逐一講解並給出示例。

  • `whenDeleted` 和 `whenScaled` 都設定為 `Retain`。 這與 StatefulSets 的現有行為匹配,即不刪除任何 PVC。這也是預設的保留策略。當 StatefulSet 捲上的資料不可替代且只能手動刪除時,適合使用此策略。

  • `whenDeleted` 設定為 `Delete`,`whenScaled` 設定為 `Retain`。 在這種情況下,PVCs 僅在整個 StatefulSet 被刪除時才會被刪除。如果 StatefulSet 縮減,PVCs 不受影響,這意味著如果發生擴容,它們可以使用來自先前副本的任何資料重新連線。這可能用於臨時 StatefulSet,例如在 CI 例項或 ETL 管道中,StatefulSet 上的資料僅在 StatefulSet 的生命週期內需要,但在任務執行時資料不容易重建。任何保留的狀態都需要用於縮減後又擴容的任何副本。

  • `whenDeleted` 和 `whenScaled` 都設定為 `Delete`。 當副本不再需要時,PVC 會立即刪除。請注意,這不包括 Pod 被刪除並重新排程新版本的情況,例如當節點被排空並且 Pod 需要遷移到其他位置時。PVC 僅在副本不再需要時才會被刪除,這透過縮減或 StatefulSet 刪除來表示。此用例適用於資料不需要在其副本生命週期之後繼續存在的情況。也許資料易於重建,並且刪除未使用的 PVCs 的成本節省比快速擴容更重要,或者當建立新副本時,來自先前副本的任何資料都不可用,並且無論如何都必須重建。

  • `whenDeleted` 設定為 `Retain`,`whenScaled` 設定為 `Delete`。 這類似於上一種情況,即在擴容期間保留 PVC 以便快速重用幾乎沒有好處。一個例子是 Elasticsearch 叢集。通常你會根據需求進行擴縮容,同時確保最小副本數量(例如:3)。在縮容時,資料會從移除的副本中遷移出來,因此保留這些 PVCs 沒有好處。然而,暫時關閉整個 Elasticsearch 叢集進行維護可能會很有用。如果你需要將 Elasticsearch 系統離線,可以透過暫時刪除 StatefulSet 來實現,然後透過重新建立 StatefulSet 來恢復 Elasticsearch 叢集。包含 Elasticsearch 資料的 PVCs 將仍然存在,新的副本將自動使用它們。

請訪問文件,瞭解所有詳細資訊。

下一步是什麼?

啟用該功能並試用!在叢集上啟用 `StatefulSetAutoDeletePVC` 功能門,然後使用新策略建立 StatefulSet。測試一下並告訴我們您的想法!

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

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

祝您使用愉快!