強制刪除 StatefulSet Pod

此頁面說明如何刪除屬於StatefulSet一部分的 Pod,並說明執行此操作時需要注意的事項。

開始之前

  • 這是一項相當進階的工作,有可能違反 StatefulSet 的某些固有屬性。
  • 在繼續之前,請先熟悉以下列舉的注意事項。

StatefulSet 注意事項

在 StatefulSet 的正常運作中,永遠不需要強制刪除 StatefulSet Pod。StatefulSet 控制器負責建立、擴充與刪除 StatefulSet 的成員。它嘗試確保從序數 0 到 N-1 指定數量的 Pod 處於活動且就緒狀態。StatefulSet 確保在任何時間,叢集中最多只有一個具有指定身分識別的 Pod 正在執行。這稱為 StatefulSet 提供的最多一個語意。

手動強制刪除應謹慎執行,因為它有可能違反 StatefulSet 固有的「至多一次」語意。StatefulSet 可用於執行分散式和叢集應用程式,這些應用程式需要穩定的網路身分和穩定的儲存空間。這些應用程式通常具有依賴於具有固定身分之固定數量成員的集合的組態。擁有具有相同身分的多個成員可能會造成災難,並可能導致資料遺失(例如,基於仲裁系統中的腦裂情境)。

刪除 Pod

您可以使用以下命令執行 Pod 的正常刪除

kubectl delete pods <pod>

為了使上述操作能正常終止,Pod **不得**指定 pod.Spec.TerminationGracePeriodSeconds 為 0。將 pod.Spec.TerminationGracePeriodSeconds 設定為 0 秒的做法是不安全的,並且強烈建議 StatefulSet Pods 不要這樣做。正常刪除是安全的,並將確保 Pod 在 kubelet 從 apiserver 刪除名稱之前,正常關閉

當節點無法連線時,Pod 不會自動刪除。在 逾時後,在無法連線節點上執行的 Pod 會進入「Terminating」或「Unknown」狀態。當使用者嘗試在無法連線的節點上正常刪除 Pod 時,Pod 也可能會進入這些狀態。從 apiserver 中移除處於此狀態的 Pod 的唯一方法如下:

  • 節點物件被刪除(由您或 節點控制器 刪除)。
  • 無回應節點上的 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

如果您使用的 kubectl 版本 <= 1.4,則應省略 --force 選項並使用

kubectl delete pods <pod> --grace-period=0

如果即使在這些命令之後,Pod 仍然卡在 Unknown 狀態,請使用以下命令從叢集中移除 Pod

kubectl patch pod <pod> -p '{"metadata":{"finalizers":null}}'

始終謹慎執行 StatefulSet Pod 的強制刪除,並完全了解所涉及的風險。

下一步

了解更多關於 偵錯 StatefulSet 的資訊。

上次修改時間:2023 年 2 月 19 日下午 9:42 PST:Clean up page in tasks/run-application (ba99616c27)