在kubernetes被驱逐的豆荚将会发生什么?

时间:2017-09-26 06:21:13

标签: kubernetes

我刚刚看到我的一些豆荚被kubernetes驱逐出境。会发生什么事?只是像那样闲逛,或者我必须手动删除它们?

15 个答案:

答案 0 :(得分:26)

我使用的快速解决方法是在事件发生后手动删除所有被驱逐的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

答案 1 :(得分:7)

根据是否已满足软件或eviction threshold,Pod中的容器将在有或没有宽限期的情况下终止,PodPhase将被标记为Failed并且Pod被删除了。如果您的应用程序作为例如部署时,Kubernetes将创建并安排另一个Pod - 可能在另一个不超过其驱逐阈值的节点上。

请注意,驱逐不一定必须由阈值引起,但也可以通过kubectl drainempty a node或通过Kubernetes API手动调用。

答案 2 :(得分:4)

逐出的吊舱应手动删除。您可以使用以下命令删除处于Error状态的所有广告连播。

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

答案 3 :(得分:4)

要删除命名空间default中处于“失败”状态的Pod,请执行以下操作:

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

答案 4 :(得分:3)

OpenShift相当于Kalvin删除所有'Evicted'豆荚的命令:

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')"

答案 5 :(得分:2)

仅在有人要自动删除所有命名空间的所有驱逐Pod的情况下:

  • Powershell
    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

答案 6 :(得分:2)

又一个bash命令删除被驱逐的豆荚

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

答案 7 :(得分:2)

要强行删除所有Evicted个吊舱,可以尝试以下单行命令:

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

提示:使用p的{​​{1}}命令的s修饰符代替sed只会打印实际命令来执行删除作业:

e

答案 8 :(得分:1)

如果您要保持Completed状态的吊舱:

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

答案 9 :(得分:1)

awk的另一种方式。

为防止任何可能使我发疯的人为错误(删除想要的豆荚),请在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)}'

答案 10 :(得分:1)

bellow命令从所有名称空间中删除所有失败的Pod

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

答案 11 :(得分:1)

要回答最初的问题:被驱逐的 Pod 将无限期地闲置,这是由 Kubernetes 的设计行为决定的(同样的方法也被用于 Jobs - https://kubernetes.io/docs/concepts/workloads/controllers/job/#job-termination-and-cleanup 并记录在案)。保留被驱逐的 Pod Pod 允许您查看这些 Pod 的日志以检查错误、警告或其他诊断输出。

同样如前所述,可以在 k8s 上安装一个像 kube-controller-manager 这样的守护进程,以方便自动删除被驱逐的 pod。

答案 12 :(得分:0)

这是有关如何对阈值进行硬编码的“官方”指南(如果您不想看到太多被驱逐的豆荚):kube-controll-manager

但是一个已知的问题是如何安装kube-controll-manager ...

答案 13 :(得分:0)

默认情况下,

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垃圾回收器被禁用。

答案 14 :(得分:0)

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