K8s 离线作业:Job与CronJob

Posted sjlinux

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了K8s 离线作业:Job与CronJob相关的知识,希望对你有一定的参考价值。

Job API 对象的定义

K8s

一次性任务,执行完成后自动退出。

  1. spec.parallelism,它定义的是一个 Job 在任意时间最多可以同时启动多少个 Pod 运行;

  2. spec.completions,它定义的是 Job 至少要完成的 Pod 数目,即 Job 的最小完成数。

restartPolicy 在 Job 对象里只允许被设置为 Never 和 OnFailure,当restartPolicy=Never,离线作业正常结束永远不会被重启;

restartPolicy=Never,离线作业失败后 Job Controller 就会不断地尝试创建一个新 Pod,创建次数默认是6次,可通过

spec.backoffLimit 字段来设置重启次数;

当​restartPolicy=OnFailure,那么离线作业失败后,Job Controller 就不会去尝试创建新的 Pod。但是,它会不断地尝试重启 Pod 里的容器。

spec.activeDeadlineSeconds 字段可以设置最长运行时间,一旦超过这个时间,Job 的所有 Pod 都会被终止,并且,你可以在 Pod 的状态里看到终止的原因是 reason: DeadlineExceeded。

CronJob 与 Job 的关系,正如同 Deployment 与 Pod 的关系一样。CronJob 是一个专门用来管理 Job 对象的控制器。它创建和删除 Job 的依据,是 schedule 字段定义的、一个标准的​​​Unix Cron​格式的表达式。

K8s

需要注意的是,由于定时任务的特殊性,很可能某个 Job 还没有执行完,另外一个新 Job 就产生了。这时候,你可以通过 spec.concurrencyPolicy 字段来定义具体的处理策略。比如:

  1. concurrencyPolicy=Allow,这也是默认情况,这意味着这些 Job 可以同时存在;

  2. concurrencyPolicy=Forbid,这意味着不会创建新的 Pod,该创建周期被跳过;

  3. concurrencyPolicy=Replace,这意味着新产生的 Job 会替换旧的、没有执行完的 Job。

而如果某一次 Job 创建失败,这次创建就会被标记为“miss”。当在指定的时间窗口内,miss 的数目达到 100 时,那么 CronJob 会停止再创建这个 Job。

这个时间窗口,可以由 spec.startingDeadlineSeconds 字段指定。比如 startingDeadlineSeconds=200,意味着在过去 200 s 里,如果 miss 的数目达到了 100 次,那么这个 Job 就不会被创建执行了。


以上是关于K8s 离线作业:Job与CronJob的主要内容,如果未能解决你的问题,请参考以下文章

k8s中job与cronjob使用详解

k8s使用job和cronjob控制器管理pod

k8s 实践经验job && CronJob

原创k8s之job和Cronjob

k8s的 Job/CronJob资源对象及添加api版本

k8s cronjob 启动顺序