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

Jos*_*man 45 cron kubernetes kubernetes-cronjob kubernetes-jobs

有没有办法自动删除已完成的工作,除了使用cronjob清理已完成的工作?

K8S工作文件规定,完成作业的预期行为是他们留在已完成的状态,直到手动删除.因为我每天通过k8s cronjobs运行成千上万的工作,我不想保持完成的工作.

JJC*_*JJC 30

您现在可以设置历史记录限制,或者完全禁用历史记录,以便失败或成功的作业无法无限期地保留.在这里看到我的答案.文档在这里.

  • 有没有办法设置历史的时间限制,比如一周后删除成功的作业? (3认同)
  • 请注意,链接的答案仅适用于“ CronJob”对象(问问者提到过),而不适用于“ Job”对象。 (3认同)
  • 也许也看看[这里](https://kubernetes.io/docs/concepts/workloads/controllers/job/#clean-up-finished-jobs-automatically),看起来有可能来定义一个 ttlSecondsAfterFinished “将级联删除作业,即连同作业一起删除其依赖对象,例如 Pod” (2认同)

And*_*rao 14

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

kubectl delete jobs --field-selector status.successful=1 
Run Code Online (Sandbox Code Playgroud)

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

  1. 创建一个服务帐户,例如 my-sa-name
  2. 为资源作业创建具有列表和删除权限的角色
  3. 在服务帐号中附加角色(角色绑定)
  4. 创建将使用服务帐户的 cronjob,该服务帐户将检查已完成的作业并删除它们
kubectl delete jobs --field-selector status.successful=1 
Run Code Online (Sandbox Code Playgroud)

  • 您能否添加一个示例来说明如何创建具有所需权限的服务帐户? (4认同)

Dav*_*ung 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
Run Code Online (Sandbox Code Playgroud)


rat*_*ath 11

从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
Run Code Online (Sandbox Code Playgroud)

  • [功能门](https://kubernetes.io/docs/reference/command-line-tools-reference/feature-gates/) 是启用或禁用 Kubernetes 功能的标志。我不知道如何设置它们,或者即使您有能力使用 EKS 等托管服务来设置它们。我怀疑您还必须配置主节点,但我只是猜测。@technazi (2认同)

jus*_*ile 9

我发现以下工作

要删除失败的作业:

kubectl delete job $(kubectl get jobs | awk '$3 ~ 0' | awk '{print $1}')
Run Code Online (Sandbox Code Playgroud)

要删除已完成的作业:

kubectl delete job $(kubectl get jobs | awk '$3 ~ 1' | awk '{print $1}')
Run Code Online (Sandbox Code Playgroud)

  • 我必须更新命令才能使其工作:`kubectl delete jobs $(kubectl get jobs | awk '$2 ~ 1/1' | awk '{print $1}')` (5认同)

Nor*_*len 5

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

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


lwo*_*olf 5

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

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

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

  • 请不要只是发布一些工具或库作为答案.至少在答案本身中演示[它如何解决问题](http://meta.stackoverflow.com/a/251605). (8认同)

小智 5

使用jsonpath:

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