本文已超過一年。較舊的文章可能包含過時的內容。請檢查頁面中的資訊自發布以來是否已變得不正確。
Kubernetes 1.23:StatefulSet PVC 自動刪除 (alpha)
Kubernetes v1.23 針對 StatefulSets 引入了新的 Alpha 等級原則,用於控制從 StatefulSet 規格範本產生的 PersistentVolumeClaims (PVC) 的生命週期,以處理在刪除 StatefulSet 或縮減 StatefulSet 中的 Pod 時應自動刪除它們的情況。
這解決了什麼問題?
StatefulSet 規格可以包含 Pod 和 PVC 範本。首次建立副本時,如果 Kubernetes 控制平面尚未存在 PVC,則會為該副本建立 PVC。Kubernetes v1.23 之前的行為是控制平面永遠不會清理為 StatefulSet 建立的 PVC - 這留給叢集管理員,或您必須尋找、檢查適用性並部署的某些附加自動化功能。管理 PVC 的常見模式(無論是手動還是透過 Helm 等工具)是 PVC 由管理它們的工具追蹤,並具有明確的生命週期。使用 StatefulSet 的工作流程必須自行判斷 StatefulSet 建立哪些 PVC 以及它們的生命週期應該是什麼。
在這個新功能之前,當 StatefulSet 管理的副本消失時,無論是因為 StatefulSet 正在減少其副本計數,還是因為其 StatefulSet 已刪除,PVC 及其後端磁碟區仍然存在,並且必須手動刪除。雖然當資料至關重要時,此行為是適當的,但在許多情況下,這些 PVC 中的持久性資料是暫時性的,或者可以從另一個來源重建。在這些情況下,在刪除 StatefulSet 或副本後仍然存在的 PVC 及其後端磁碟區是不必要的,會產生費用,並且需要手動清理。
新的 StatefulSet PVC 保留原則
如果您啟用 Alpha 功能,StatefulSet 規格將包含 PersistentVolumeClaim 保留原則。這用於控制是否以及何時刪除從 StatefulSet 的 volumeClaimTemplate
建立的 PVC。保留原則的第一個迭代包含可能刪除 PVC 的兩種情況。
第一種情況是在刪除 StatefulSet 資源時(這表示所有副本也會被刪除)。這由 whenDeleted
原則控制。第二種情況由 whenScaled
控制,是當 StatefulSet 縮減時,這會移除 StatefulSet 中的某些但非全部副本。在這兩種情況下,原則可以是 Retain
(其中對應的 PVC 不會被觸及),也可以是 Delete
(這表示 PVC 會被刪除)。刪除是使用正常的 物件刪除 完成的,因此,例如,基礎 PV 的所有保留原則都會受到尊重。
此原則形成一個包含四種情況的矩陣。我將逐步說明並為每種情況提供一個範例。
whenDeleted
和whenScaled
都是Retain
。 這與 StatefulSet 的現有行為相符,其中沒有 PVC 被刪除。這也是預設的保留原則。當 StatefulSet 磁碟區上的資料可能是不可取代的,並且應該僅手動刪除時,適合使用此原則。whenDeleted
是Delete
,而whenScaled
是Retain
。 在這種情況下,PVC 僅在整個 StatefulSet 被刪除時才被刪除。如果 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
功能閘道,然後使用新原則建立 StatefulSet。測試看看並告訴我們您的想法!
我非常好奇想知道這個擁有者參照機制在實務上是否運作良好。例如,我們意識到 Kubernetes 中沒有任何機制可以知道誰設定了參照,因此 StatefulSet 控制器可能會與設定自己參照的自訂控制器發生衝突。幸運的是,維護現有的保留行為不涉及任何新的擁有者參照,因此預設行為將相容。
請使用標籤 sig/apps
標記您報告的任何問題,並將其分配給 Matthew Cary (GitHub 上的 @mattcary)。
盡情享受!