繁体   English   中英

如何让 kubernetes cronjob 重试?

[英]How do I get a kubernetes cronjob to retry?

我有 cronjob,它启动的 pod 以ImagePullBackOff结束,而 cronjob 从未安排过另一个 pod ,尽管它必须按计划进行。 有没有办法强制 cron 控制器调度另一个 pod,即使前一个 pod 以 ImagePullBackOff 结束。

我不希望多个 pod 同时运行,所以使用concurrencyPolicy: Forbid Forbid ,有没有办法让 CronJob 仍然安排另一个 pod ?

您真的不希望调度程序安排另一个 pod。 这样做会导致资源泄漏,如Infinite ImagePullBackOff CronJob 中所述导致资源泄漏,@VonC 在他的回答中提到了这一点。

相反,您应该专注于解决导致 pod 位于ImagePullBackOff中的根本原因。 一旦完成,Kubernetes 将自动拉取镜像,运行 pod,一旦 cron 计划完成,就会安排一个新的。

ImagePullBackoff表示容器无法启动,因为无法检索到图像。 原因可能是例如无效的图像 ID 或标签、丢失或无效的imagePullSecret或网络连接问题。

当 Pod 在ImagePullBackoff中时,kubernetes 会定期重试拉取镜像,一旦成功拉取镜像,Pod 就会启动。

文档中所述,每次尝试( BackOff )都会增加拉取尝试之间的延迟

Kubernetes 会提高每次尝试之间的延迟,直到达到编译限制,即 300 秒(5 分钟)。

使用concurrencyPolicy: Forbid是该“功能”的解决方法之一(在 ImagePulledBackof 之后重新安排 pod)。

请参阅kubernetes/kubernetes issue 76570 ,它说明了所述功能的一个缺点:

发生了什么:

没有ConcurrencyPolicy或历史限制的CronJob使用不存在的图像将慢慢消耗几乎所有集群资源。
在我们的集群中,我们开始在所有节点上达到 pod 限制,并开始失去调度新 pod 的能力。

你期望发生的事情:

即使没有ConcurrencyPolicyCronJob也应该具有与大多数其他 pod 调度程序相同的行为。
如果我尝试使用 X 副本开始部署,并且在 pod 中的一个容器上获得ImagePullBackOff ,则部署不会继续尝试在不同节点上安排更多 pod,直到它消耗所有集群资源。

这对CronJob来说尤其糟糕,因为与必须设置水平可扩展性上限的Deployment不同,没有历史限制和ConcurrencyPolicyCronJob将慢慢消耗集群上的所有资源。

虽然这是有争议的,但我个人会说,当计划的 Job 出现ImagePullBackOff错误时,它不应该尝试继续安排新的 pod。 它可能应该杀死试图拉取图像并制作新的 pod,或者等待 pod 成功拉取图像。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM