如何自动删除由 CronJob 创建的已完成的 Kubernetes 作业?

除了制作一个 CronJob 来清除已完成的作业之外,是否还有一种方法可以自动删除已完成的作业?

K8s 工作文件指出,已完成的作业的预期行为是让它们保持在完成状态,直到手动删除。因为我每天通过 CronJobs 运行成千上万的工作,我不想把已经完成的工作留在身边。

150004 次浏览

如文档中所述“由用户来删除旧作业”,请参见 http://kubernetes.io/docs/user-guide/jobs/#job-termination-and-cleanup

我会根据工作名称和特定条件运行一个 pod 来执行这个清理,因此至少让 kubernetes 在这里处理流程的可用性。您可以为此运行一个循环作业(假设您运行 kubernetes 1.5)。

通过运行 cron 作业删除它们的简单方法:

kubectl get jobs --all-namespaces | sed '1d' | awk '{ print $2, "--namespace", $1 }' | while read line; do kubectl delete jobs $line; done

您现在可以设置历史记录限制,或者完全禁用历史记录,这样失败或成功的 CronJobs 就不会无限期地保留下来。看我的答案 给你。文档是 给你

设定 历史界限:

.spec.successfulJobsHistoryLimit.spec.failedJobsHistoryLimit字段是可选的。这些字段指定应保留多少个已完成和失败的作业。默认情况下,它们分别设置为3和1。对 0设置一个限制,相当于在完成任务之后不保留任何相应类型的任务。

限制为0的配置如下:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
successfulJobsHistoryLimit: 0
failedJobsHistoryLimit: 0
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure

我最近构建了一个 kubernetes 运算符来完成这个任务。

部署之后,它将监视选定的名称空间,如果已完成的作业/pods 没有错误/重启,则删除它们。

Https://github.com/lwolf/kube-cleanup-operator

我已经找到了下面的工作

删除失败的作业:

kubectl delete job $(kubectl get jobs | awk '$3 ~ 0' | awk '{print $1}')

删除已完成的作业:

kubectl delete job $(kubectl get jobs | awk '$3 ~ 1' | awk '{print $1}')

使用 jsonpath:

kubectl delete job $(kubectl get job -o=jsonpath='{.items[?(@.status.succeeded==1)].metadata.name}')

这可以从版本1.12 Alpha 和 ttlSecondsAfterFinished中得到。 自动清理已完成的作业的一个例子:

apiVersion: batch/v1
kind: Job
metadata:
name: pi-with-ttl
spec:
ttlSecondsAfterFinished: 100
template:
spec:
containers:
- name: pi
image: perl
command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never

我用的是 Wernight/Kubectl的 Kubectl 图像

安排一个 cron 删除任何

  • completed
  • 2 - 9 days old(所以我有2天的时间来回顾任何失败的工作)

它每30分钟运行一次,所以我不计算10天以上的工作

apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: cleanup
spec:
schedule: "*/30 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: kubectl-runner
image: wernight/kubectl
command: ["sh", "-c", "kubectl get jobs | awk '$4 ~ /[2-9]d$/ || $3 ~ 1' | awk '{print $1}' | xargs kubectl delete job"]
restartPolicy: Never

另一种方式 使用字段选择器:

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

这可以在一个错误的执行,类似于其他答案。

  1. 创建一个服务帐户,类似于 my-sa-name
  2. 创建具有资源作业的列表和删除权限的角色
  3. 附加服务帐户中的角色(角色绑定)
  4. 创建一个 cronjob,该 cronjob 将使用检查已完成作业并删除它们的服务帐户
# 1. Create a service account


apiVersion: v1
kind: ServiceAccount
metadata:
name: my-sa-name
namespace: default


---


# 2. Create a role


apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: my-completed-jobs-cleaner-role
rules:
- apiGroups: [""]
resources: ["jobs"]
verbs: ["list", "delete"]


---


# 3. Attach the role to the service account


apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: my-completed-jobs-cleaner-rolebinding
namespace: default
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: my-completed-jobs-cleaner-role
subjects:
- kind: ServiceAccount
name: my-sa-name
namespace: default


---


# 4. Create a cronjob (with a crontab schedule) using the service account to check for completed jobs


apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: jobs-cleanup
spec:
schedule: "*/30 * * * *"
jobTemplate:
spec:
template:
spec:
serviceAccountName: my-sa-name
containers:
- name: kubectl-container
image: bitnami/kubectl:latest
# I'm using bitnami kubectl, because the suggested kubectl image didn't had the `field-selector` option
command: ["sh", "-c", "kubectl delete jobs --field-selector status.successful=1"]
restartPolicy: Never