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

rea*_*lin 45 kubernetes

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

小智 47

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

  • 这个(和类似的答案)没有回答OP问题“[如果你不做任何事情]他们会发生什么?” (19认同)
  • 在单个命名空间中删除的替代更具可读性的选项:`kubectl get pod -n mynamespace | grep 驱逐 | awk '{print $1}' | xargs kubectl delete pod -n mynamespace` (5认同)
  • 也可以查看这个 https://gist.github.com/psxvoid/71492191b7cb06260036c90ab30cc9a0 (2认同)

vic*_*710 34

回答最初的问题:被逐出的 Pod 会一直保留,直到数量达到限制terminated-pod-gc-threshold(这是kube-controller-manager的一个选项,默认等于 12500),这是 Kubernetes 的设计行为(也是同样的方法)用于作业并记录 - https://kubernetes.io/docs/concepts/workloads/controllers/job/#job-termination-and-cleanup)。保留被逐出的 pod 可以让您查看这些 pod 的日志以检查错误、警告或其他诊断输出。


tic*_*pix 19

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

kubectl -n default delete pods --field-selector=status.phase=Failed
Run Code Online (Sandbox Code Playgroud)

  • 我想首先运行“kubectl -n default get pods --field-selector=status.phase=Failed”可能会很有用。 (7认同)
  • 奇怪的是,当 `status.phase=Evicted` 时,这不会显示任何内容。我通过 `kubectl -n default delete pods --field-selector=status.phase!=Running` 设法做到了这一点。但要小心,这会删除所有内容 (2认同)

Sim*_*sar 9

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

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

  • 是的,我的pod是来自部署,我确实看到另一个pod在另一个节点上运行,但那些以前被驱逐的pod也在那里 (3认同)

Han*_*ena 8

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

kubectl get pods --all-namespaces --field-selector 'status.phase==Failed' -o json | kubectl delete -f -
Run Code Online (Sandbox Code Playgroud)


小智 8

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


Rom*_*syk 8

另一个用于删除被驱逐的 pod 的 bash 命令

kubectl get pods | grep Evicted | awk '{print $1}' | xargs kubectl delete pod
Run Code Online (Sandbox Code Playgroud)


Luc*_*sPC 6

以防万一有人想自动删除所有命名空间的所有被驱逐的 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 }
Run Code Online (Sandbox Code Playgroud)
  • 重击
kubectl get po --all-namespaces --field-selector=status.phase=Failed --no-headers -o custom-columns=:metadata.name | xargs kubectl delete po --all-namespaces
Run Code Online (Sandbox Code Playgroud)


dav*_*xxx 6

另一种方式仍然是用awk.

为了防止任何可能让我发疯的人为错误(删除所需的 Pod),我在命令结果之前检查get pods

kubectl -n my-ns get pods --no-headers --field-selector=status.phase=Failed     
Run Code Online (Sandbox Code Playgroud)

如果看起来不错,我们就开始吧:

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

所有命名空间的 pod 都是一样的。

查看 :

kubectl get -A pods --no-headers --field-selector=status.phase=Failed     
Run Code Online (Sandbox Code Playgroud)

删除 :

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


小智 5

如果您有Completed想要保留状态的Pod :

kubectl get pods --all-namespaces --field-selector 'status.phase==Failed' -o json | kubectl delete -f -
Run Code Online (Sandbox Code Playgroud)


Mar*_*iar 5

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

kubectl get pods -A | grep Evicted | awk '{print $2 " -n " $1}' | xargs -n 3 kubectl delete pod
Run Code Online (Sandbox Code Playgroud)