库伯内被驱逐的豆荚会怎么样?

我刚看到我的一些休眠舱被库伯内特家的人赶走了。他们会怎么样?就这么一直挂着还是要我手动删除?

143272 次浏览

如果软或硬 驱逐门槛已经满足,容器在吊舱将终止或没有宽限期,PodPhase将被标记为 Failed和吊舱删除。如果您的应用程序作为部署(Deployment)的一部分运行,那么将会有另一个由 Kubernetes 创建和调度的 Pod ——可能在另一个不超过其驱逐阈值的节点上。

请注意,驱逐不一定是由阈值引起的,但也可以通过 kubectl drain调用到 清空一个节点或通过 库伯内特斯空气污染指数手动调用。

我使用的一个快速变通方法是在事故发生后手动删除所有被驱逐的吊舱:

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

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

下面是如何硬编码阈值的“官方”指南(如果你不想看到太多被驱逐的豆荚) : Kube-control-manager

但是一个已知的问题是如何安装 kube 控制管理器..。

清除的吊舱应该手动删除。您可以使用以下命令删除所有在 Error状态的吊舱。

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

如果你有一个 Completed状态的豆荚,你想保留在周围:

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

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

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

默认情况下,Kube-controller-manager存在于工作的 K8安装中。似乎在 GC 启动之前,默认值最多为12500个终止的 pods。

直接来自 K8文件: Https://kubernetes.io/docs/reference/command-line-tools-reference/kube-controller-manager/#kube-controller-manager

——终止-pod-gc-阈值 int32默认值: 12500
在终止的 pod 垃圾收集器开始删除已终止的 pod 之前可以存在的终止的 pod 的数量。如果 < = 0,则禁用已终止的 pod 垃圾收集器。

只是在这种情况下,有人想要自动删除所有名称空间的所有被驱逐的 pods:

  • 强力外壳
    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

再执行一个 bash 命令来删除被驱逐的 pods

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

下面的命令将从默认名称空间中获取所有被驱逐的 pods 并删除它们

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

另一种方式仍然与 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)}'

所有名称空间的 pods 也是如此。

检查:

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

要强制删除所有 Evicted pods,可以尝试以下一行命令:

$ 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'

下面的命令从所有名称空间中删除所有失败的 pods

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

为了回答最初的问题: 被驱逐的吊舱会一直存在,直到它们的数量达到 terminated-pod-gc-threshold的限制(这是 Kube 控制器经理的一个选项,默认等于12500) ,这是根据库伯内特的设计行为(同样的方法也被用来记录乔布斯 -https://kubernetes.io/docs/concepts/workloads/controllers/job/#job-termination-and-cleanup)。将被驱逐的 pods 放在周围,可以查看这些 pods 的日志,以检查错误、警告或其他诊断输出。

当我们的集群中有太多被驱逐的 pods 时,这会导致网络负载,因为每个 pods,即使它被驱逐连接到网络,并且在云 Kubernetes 集群的情况下,会阻塞一个 IP 地址,如果你的集群有一个固定的 IP 地址池,这也会导致 IP 地址的耗尽。

另外,当我们有太多的 pods 处于被驱逐状态时,通过运行 kubectl get pod 命令来监视 pods 会变得很困难,因为你会看到太多被驱逐的 pods,这有时会有点混乱。

要删除和驱逐 pod,请运行以下命令

kubectl delete pod <podname> -n <namespace>

如果你有很多被驱逐的分离舱呢

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