【K8s任務】強制刪除 StatefulSet 中的 Pods


本文介紹如何刪除 StatefulSet 管理的 Pods,並解釋這樣操作時需要記住的注意事項。

准備開始

  • 這是一項相當高級的任務,並且可能會違反 StatefulSet 固有的某些屬性。
  • 繼續任務之前,請熟悉下面列舉的注意事項。

StatefulSet 注意事項

在 StatefulSet 的正常操作中,永遠不需要強制刪除 StatefulSet 管理的 Pod。 StatefulSet 控制器負責創建、 擴縮和刪除 StatefulSet 管理的 Pods。它嘗試確保指定數量的從序數 0 到 N-1 的 Pod 處於活躍狀態並准備就緒。StatefulSet 確保在任何時候,集群中最多只有一個具有給定標識的 Pod。 這就是所謂的由 StatefulSet 提供的最多一個(At Most One)的語義。

應謹慎進行手動強制刪除操作,因為它可能會違反 StatefulSet 固有的至多一個的語義。 StatefulSets 可用於運行分布式和集群級的應用,這些應用需要穩定的網絡標識和可靠的存儲。 這些應用通常配置為具有固定標識固定數量的成員集合。 具有相同身份的多個成員可能是災難性的,並且可能導致數據丟失 (例如:票選系統中的腦裂場景)。

刪除 Pods

你可以使用下面的命令執行體面地刪除 Pod:

kubectl delete pods <pod>

為了讓上面操作能夠體面地終止 Pod,Pod 一定不能 設置 pod.Spec.TerminationGracePeriodSeconds 為 0。 將 pod.Spec.TerminationGracePeriodSeconds 設置為 0s 的做法是不安全的,強烈建議 StatefulSet 類型的 Pod 不要使用。體面刪除是安全的,並且會在 kubelet 從 API 服務器中刪除資源名稱之前確保 體面地結束 pod 。

當某個節點不可達時,不會引發自動刪除 Pod。 在無法訪問的節點上運行的 Pod 在 超時 后會進入'Terminating' 或者 'Unknown' 狀態。 當用戶嘗試體面地刪除無法訪問的節點上的 Pod 時 Pod 也可能會進入這些狀態。 從 API 服務器上刪除處於這些狀態 Pod 的僅有可行方法如下:

  • 刪除 Node 對象(要么你來刪除, 要么節點控制器 來刪除)
  • 無響應節點上的 kubelet 開始響應,殺死 Pod 並從 API 服務器上移除 Pod 對象
  • 用戶強制刪除 pod

推薦使用第一種或者第二種方法。如果確認節點已經不可用了 (比如,永久斷開網絡、斷電等), 則應刪除 Node 對象。 如果節點遇到網裂問題,請嘗試解決該問題或者等待其解決。 當網裂愈合時,kubelet 將完成 Pod 的刪除並從 API 服務器上釋放其名字。

通常,Pod 一旦不在節點上運行,或者管理員刪除了節點,系統就會完成其刪除動作。 你也可以通過強制刪除 Pod 來繞過這一機制。

強制刪除

強制刪除不會等待來自 kubelet 對 Pod 已終止的確認消息。 無論強制刪除是否成功殺死了 Pod,它都會立即從 API 服務器中釋放該名字。 這將讓 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 類型的 pods,並完全了解所涉及地風險。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM