我刚刚看到我的一些豆荚被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)
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)
根据是否已达到软驱逐或硬驱逐阈值,Pod中的容器将在有或没有宽限期的情况下终止,PodPhase将被标记为Failed并删除Pod.如果您的应用程序作为部署的一部分运行,则Kubernetes将创建并安排另一个Pod - 可能在另一个不超过其驱逐阈值的节点上.
要知道,驱逐不一定必须由阈值引起的,但也可以通过调用kubectl drain来清空一个节点或手动通过Kubernetes API.
逐出的豆荚应手动删除。您可以使用以下命令删除所有处于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 垃圾收集器被禁用。
另一个用于删除被驱逐的 pod 的 bash 命令
kubectl get pods | grep Evicted | awk '{print $1}' | xargs kubectl delete pod
Run Code Online (Sandbox Code Playgroud)
以防万一有人想自动删除所有命名空间的所有被驱逐的 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)
另一种方式仍然是用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)
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)
| 归档时间: |
|
| 查看次数: |
41319 次 |
| 最近记录: |