如何自动删除已完成的Kubernetes工作?

时间:2016-12-29 18:39:33

标签: cron kubernetes kubernetes-jobs

除了使用cronjob清理已完成的作业外,还有办法自动删除已完成的作业吗?

K8s Job Documentation表示已完成作业的预期行为是他们在手动删除之前保持已完成状态。因为我每天通过k8s cronjobs运行成千上万的工作,而且我不想保留完成的工作。

8 个答案:

答案 0 :(得分:23)

您现在可以设置历史记录限制,或完全禁用历史记录,以便无效或无法保留失败或成功的作业。请参阅我的回答here。文档为here

答案 1 :(得分:7)

从带有ttlSecondsAfterFinished的1.12 Alpha版本开始,这是可能的。来自Clean Up Finished Jobs Automatically的示例:

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

答案 2 :(得分:5)

如文档中所述"用户需要删除旧作业",请参阅http://kubernetes.io/docs/user-guide/jobs/#job-termination-and-cleanup

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

答案 3 :(得分:5)

我最近建立了一个kubernetes-operator来完成这项任务。

部署后,它将监视选定的命名空间并删除已完成的作业/ pod,如果它们完成且没有错误/重新启动。

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

答案 4 :(得分:5)

我发现以下方法可以工作

要删除失败的作业,请执行以下操作:

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

要删除已完成的作业,请执行以下操作:

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

答案 5 :(得分:5)

另一种using a field-selector

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

答案 6 :(得分:2)

使用jsonpath:

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

答案 7 :(得分:2)

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