CronJob对于创建定期和重复任务非常有用,例如运行备份或发送电子邮件。
创建CronJob示例:
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: cronjob
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: pods
image: busybox
args:
- /bin/sh
- -c
- date; echo Hello from the kubernetes cluster.
restartPolicy: OnFailure
[@BDSZYF000132741:pod]$ kubectl get cronjobs
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
cronjob */1 * * * * False 0 23s 5m55s
[@BDSZYF000132741:pod]$ kubectl get pods
NAME READY STATUS RESTARTS AGE
cronjob-1579519500-chzvs 0/1 Completed 0 2m29s
cronjob-1579519560-lplv6 0/1 Completed 0 88s
cronjob-1579519620-rzpr2 0/1 Completed 0 28s
frontend-5778f7c84d-4lzr4 1/1 Running 0 26h
frontend-5778f7c84d-9krnn 1/1 Running 0 26h
frontend-5778f7c84d-ctlg9 1/1 Running 0 26h
frontend-5778f7c84d-klrqw 1/1 Running 0 26h
frontend-5778f7c84d-tj7xf 1/1 Running 0 26h
job1-klf4p 0/1 Completed 0 21h
liveness2 1/1 Running 0 23h
mycontainer 1/1 Running 0 46h
nginx2-dbf77bdb7-6j8ts 1/1 Running 0 34h
redis-master-6fbbc44567-jj8kt 1/1 Running 0 129d
redis-slave-74ccb764fc-j8vsx 1/1 Running 0 129d
如果一个cronjob代码出了问题——则每个job可能一直运行;
此时如果它一直启新的任务,则就会有一大批job在运行——直到耗尽pod资源。就像上图一样。
解决方案:设置Concurrency Policy
.spec.concurrencyPolicy
字段是可选的。它指定如何处理由该 cron 作业创建的作业的并发执行。需要指定以下并发策略之一:
Allow
(默认):cronjob允许同时运行作业Forbid
: cron 作业不允许并发运行;如果到了新作业运行的时间并且之前的作业运行尚未完成,则 cron 作业会跳过新作业运行Replace
:如果到了新作业运行的时间并且之前的作业运行尚未完成,则 cron 作业将用新的作业运行替换当前正在运行的作业运行请注意,并发策略仅适用于同一 cronjob创建的作业。如果有多个 cronjob,则始终允许它们各自的作业同时运行。
.spec.successfulJobsHistoryLimit
和 .spec.failedJobsHistoryLimit
字段是可选的。这些字段指定应保留多少已完成和失败的作业。默认情况下,它们分别设置为 3 和 1。将限制设置为“0”相当于在完成后不保留任何相应类型的作业。