kubernetes:Cronjobs属性failedJobsHistoryLimit不生效,不能自动清理状态为Error的Pod
Cronjobs属性failedJobsHistoryLimit不生效
问题现象
在 《Kubernetes: Job 和 CronJob 的实现原理》一文中,我们提到cron中有如下属性可以设置任务保留个数
(1.8版本后).spec.successfulJobsHistoryLimit
和.spec.failedJobsHistoryLimit
是可选的。 这两个域声明了有多少执行完成和失败的任务会被保留。 默认设置为3和1。限制设置为0代表相应类型的任务完成后不会保留。- 特别注意:
1.8版本之前,是保留所有的历史job
- 但是,当我们设置Cronjobs属性failedJobsHistoryLimit为2(默认为1),他并没有自动清理状态为Error的Pod,
- 错误pod的增多,导致不停占用我们node节点的cpu和memory资源,甚至造成资源耗尽。
问题解决
在job中添加如下两个属性:
- activeDeadlineSeconds标志失败Pod的重试最大时间,超过这个时间不会继续重试
- backoffLimit 就是来保证一个 Job 到底能重试多少次。Job 在运行的时候不可能去无限的重试,所以我们需要一个参数来控制重试的次数。
注意:backoffLimit,默认是6。如果需要修改backoffLimit值,同时需要设置restartPolicy为Never,如果设置restartPolicy为OnFailure,当job失败时达到backoffLimit的重试次数,就会停止job运行。
- restartPolicy,在 Job 里面我们可以设置 Never、OnFailure、Always 这三种重试策略。在希望 Job 需要重新运行的时候,我们可以用 Never;希望在失败的时候再运行,再重试可以用 OnFailure;或者不论什么情况下都重新运行时 Alway
参考链接:
https://kubernetes.io/zh/docs/tasks/job/automated-tasks-with-cron-jobs/
https://github.com/kubernetes/kubernetes/issues/53331
https://github.com/kubernetes/kubernetes/issues/52390