您可以使用下面的命令執行優雅地刪除 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