本文發表於一年多前。舊文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。
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 保留策略用於控制從 StatefulSet
的 volumeClaimTemplate
建立的 PVC 是否以及何時被刪除。這可能發生在兩種情況下。
第一種情況是當 StatefulSet
資源被刪除時(這意味著所有副本也被刪除)。這由 whenDeleted
策略控制。第二種情況,由 whenScaled
控制,是當 StatefulSet
縮減時,這會移除 StatefulSet
中的部分但非全部副本。在這兩種情況下,策略都可以是 Retain
(保留),即相應的 PVC 不會被觸動,或者是 Delete
(刪除),這意味著 PVC 會被刪除。刪除操作是透過正常的物件刪除來完成的,因此,例如,底層 PV 的所有保留策略都會被遵守。
這個策略形成了一個包含四種情況的矩陣。我將逐一介紹併為每種情況舉例說明。
whenDeleted
和whenScaled
均為Retain
。這與
StatefulSets
的現有行為相匹配,即不刪除任何 PVC。這也是預設的保留策略。當StatefulSet
捲上的資料可能是不可替代且只應手動刪除時,使用此策略是合適的。whenDeleted
為Delete
,whenScaled
為Retain
。在這種情況下,只有當整個
StatefulSet
被刪除時,PVC 才會被刪除。如果StatefulSet
被縮減,PVC 不會被觸動,這意味著如果發生擴容,它們可以被重新掛載,並保留之前副本的任何資料。這可能用於臨時的StatefulSet
,例如在 CI 例項或 ETL 管道中,其中StatefulSet
上的資料僅在StatefulSet
的生命週期內需要,但在任務執行期間,資料不易重建。任何被縮減然後又擴容的副本都需要保留的狀態。whenDeleted
和whenScaled
均為Delete
。當副本不再需要時,PVC 會被立即刪除。請注意,這不包括
Pod
被刪除並重新排程一個新版本的情況,例如當一個節點被排空,Pod
需要遷移到別處時。PVC 僅在副本因縮減或StatefulSet
刪除而不再需要時才被刪除。此用例適用於資料不需要在其副本的生命週期之外存在的情況。也許資料很容易重建,刪除未使用的 PVC 所節省的成本比快速擴容更重要,或者當建立新副本時,任何來自先前副本的資料都無法使用,必須重新構建。whenDeleted
為Retain
,whenScaled
為Delete
。這與前一種情況類似,即在擴容期間保留 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)。
祝你使用愉快!