Kubernetes工作清理

时间:2016-04-03 11:32:05

标签: kubernetes jobs

根据我的理解,Job对象应该在一定时间后收获pod。 但是在我的GKE集群(Kubernetes 1.1.8)上,似乎" kubectl得到了pods -a"可以从几天前列出pods。

所有都是使用Jobs API创建的。

我确实注意到删除作业后     kubectl删除工作 豆荚也被删除了。

我主要担心的是,我将在批处理作业中运行数千和数万个集群,并且不想超载内部积压系统。

5 个答案:

答案 0 :(得分:42)

从Kubernetes 1.6(以及v2alpha1 api版本)开始,如果您使用cronjobs创建作业(反过来创建您的pod),您将能够limit保留了多少旧工作。只需将以下内容添加到您的工作规范中:

successfulJobsHistoryLimit: X
failedJobsHistoryLimit: Y

其中X和Y是系统应该保留多少先前运行的作业的限制(默认情况下它会无限期地保留作业[至少在版本1.5上。])

修改 2018-09-29

对于较新的K8S版本,更新的链接及其文档在此处:

答案 1 :(得分:2)

即使在Kubernetes 1.3中,这也是Jobs的预期行为。作业及其pod都保留在系统中,直到您手动删除它们。这是为了让您了解通过某种机制未在外部传输的pod(即通过日志)的结果,或检查错误,警告或其他诊断输出。

推荐/ official摆脱pod的方法是删除上面提到的作业。使用垃圾收集器只会删除pod,但作业本身仍然在系统中。

如果您不想手动删除作业,可以编写一个在群集中运行的小脚本,检查已完成的作业并删除它们。遗憾的是,预定作业仅为coming in 1.4,但您可以在普通的pod中运行该脚本。

答案 2 :(得分:2)

确实,您曾经不得不手动删除作业。在撰写本文时,@ puja的答案是正确的。

Kubernetes 1.12.0发布了TTL功能(在Alpha中),您可以将其设置为在完成后指定的秒数内自动清理作业(changelog)。您可以将其设置为零以立即清除。参见Jobs docs

文档示例:

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

答案 3 :(得分:1)

在kubernetes v1.2中,有一个垃圾收集器,用于收集具有全局阈值--terminated-pod-gc-threshold=12500的已终止pod。(请参阅controller manager中的标记。我不知道任何GC机制中的终止pod v1.1.8。您可能希望运行脚本/窗格以定期清理窗格/作业,以防止主组件被淹没。顺便说一句,automatically adjust the GC threshold存在未解决的问题。

答案 4 :(得分:1)

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

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

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