強制刪除 StatefulSet Pod
本頁面展示瞭如何刪除屬於 StatefulSet 的 Pod,並解釋了在執行此操作時需要注意的事項。
準備工作
- 這是一個相當高階的任務,有可能會破壞 StatefulSet 固有的某些屬性。
- 在繼續之前,請務必熟悉下面列出的注意事項。
StatefulSet 注意事項
在 StatefulSet 的正常操作中,永遠沒有必要強制刪除 StatefulSet Pod。 StatefulSet 控制器負責建立、擴縮和刪除 StatefulSet 的成員。它試圖確保從序號 0 到 N-1 的指定數量的 Pod 處於活躍和就緒狀態。StatefulSet 確保在任何時候,叢集中最多隻有一個具有給定身份的 Pod 在執行。這被稱為 StatefulSet 提供的**至多一個**語義。
手動強制刪除應謹慎進行,因為它可能會違反 StatefulSet 固有的至多一個語義。StatefulSet 可用於執行分散式和叢集應用程式,這些應用程式需要穩定的網路身份和穩定的儲存。這些應用程式通常具有依賴於固定數量的具有固定身份的成員集合的配置。擁有多個相同身份的成員可能會造成災難性後果,並可能導致資料丟失(例如,基於仲裁的系統中的腦裂情況)。
刪除 Pods
你可以使用以下命令執行優雅的 Pod 刪除
kubectl delete pods <pod>
要使上述操作實現優雅終止,Pod **不得**指定 `pod.Spec.TerminationGracePeriodSeconds` 為 0。將 `pod.Spec.TerminationGracePeriodSeconds` 設定為 0 秒的做法不安全,強烈不建議 StatefulSet Pod 使用。優雅刪除是安全的,它將確保 Pod 優雅關閉,然後 kubelet 從 apiserver 中刪除該名稱。
當節點無法訪問時,Pod 不會自動刪除。在超時後,在無法訪問的節點上執行的 Pod 會進入“Terminating”或“Unknown”狀態。當用戶嘗試優雅刪除無法訪問節點上的 Pod 時,Pod 也可能進入這些狀態。處於這種狀態的 Pod 只能透過以下方式從 apiserver 中移除:
- Node 物件被刪除(由你或由 Node Controller)。
- 無響應節點上的 kubelet 開始響應,殺死 Pod 並從 apiserver 中刪除該條目。
- 使用者強制刪除 Pod。
推薦的最佳實踐是採用第一種或第二種方法。如果節點被確認死亡(例如,永久斷開網路連線、斷電等),則刪除節點物件。如果節點出現網路分割槽,則嘗試解決或等待其解決。當分割槽恢復時,kubelet 將完成 Pod 的刪除,並在 apiserver 中釋放其名稱。
通常,一旦 Pod 不再在節點上執行,或者節點被管理員刪除,系統就會完成刪除。你可以透過強制刪除 Pod 來覆蓋此行為。
強制刪除
強制刪除**不會**等待 kubelet 確認 Pod 已終止。無論強制刪除是否成功殺死 Pod,它都會立即從 apiserver 中釋放該名稱。這將允許 StatefulSet 控制器建立具有相同身份的替換 Pod;這可能導致仍在執行的 Pod 重複,並且如果該 Pod 仍能與 StatefulSet 的其他成員通訊,將違反 StatefulSet 旨在保證的至多一個語義。
當你強制刪除 StatefulSet Pod 時,你是在斷言該 Pod 永遠不會再與 StatefulSet 中的其他 Pod 通訊,並且其名稱可以安全地釋放以建立替換 Pod。
如果你想使用 kubectl 版本 >= 1.5 強制刪除 Pod,請執行以下操作:
kubectl delete pods <pod> --grace-period=0 --force
如果你使用任何版本小於等於 1.4 的 kubectl,應省略 `--force` 選項並使用:
kubectl delete pods <pod> --grace-period=0
如果即使執行了這些命令,Pod 仍停留在 `Unknown` 狀態,請使用以下命令從叢集中移除 Pod:
kubectl patch pod <pod> -p '{"metadata":{"finalizers":null}}'
務必謹慎執行 StatefulSet Pod 的強制刪除,並完全瞭解所涉及的風險。
下一步
瞭解更多關於除錯 StatefulSet的資訊。