如何为 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 作业设置时间限制?的主要内容,如果未能解决你的问题,请参考以下文章

Pentaho 水壶:如何为转换/作业设置测试?

如何为codeigniter设置cron作业url?

如何为服务器上的 codeigniter 脚本设置 cron 作业

如何为录音设置 60 秒的限制

如何为网络爬虫设置有效的 cron 作业

如何为从库中选择的视频设置持续时间限制