Kubemetes 中的 cron 任务通过创建 CronJob 资源进行配置。 运行任务的时间表以知名的 cron 格式指定。
在到达所有配置的时间点时, Kubemetes 将根据在 CronJob 对象中配置的 Job 模板创建 Job 资源。 创建 Job 资源时, 将根据Job的 pod 模板创建并启动一个或多个 pod 副本。
4.6.1 创建一个CronJob
实验:每15分钟运行一 次前一个示例中的批处理任务
cd /root/k8s/
cat >cronjob.yaml <<'EOF'
apiVersion: batch/v1 #K8S1.21中api版本已经发生改变
kind: CronJob
metadata:
name: batch-job-every-fifteen-minutes
spec:
schedule: "0,15,30,45 * * * *"
jobTemplate:
spec:
template:
metadata:
labels:
app: periodic-batch-job
spec:
restartPolicy: OnFailure
containers:
- name: main
image: luksa/batch-job
EOF
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秒内开始运行。
在代码清单4.15的例子中,job运行的时间应该是I0:30:00。如果因为某种原因10:30:15仍未启动,job将不会运行,并将显示为Failed。
在正常情况下,CronJob总是为计划中配置的每个执行创建一个 Job, 但可能会同时创建两个Job, 或者根本没有创建。
为了解决第一个问题,你的任务应该具有幕等性(f(fx)=f(x)运行一次或多次结果相同)。
对于第二个问题,请确保下一个任务运行能完成本应该由上一次的(错过的) 运行完成的任何工作(work)。