簡體   English   中英

Kubernetes 中被驅逐的 pod 會發生什么?

[英]What will happen to evicted pods in kubernetes?

我剛剛看到我的一些 pod 被 kubernetes 驅逐了。 他們會發生什么? 只是像那樣閑逛還是我必須手動刪除它們?

我使用的一個快速解決方法是在事件發生后手動刪除所有被驅逐的 pod。 你可以使用這個命令:

kubectl get pods --all-namespaces -o json | jq '.items[] | select(.status.reason!=null) | select(.status.reason | contains("Evicted")) | "kubectl delete pods \(.metadata.name) -n \(.metadata.namespace)"' | xargs -n 1 bash -c

在命名空間default中刪除處於失敗狀態的 pod

kubectl -n default delete pods --field-selector=status.phase=Failed

應手動刪除被驅逐的 pod。 您可以使用以下命令刪除所有處於Error狀態的 pod。

kubectl get pods --all-namespaces --field-selector 'status.phase==Failed' -o json | kubectl delete -f -

根據是否滿足軟或硬驅逐閾值,Pod 中的容器將在有或沒有寬限期的情況下終止, PodPhase將被標記為Failed並刪除 Pod。 如果您的應用程序作為部署的一部分運行,那么 Kubernetes 將創建和調度另一個 Pod - 可能在另一個不超過其驅逐閾值的節點上。

請注意,驅逐不一定是由閾值引起的,也可以通過kubectl drain調用以清空節點或通過Kubernetes API手動調用。

要回答最初的問題:被驅逐的 pod 將一直徘徊,直到它們的數量達到terminated-pod-gc-threshold限制(它是kube-controller-manager的一個選項,默認情況下等於 12500),這是設計行為的 Kubernetes (同樣的方法也用於 Jobs 並記錄在案 - https://kubernetes.io/docs/concepts/workloads/controllers/job/#job-termination-and-cleanup )。 將被驅逐的 pod 保留在周圍,您可以查看這些 pod 的日志以檢查錯誤、警告或其他診斷輸出。

波紋管命令從所有命名空間中刪除所有失敗的 pod

kubectl get pods -A | grep Evicted | awk '{print $2 " -n " $1}' | xargs -n 3 kubectl delete pod

另一個 bash 命令來刪除被驅逐的 pod

kubectl get pods | grep Evicted | awk '{print $1}' | xargs kubectl delete pod

Kube-controller-manager默認存在於 K8s 安裝中。 在 GC 啟動之前,默認值似乎是最多 12500 個終止的 Pod。

直接來自 K8s 文檔: https ://kubernetes.io/docs/reference/command-line-tools-reference/kube-controller-manager/#kube-controller-manager

--terminated-pod-gc-threshold int32 默認值:12500
在終止的 pod 垃圾收集器開始刪除終止的 pod 之前可以存在的終止 pod 的數量。 如果 <= 0,則禁用終止的 pod 垃圾收集器。

以防萬一有人想自動刪除所有命名空間的所有驅逐 pod:

  • 電源外殼
    Foreach( $x in (kubectl get po --all-namespaces --field-selector=status.phase=Failed --no-headers -o custom-columns=:metadata.name)) {kubectl delete po $x --all-namespaces }
  • 重擊
kubectl get po --all-namespaces --field-selector=status.phase=Failed --no-headers -o custom-columns=:metadata.name | xargs kubectl delete po --all-namespaces

如果您想要保留狀態為Completed的 pod:

kubectl get pods --all-namespaces --field-selector 'status.phase==Failed' -o json | kubectl delete -f -

另一種方法仍然是awk

為了防止任何可能使我發瘋的人為錯誤(刪除所需的 pod),我在get pods命令的結果之前檢查:

kubectl -n my-ns get pods --no-headers --field-selector=status.phase=Failed     

如果看起來不錯,我們開始:

kubectl -n my-ns get pods --no-headers --field-selector=status.phase=Failed | \
awk '{system("kubectl -n my-ns delete pods " $1)}'

所有命名空間的 pod 都是一樣的。

查看 :

kubectl get -A pods --no-headers --field-selector=status.phase=Failed     

刪除 :

kubectl get -A pods --no-headers --field-selector status.phase=Failed | \
awk '{system("kubectl -n " $1 " delete pod " $2 )}'

OpenShift 等效於 Kalvin 刪除所有“驅逐”豆莢的命令:

eval "$(oc get pods --all-namespaces -o json | jq -r '.items[] | select(.status.phase == "Failed" and .status.reason == "Evicted") | "oc delete pod --namespace " + .metadata.namespace + " " + .metadata.name')"

要強制刪除所有Evicted pod,您可以嘗試以下一行命令:

$ kubectl get pod -A | sed -nr '/Evicted/s/(^\S+)\s+(\S+).*/kubectl -n \1 delete pod \2 --force --grace-period=0/e'

提示:使用seds命令的p修飾符而不是e只會打印真正的命令來執行刪除工作:

$ kubectl get pod -A | sed -nr '/Evicted/s/(^\S+)\s+(\S+).*/kubectl -n \1 delete pod \2 --force --grace-period=0/p'

下面的命令將從默認命名空間中獲取所有被驅逐的 pod 並刪除它們

kubectl get pods | grep Evicted | awk '{print$1}' | xargs -I {} kubectl delete pods/{}

這是有關如何硬編碼閾值的“官方”指南(如果您不想看到太多被驅逐的 pod): kube-controll-manager

但是一個已知的問題是如何安裝 kube-controll-manager...

當我們的集群中有太多被驅逐的 pod 時,這可能會導致網絡負載,因為每個 pod,即使被驅逐的 pod 連接到網絡並且在雲 Kubernetes 集群的情況下,也會阻止 IP 地址,這可能導致如果您的集群有固定的 IP 地址池,也會耗盡 IP 地址。

此外,當我們有太多處於 Evicted 狀態的 pod 時,通過運行 kubectl get pod 命令來監控 pod 變得很困難,因為您會看到太多被逐出的 pod,這有時會有點令人困惑。

要刪除和驅逐 pod,請運行以下命令

kubectl delete pod <podname> -n <namespace>

如果你有很多被驅逐的豆莢怎么辦

kubectl get pod -n <namespace> | grep Evicted | awk '{print $1}' | xargs kubectl delete pod -n <namespace>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM