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


81

除了制作CronJob来清理已完成的作业外,是否有办法自动删除已完成的作业?

K8S工作文件规定,完成作业的预期行为是他们留在已完成的状态,直到手动删除。因为我每天要通过CronJobs运行数千个Jobs,所以我不想保留完整的Jobs。

Answers:


97

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

设置历史记录限制

.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

2
是否可以设置历史记录的时间限制,例如一周后删除成功的工作?
Kamaraju

抱歉,不是我所知道的。如果有办法,请在此处发布后续消息。大概,我想您可以编写一个cron作业,该作业将查看旧的pod时间戳,然后一个X天内删除一个过期的pod。
JJC

是的,我在kubernetes(一个golang项目)中创建了一个部署,创建了一个频道来收听Pod列表并观看状态变化..
Kamaraju

7
请注意,链接的答案仅适用于CronJob对象(询问者提到的Job对象),而不适用于对象。
科里·克莱因

也许在这里也可以看一下,看来有可能定义ttlSecondsAfterFinished,它“将级联删除作业,即与作业一起删除其相关对象(例如Pod)”
希尔伯特

18

从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

Note that this TTL mechanism is alpha, with feature gate TTLAfterFinished 我不了解此功能门部分。
technazi

1
功能门是启用或禁用Kubernetes功能的标志。我不知道如何设置它们,即使您有能力使用EKS之类的托管服务来进行设置。我怀疑您也必须配置主节点,但是我正在猜测。@technazi
rath

1
谢谢@rath!是的,当我通过头盔模板配置作业和吊舱时,没有看到可以配置特征门的地方,因此我无法使用Alpha改进功能,从本质上讲ttlSecondsAfterFinished,没有特征门就没有效果。
technazi

16

我发现以下工作

要删除失败的作业:

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

删除完成的作业:

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

2
我必须更新命令才能使其正常工作:kubectl delete jobs $(kubectl get jobs | awk '$2 ~ 1/1' | awk '{print $1}')
user2804197

10

我正在使用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

对于您的awk命令,您$2 ~ /^1/不是要代替第二个条件$3 ~ 1吗?我假设您正在查看的是第二列的完成列,至少对我而言,并且完成列的打印方式大约是这样0/11/1因此获取第一个字符很重要。也许您的输出kubectl get job是不同的。
斯蒂芬

您也可以将两个awk命令组合为一个。我测试了以下内容,并将其替换为上述awk组件:awk '$4 ~ /^[2-9]d/ || $2 ~ /^1/ {print $1}'
Stephen


6

使用jsonpath:

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

6

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

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

在cronjob中运行该脚本的另一种方法是,与另一个答案类似:

创建具有批处理/职位列表的服务帐户并删除权限;它使用bitnami kubectl,因为建议的kubectl图像没有field-selector选项

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
            command: ["sh", "-c", "kubectl delete jobs --field-selector status.successful=1"]
          restartPolicy: Never

2
您能否添加一个示例,说明如何创建具有所需权限的服务帐户?
brechtvhb


5

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

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

2
不建议解析文本输出。相反,您应该请求一个json,用jq解析它并遍历结果。
Mikulas Dite

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

4
不要这样 这也会删除正在运行的作业
cristi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.