我刚刚看到我的一些豆荚被kubernetes驱逐出境。会发生什么事?只是像那样闲逛,或者我必须手动删除它们?
答案 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 drain
到empty 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的情况下:
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。
-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/{}