Kubernetes - 批量删除所有作业

Kubernetes - delete all jobs in bulk

我可以删除集群中的所有作业运行

kubectl delete jobs --all 

然而,作业一个接一个地被删除,这非常慢(大约 200 个作业我有时间写这个问题,但它甚至没有完成)。

有没有更快的方法?

可能没有其他方法可以一次删除所有作业,因为即使 kubectl delete jobs 也一次查询一个作业,Norbert van Nobelen 的建议可能会得到更快的结果,但它会产生很大的不同。

如果您正在使用 CronJob 并且那些堆积得很快,您可以通过配置 documentation 中描述的作业历史记录限制让 kubernetes 自动删除它们。从 1.6 版本开始有效。

...
  spec:
    ...
    successfulJobsHistoryLimit: 3
    failedJobsHistoryLimit: 3

我有一个删除脚本,删除速度相当快:

$ cat deljobs.sh 
set -x

for j in $(kubectl get jobs -o custom-columns=:.metadata.name)
do
    kubectl delete jobs $j &
done

为了创建 200 个作业,请使用以下脚本和命令 for i in {1..200}; do ./jobs.sh; done

$ cat jobs.sh 
kubectl run memhog-$(cat /dev/urandom | tr -dc 'a-z0-9' | fold -w 8 | head -n 1)  --restart=OnFailure --record --image=derekwaynecarr/memhog --command -- memhog -r100 20m

我使用这个脚本,速度很快,但它会造成垃圾 CPU(每个作业一个进程),您可以随时调整 sleep 参数:

#!/usr/bin/env bash

echo "Deleting all jobs (in parallel - it can trash CPU)"

kubectl get jobs --all-namespaces | sed '1d' | awk '{ print , "--namespace",  }' | while read line; do
  echo "Running with: ${line}"
  kubectl delete jobs ${line} &
  sleep 0.05
done

为此 bash 命令设置别名更容易一些:

kubectl delete jobs `kubectl get jobs -o custom-columns=:.metadata.name`

使用 GNU parallel 进行并行化

parallel --jobs=5 "echo {}; kubectl delete jobs {} -n core-services;" ::: $(kubectl get job -o=jsonpath='{.items[?(@.status.succeeded==1)].metadata.name}'  -n core-services)

kubectl delete jobs --all --cascade=false速度快,但不会删除关联资源,如Pods

https://github.com/kubernetes/kubernetes/issues/8598

Kubectl bulk(bulk-action on krew)插件可能对你有用,它可以让你对选定的资源进行批量操作。 这是删除作业的命令 ' kubectl 批量作业删除 '

您可以查看详情 https://github.com/emreodabas/kubectl-plugins/blob/master/README.md#kubectl-bulk-aka-bulk-action

这对我来说非常有效:

kubectl delete jobs $(kubectl get jobs -o custom-columns=:.metadata.name)

对我来说最好的方法是(对于一天前完成的工作):

kubectl get jobs | grep 1/1 | gawk 'match([=10=], / ([0-9]*)h/, ary) { if(ary[1]>24) print }' | parallel -r --bar -P 32 kubectl delete jobs

grep 1/1 完成作业

gawk 'match([=12=], / ([0-9]*)h/, ary) { if(ary[1]>24) print }' 超过一天的作业

-P 并行进程数

它比 kubectl delete jobs --all 快,有一个进度条,您可以在某些作业仍在进行时使用它 运行。

kubectl get jobs -o custom-columns=:.metadata.name | grep 特定* | xargs kubectl 删除作业

kubectl get jobs -o custom-columns=:.metadata.name 为您提供作业名称列表 |然后你可以用 regexp | grep 特定你需要的然后 xargs 使用输出从列表中一个一个地删除。

有一种更简单的方法:

要删除成功的作业:

kubectl delete jobs --field-selector status.successful=1

要删除失败或 long-running 个作业:

kubectl delete jobs --field-selector status.successful=0