Job是执行一次性任务,而CronJob执行周期性作业。

CronJob和Job之间的关系类似于,Deployment和replicaSet之间的关系,CronJob需要借助于Job控制器来完成其功能的。

所以CronJob是通过Job来控制Pod,而非直接控制Pod

CronJob资源定义规范

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
apiVersion: batch/v1beta1  # API群组及版本
kind: CronJob # 资源类型特有标识
metadata:
name <string> # 资源名称,在作用域中要唯一
namespace <string> # 名称空间;CronJob资源隶属名称空间级别
spec:
jobTemplate <Object> # job作业模板,必选字段
metadata <object> # 模板元数据
spec <object> # 作业的期望状态
schedule <string> # 调度时间设定,必选字段
concurrencyPolicy <string> # 并发策略,可用值有Allow、Forbid和Replace
failedJobsHistoryLimit <integer> # 失败作业的历史记录数,默认为1
successfulJobsHistoryLimit <integer> # 成功作业的历史记录数,默认为3
startingDeadlineSeconds <integer> # 因错过时间点而未执行的作业的可超期时长
suspend <boolean> # 是否挂起后续的作业,不影响当前作业,默认为false

CronJob示例

1.编写资源清单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
root@k8s-master01:~/yaml/chapter08# vim cronjob-demo.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: cronjob-demo
namespace: default
spec:
schedule: "*/2 * * * *"
jobTemplate:
metadata:
labels:
controller: cronjob-demo
spec:
parallelism: 1
completions: 1
ttlSecondsAfterFinished: 600
backoffLimit: 3
activeDeadlineSeconds: 60
template:
spec:
containers:
- name: myjob
image: alpine
command: ["/bin/sh","-c","data; echo hello from CronJob, sleep a while...; sleep 10"]
restartPolicy: OnFailure
startingDeadlineSeconds: 300

2.应用配置清单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
root@k8s-master01:~/yaml/chapter08# kubectl apply -f cronjob-demo.yaml
Warning: batch/v1beta1 CronJob is deprecated in v1.21+, unavailable in v1.25+; use batch/v1 CronJob
cronjob.batch/cronjob-demo created

# get下cronjob
root@k8s-master01:~/yaml/chapter08# kubectl get cronjobs.batch
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
cronjob-demo */2 * * * * False 0 97s 117s

# get下job
root@k8s-master01:~/yaml/chapter08# kubectl get job
NAME COMPLETIONS DURATION AGE
cronjob-demo-27116788 1/1 25s 2m27s
cronjob-demo-27116790 0/1 27s 27s