127

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

K8s作业文档指出,已完成作业的预期行为是让它们保持已完成状态,直到手动删除。因为我每天通过 CronJobs 运行数千个作业,我不想保留已完成的作业。

4

9 回答 9

155

您现在可以设置历史记录限制,或完全禁用历史记录,这样失败或成功的 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
于 2017-03-30T11:06:13.740 回答
31

这可以从 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
于 2019-02-11T16:41:50.267 回答
21

我发现下面的工作

要删除失败的作业:

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

要删除已完成的作业:

kubectl delete job $(kubectl get jobs | awk '$3 ~ 1' | awk '{print $1}')
于 2018-11-07T12:19:58.660 回答
21

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

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

这可以在 cronjob 中执行,类似于其他答案。

  1. 创建一个服务帐户,例如my-sa-name
  2. 为资源作业创建具有列表和删除权限的角色
  3. 在服务帐户中附加角色(角色绑定)
  4. 创建一个将使用服务帐户的 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

于 2020-04-15T14:15:54.883 回答
12

我正在使用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
于 2019-03-21T20:44:51.467 回答
7

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

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

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

于 2017-09-06T10:50:00.420 回答
6

使用 jsonpath:

kubectl delete job $(kubectl get job -o=jsonpath='{.items[?(@.status.succeeded==1)].metadata.name}')
于 2018-11-21T12:59:25.030 回答
5

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

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

于 2017-01-02T04:37:30.427 回答
4

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

kubectl get jobs --all-namespaces | sed '1d' | awk '{ print $2, "--namespace", $1 }' | while read line; do kubectl delete jobs $line; done
于 2017-02-23T08:10:24.563 回答