如何自动删除由Cronjob创建的完成的Kubernetes作业



除了制作cronjob以清理完整的作业外,是否有一种方法可以自动删除已完成的作业?

K8S的工作文件指出,完成的工作的预期行为是要保持完整状态,直到手动删除为止。因为我每天通过cronjobs跑来成千上万的工作,而我不想继续完成工作。

您现在可以设置历史记录限制或完全禁用历史记录,因此失败或成功的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

这是从具有ttlSecondsAfterFinished的1.12 alpha版本中。自动清理完成作业的一个示例:

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

使用字段selector:

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

我找到了以下工作

删除失败的作业:

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

删除完成的作业:

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

我正在使用wernight/kubectl的kubectl image

计划删除任何

的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

我最近构建了一个kubernetes-operator来执行此任务。

部署后,它将监视选定的命名空间,并在没有错误/重新启动的情况下删除完成的作业/POD。

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

使用jsonpath:

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

如文档中所述"由用户删除旧作业",请参见http://kubernetes.io/docs/docs/user-guide/jobs/job-tenration - 清洁

我会运行一个基于工作名称和某些条件进行清理工作的豆荚,从而让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

相关内容

  • 没有找到相关文章

最新更新