Kubemetes 中的 cron 任务通过创建 CronJob 资源进行配置。 运行任务的时间表以知名的 cron 格式指定。

在到达所有配置的时间点时, Kubemetes 将根据在 CronJob 对象中配置的 Job 模板创建 Job 资源。 创建 Job 资源时, 将根据Job的 pod 模板创建并启动一个或多个 pod 副本。

4.6.1 创建一个CronJob

实验:每15分钟运行一 次前一个示例中的批处理任务
image.png

  1. cd /root/k8s/
  2. cat >cronjob.yaml <<'EOF'
  3. apiVersion: batch/v1 #K8S1.21中api版本已经发生改变
  4. kind: CronJob
  5. metadata:
  6. name: batch-job-every-fifteen-minutes
  7. spec:
  8. schedule: "0,15,30,45 * * * *"
  9. jobTemplate:
  10. spec:
  11. template:
  12. metadata:
  13. labels:
  14. app: periodic-batch-job
  15. spec:
  16. restartPolicy: OnFailure
  17. containers:
  18. - name: main
  19. image: luksa/batch-job
  20. EOF
  21. kubectl create -f cronjob.yaml

配置时间表(schedule)

分 时 日 月 星期 #同Linux的Cron 计划任务

配置 Job 模板

CronJob通过 CronJob spec.jobTemplate属性创建Job资源。( 更多有关如何配置它的信息,请参阅4.5节。)

与Job的YAML文件中的pod template对比发现:jobTemplate.spec.template 就是 Job YAML文件中的pod模板 spec.template

4.6.2 了解计划任务的运行方式

大约到达计划的时间点时,CronJob资源会创建 Job资源,然后Job创建pod。

可能发生 Job或pod 创建并运行得相对较晚的情况。在这种情况下,可以通过指定CronJob sepc中的startingDeadlineSeconds字段来指定截止时间。
startingDeadlineSeconds:15 #pod最迟必须在预定时间之后15秒内开始运行。
image.png
在代码清单4.15的例子中,job运行的时间应该是I0:30:00。如果因为某种原因10:30:15仍未启动,job将不会运行,并将显示为Failed。

在正常情况下,CronJob总是为计划中配置的每个执行创建一个 Job, 但可能会同时创建两个Job, 或者根本没有创建。
为了解决第一个问题,你的任务应该具有幕等性(f(fx)=f(x)运行一次或多次结果相同)。
对于第二个问题,请确保下一个任务运行能完成本应该由上一次的(错过的) 运行完成的任何工作(work)。