如何为 Kubernetes 作业设置时间限制?
Posted
技术标签:
【中文标题】如何为 Kubernetes 作业设置时间限制?【英文标题】:How to set a time limit for a Kubernetes job? 【发布时间】:2017-12-10 20:48:36 【问题描述】:我想启动一个 Kubernetes 作业并给它一个固定的完成期限。如果截止日期到来时 pod 仍在运行,我希望自动终止该作业。
这样的东西存在吗? (起初我认为 Job 规范的 activeDeadlineSeconds
涵盖了这个用例,但现在我看到 activeDeadlineSeconds
只对重新尝试工作的时间设置了限制;它不会主动杀死缓慢/失控的工作。 )
【问题讨论】:
利用活性探针怎么样?您可以创建一个探测器,在您需要的时间内返回成功,并且在达到最后期限后,它将返回失败(1)并杀死容器。更多关于活性探针的信息:kubernetes.io/docs/tasks/configure-pod-container/… 我认为这实际上是一个非常好的功能请求。它是否在 Kubernetes Github 中被跟踪? 【参考方案1】:您可以使用 GNU timeout
实用程序在容器的入口点命令上自行设置超时。
例如,以下计算 pi 前 4000 位数字的作业将在 10 秒后超时:
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
metadata:
name: pi
spec:
containers:
- name: pi
image: perl
command: ["/usr/bin/timeout", "10", "perl", "-Mbignum=bpi", "-wle", "print bpi(4000)"]
restartPolicy: Never
(清单采用自https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/#running-an-example-job)
您可以玩这些数字,看看它是否超时。通常在我的工作站上计算 4000 位 pi 需要大约 23 秒,所以如果你将它设置为 5 秒,它可能总是会失败,如果你将它设置为 120 秒,它总是会工作。
【讨论】:
谢谢!我非常喜欢这个,尽管它强制 pod 模板了解图像的默认命令,而不仅仅是 running 图像。这有点不幸,但绝对是一个可行的解决方案。 仅供参考,您始终可以为参数创建变量,例如$TIMEOUT
,其值来自 ConfigMap 挂载,因此您不必硬编码。这样您就可以在 ConfigMap 中对其进行修改,新作业将使用新值。
这很好——尽管规范仍然需要知道图像的默认命令。
使用timeout
cli 是一种很好的处理方式,我完全过度设计了它(blog.random.io/k8s-cronjob-with-execution-timeout)
我通常将 yaml 的 command:
部分以 bash -c
结尾,然后将您关心的命令放在 args:
部分。这样command
永远不会改变,并且在args
中编写自然命令行更容易,因为它不需要任何尴尬的引用。【参考方案2】:
根据我对activeDeadlineSeconds
部分文档的理解,它指的是作业的活动时间,在此时间之后,作业被视为Failed
。
官方文档声明:
activeDeadlineSeconds 适用于作业的持续时间,无论创建了多少 Pod。一旦 Job 达到 activeDeadlineSeconds,所有正在运行的 Pod 都将被终止,并且 Job 状态将变为 type: Failed with reason: DeadlineExceeded
https://kubernetes.io/docs/concepts/workloads/controllers/job/#job-termination-and-cleanup
【讨论】:
以上是关于如何为 Kubernetes 作业设置时间限制?的主要内容,如果未能解决你的问题,请参考以下文章