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

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

Kubernetes v1.27 將一項針對 StatefulSets 的新策略機制升級至 Beta 階段,該機制用於控制其 PersistentVolumeClaims (PVC) 的生命週期。新的 PVC 保留策略允許使用者指定當 StatefulSet 被刪除或 StatefulSet 中的副本被縮減時,從 StatefulSet 規範模板生成的 PVC 是否應被自動刪除或保留。

這解決了什麼問題?

一個 StatefulSet 規範可以包含 Pod 和 PVC 模板。當一個副本首次被建立時,如果 PVC 尚不存在,Kubernetes 控制平面會為該副本建立一個 PVC。在引入 PVC 保留策略之前,行為是控制平面從不清理為 StatefulSet 建立的 PVC——這項工作留給了叢集管理員,或者需要你自行尋找、檢查適用性並部署的附加自動化工具。管理 PVC 的常見模式,無論是手動還是透過 Helm 等工具,都是由管理它們的工具來跟蹤 PVC,並具有明確的生命週期。使用 StatefulSet 的工作流必須自行確定哪些 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 捲上的資料可能是不可替代且只應手動刪除時,使用此策略是合適的。

  • whenDeletedDeletewhenScaledRetain

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

  • whenDeletedwhenScaled 均為 Delete

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

  • whenDeletedRetainwhenScaledDelete

    這與前一種情況類似,即在擴容期間保留 PVC 以便快速重用的好處很小。一個可能使用此策略的例子是 Elasticsearch 叢集。通常,你會根據需求擴縮該工作負載,同時確保最小副本數(例如:3)。縮減時,資料會從被移除的副本中遷移走,保留這些 PVC 沒有好處。但是,為了維護而臨時關閉整個 Elasticsearch 叢集可能很有用。如果需要讓 Elasticsearch 系統離線,可以透過臨時刪除 StatefulSet 來實現,然後透過重新建立 StatefulSet 來恢復 Elasticsearch 叢集。儲存 Elasticsearch 資料的 PVC 仍然存在,新的副本將自動使用它們。

請訪問文件檢視所有細節。

下一步是什麼?

快來試試吧!StatefulSetAutoDeletePVC 特性門控在執行 Kubernetes 1.27 的叢集上預設為 Beta 階段並已啟用。使用新策略建立一個 StatefulSet,測試一下,並告訴我們你的想法!

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

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

祝你使用愉快!