K8s v1.16设置Job ttlSecondsAfterFinished不生效

 
更多

在Kubernetes中,Job是用来运行短暂任务的一种资源对象。它负责确保该任务成功完成,且仅执行一次。然而,在某些情况下,我们希望自动删除已完成的Job资源,以便节省集群资源。为了实现此目的,Kubernetes引入了ttlSecondsAfterFinished字段,它允许我们设置一个时间窗口,在该窗口内,如果Job已经完成,则会自动删除Job资源。然而,在某些版本的Kubernetes中,这个字段似乎不起作用,无法自动删除Job资源。在本文中,我们将探讨这个问题。

问题的出现

尽管正确地设置了ttlSecondsAfterFinished字段,我们发现Job资源并没有自动删除。一开始,我们会怀疑是在配置文件中出现了什么错误,但在仔细检查后并未发现问题。接下来,我们检查了Kubernetes集群本身的配置,确保没有禁用相关的特性。我们还尝试在不同的版本上运行相同的Job,但结果依然一样。最终,我们发现了这个问题。

原因分析

经过一番研究,我们发现在Kubernetes v1.16中,当Job资源被标记为已完成时,它的状态会变为”Completed”,而不是”Terminated”。因此,Job控制器无法识别已经完成的Job,从而无法删除这些资源。

工作的解决方案

虽然Kubernetes v1.16中的Job ttlSecondsAfterFinished字段不能正常工作,但是我们可以使用其他方式来自动删除已完成的Job资源。

首先,我们可以编写一个CronJob,定期清理已完成的Job资源。我们可以使用kubectl命令行工具来执行清理操作,并在CronJob中运行该命令。例如,我们可以创建一个名为”job-cleanup”的CronJob,每隔一段时间执行如下命令:

kubectl delete jobs --field-selector status.succeeded=true

这个命令将会删除所有状态为”Completed”的Job资源。

另外,我们还可以使用Kubernetes的事件机制来实现Job资源的自动清理。我们可以编写一个控制器来监听Job完成的事件,并在事件发生时,删除已完成的Job资源。这种方式需要编写一些自定义代码,但可以更加灵活地控制Job资源的清理行为。

未来可能的修复方案

很明显,Kubernetes v1.16中的Job ttlSecondsAfterFinished字段存在问题。虽然我们可以通过其他方式来解决这个问题,但希望Kubernetes开发团队能够在后续版本中修复这个bug。

总结

Kubernetes的Job资源提供了一种运行短暂任务的机制,并且通常能够通过设置ttlSecondsAfterFinished字段来自动删除已完成的Job。然而,在Kubernetes v1.16中,我们发现这个字段并不起作用。我们可以通过编写CronJob或自定义控制器来手动实现Job资源的清理。希望在将来的版本中能够修复这个问题,以提供更好的自动清理机制。

打赏

本文固定链接: https://www.cxy163.net/archives/8224 | 绝缘体

该日志由 绝缘体.. 于 2020年04月19日 发表在 未分类 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: K8s v1.16设置Job ttlSecondsAfterFinished不生效 | 绝缘体
关键字: , , , ,

K8s v1.16设置Job ttlSecondsAfterFinished不生效:等您坐沙发呢!

发表评论


快捷键:Ctrl+Enter