根据我的理解,Job对象应该在一定时间后收获pod。 但是在我的GKE集群(Kubernetes 1.1.8)上,似乎" kubectl得到了pods -a"可以从几天前列出pods。
所有都是使用Jobs API创建的。
我确实注意到删除作业后 kubectl删除工作 豆荚也被删除了。
我主要担心的是,我将在批处理作业中运行数千和数万个集群,并且不想超载内部积压系统。
答案 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,如果它们完成且没有错误/重新启动。