Kubernetes中被驱逐的豆荚会发生什么?


82

我刚刚看到我的一些豆荚被kubernetes赶走了。他们会发生什么?只是像那样闲逛,还是我必须手动删除它们?


3
目睹相同的行为,我有一个已经使用Evicted了13天的吊舱。看起来被逐出的豆荚不会被移除(或者可能只是一个错误)。
Elouan Keryell-Even,

当达到可配置的阈值时,podgc控制器将回收那些失败/成功的pod。
zhb

2
我的豆荚被逐出,总共有40个。那么,那些被逐出的豆荚也会向我收取每月费用吗?
Anant

一堆容器被逐出,但我仍然有2个容器按预期运行。那些失败是由于较低的资源(的DiskPressure),它可以使用发现kubectl describe pods my-pod-name --namespace prod
prayagupd

Answers:


78

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

2
也可以查看此信息摘要。github.com
psxvoid /

您必须输入错误,-a参数无效。
伊利亚·苏兹达尼茨基

5
这个(和类似的答案)不会回答OP问题“ [如果您什么都不做],他们会发生什么?”
奥利弗

56

在命名空间中删除处于失败状态的Pod default

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

1
奇怪的是,什么时候都没有显示status.phase=Evicted。我设法做到了kubectl -n default delete pods --field-selector=status.phase!=Running。但要小心,这将删除一切
n3o

3
我想一开始运行会很有用kubectl -n default get pods --field-selector=status.phase=Failed
用户名

它确实Evicted为我摆脱了豆荚。
robertodecurnex

19

逐出的豆荚应手动删除。您可以使用以下命令删除所有处于Error状态的Pod 。

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

14

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

要知道,驱逐不一定必须由阈值引起的,但也可以通过调用kubectl drain清空一个节点或手动通过Kubernetes API


3
是的,我的Pod来自一个部署,我确实看到另一个Pod在另一个节点上运行,但是那些先前被逐出的Pod也在那里
–linlin

您如何确定他们“也在那里”?哪个命令可以向您准确显示?
西蒙·特萨

只是kubectl get pods -n mynamespace
–reachlin

在哪个状态?什么kubectl describe pod <pod>发言权?
西蒙·特萨

1
不是OP,但是我有这个问题。 kubectl describe 说:“状态:失败原因:被驱逐的消息:Pod该节点的资源不足:[MemoryPressure]。”
布赖恩

5

如果您的Pod的Completed状态要保持不变,请执行以下操作:

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

5

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垃圾收集器。


我的主节点上有kube-controller-manager吊舱。但是我应该如何修改该标志?如果我要使用kubectl edit pod kube-controller-manager-<master_name> -n kube-system它,则pod is invalid在保存配置文件后会出现错误。
阿里·图

4

以防万一有人想要自动删除所有命名空间的所有驱逐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

3

相当于Kalvin删除所有“逐出”的Pod的OpenShift命令:

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

3

另一个bash命令删除被驱逐的Pod

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

2

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

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

提示:使用command的p修饰符代替只会打印实际命令来执行删除作业:ssede

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

1

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

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


如果遇到麻烦,请告知如何实现上述安装。
MandyShaw

我也不知道答案,这就是为什么我提到它。OP没有提到他使用的系统,我也不知道他是否也会遇到同样的问题。顺便说一句,downvote是超级好。
tikael

您可能会认为最好将您的想法添加为评论,因为它不能完全回答问题(这就是为什么我拒绝投票-抱歉,但是对我们所有人(包括我在内)来说,这种情况都是如此)。
MandyShaw

检查上面所有其他答案,OP问发生了什么事,有多少人回答了这个问题,有多少人提供了删除驱逐舱的方法?
tikael

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


-1

下面的命令将从默认名称空间获取所有被逐出的Pod并将其删除

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


1
不鼓励仅使用代码的答案,因为它不会像带有解释性上下文的答案那样从长远来看对社区有所帮助。
阿伦·维诺斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.