Kubernetes 作业清理

Posted

技术标签:

【中文标题】Kubernetes 作业清理【英文标题】:Kubernetes Job Cleanup 【发布时间】:2016-07-22 22:41:00 【问题描述】:

据我了解,Job 对象应该在一定时间后获取 pod。 但是在我的 GKE 集群(Kubernetes 1.1.8)上,“kubectl get pods -a”似乎可以列出几天前的 pod。

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

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

我在这里主要关心的是我要在集群上以批处理作业的方式运行成千上万个 Pod,并且不希望内部积压系统过载。

【问题讨论】:

【参考方案1】:

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

successfulJobsHistoryLimit: X
failedJobsHistoryLimit: Y

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

编辑2018-09-29

对于较新的 K8S 版本,此处包含相关文档的更新链接:

CronJob - Job History Limits

CronJob API Spec

【讨论】:

小修正至少1.6版!使用kubectl version 确保服务器和客户端都是 1.6 版 截至 18 年 8 月 21 日,您可以在此处 (kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs) 找到文档。【参考方案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

【讨论】:

你测试了吗?我正面临这个错误github.com/kubernetes/kubernetes/issues/70685 它应该是首选解决方案,但仍处于 alpha 阶段,需要一些额外的工作,如启用功能门和重新启动 apiserver,因此在 ELK 或 DO 等托管解决方案中并不总是可行。 它依赖于 TTL 控制器,这是 v1.21 的一个特性。每kubernetes.io/docs/concepts/workloads/controllers/…【参考方案3】:

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

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

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

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

【参考方案5】:

在 kubernetes v1.2 中,有一个垃圾收集器,用于以全局阈值 --terminated-pod-gc-threshold=12500 收割终止的 pod(请参阅controller manager 中的标志。我不知道 v1.1.8 中有任何用于终止 pod 的 GC 机制。您可能需要运行脚本/pod 来定期清理 pod/jobs,以防止主组件不堪重负。顺便说一下,automatically adjust the GC threshold 有一个未解决的问题。

【讨论】:

以上是关于Kubernetes 作业清理的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes 清理 pod、服务、部署等

Kubernetes - 作业调度 API

kubernetes清理集群

kubernetes清理集群

kubernetes清理集群

kubernetes/docker 上的 gitlab:管道失败:清理 configmap 时出错:资源名称可能不为空