Kubernetes:強制刪除 StatefulSet 類型的 Pods(刪除處於Unknown狀態的Pod)

您可以使用下面的命令執行優雅地刪除 pod:

kubectl delete pods <pod>

爲了使上面的方法能夠正常終止,Pod 一定不能設置 pod.Spec.TerminationGracePeriodSeconds 爲 0。將 pod.Spec.TerminationGracePeriodSeconds 設置爲 0s 的做法是不安全的,強烈建議 StatefulSet 類型的 pods 不要使用。優雅刪除是安全的,並且會在 kubelet 從 apiserver 中刪除名稱之前確保 優雅地關閉 pod 

Kubernetes (1.5 版本或者更新版本)不會因爲一個 Node 無法訪問而刪除 pods。在無法訪問節點上運行的 pods 在超時後會進入’Terminating’ 或者 ‘Unknown’ 狀態。當用戶嘗試優雅刪除無法訪問節點上的 pod 時,pods 也可能會進入這些狀態。從 apiserver 中刪除處於這些狀態 pod 的唯一方法如下:

  • Node 對象被刪除(要麼您刪除, 或者Node Controller)。
  • 無響應節點上的 kubelet 開始響應,殺死 pod 並從 apiserver 中移除該條目。
  • 用戶強制刪除 pod。

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

通常,pod 一旦不在節點上運行,或者管理員刪除了節點,系統就會完成刪除。你可以通過強制刪除 pod 來覆蓋它。

強制刪除

強制刪除不要等待來自 kubelet 的確認 pod 已被終止。無論強制刪除是否成功殺死了 pod,它都會立即從 apiserver 中釋放該名字。這將讓 StatefulSet 控制器創建一個具有相同標識的替換 pod;這可能導致正在運行 pod 的重複,並且如果所述 pod 仍然可以與 StatefulSet 的成員通信,則將違反 StatefulSet 旨在保證的最多一個的語義。

當你強制刪除 StatefulSet 類型的 pod 時,你要確保有問題的 pod 不會再和 StatefulSet 管理的其他 pods通信,並且可以安全地釋放其名字以便創建替換 pod。

如果要使用 kubectl version >= 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,並完全瞭解所涉及地風險。

 

 

批量刪除 所有處於Unknown狀態的Pod

kubectl delete pods $(kubectl get pods | awk '/Unknown/{print $1}' ) --grace-period=0 --force

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章