Job与Cron Job
2023-12-05
Job 控制器
# job-demo.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: job-demo
spec:
template:
spec:
restartPolicy: Never # 只支持 Never 和 OnFailure 两种
containers:
- name: counter
image: busybox
command:
- "bin/sh"
- "-c"
- "for i in 9 8 7 6 5 4 3 2 1; do echo $i; done"
Job 就是 Pod 的一种形式,用于执行一些临时任务的存在,Job 与 Pod 的不同之处在于,它不需要一直启动,当任务结束时,Job 就该处于完结状态。
在实例中 RestartPolicy 只支持 Never 和 OnFailure 两种,不支持 Always。
设置成 Never 重启策略的时候,Job 任务执行失败后会不断创建新的 Pod,但是不会一直创建下去,会根据 spec.backoffLimit 参数进行限制,默认为6,通过该字段可以定义重建 Pod 的次数,另外需要注意的是 Job 控制器重新创建 Pod 的间隔是呈指数增加的,即下一次重新创建 Pod 的动作会分别发生在 10s、20s、40s… 后。
但是如果我们设置的 restartPolicy: OnFailure 重启策略,则当 Job 任务执行失败后不会创建新的 Pod 出来,只会不断重启 Pod。
[root@kube01 job]# kubectl apply -f job.yaml
job.batch/job-demo created
[root@kube01 job]# kubectl get pod
NAME READY STATUS RESTARTS AGE
job-demo-ck895 0/1 Completed 0 43s
[root@kube01 job]# kubectl logs -f job-demo-ck895
9
8
7
6
5
4
3
2
1
CronJob 控制器
# cronjob-demo.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: cronjob-demo
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
restartPolicy: OnFailure
containers:
- name: hello
image: busybox
args:
- "bin/sh"
- "-c"
- "for i in 9 8 7 6 5 4 3 2 1; do echo $i; done"
CronJob 比 Job 多了一个定是任务选项,实例中 */1 * * * *
是每分钟执行一次。
crontab 的格式为:分 时 日 月 星期 要运行的命令,跟 linux 定时任务格式一致
需要注意的是定时任务每分钟执行一次,Pod 列表里数据不删除的情况下会越来越多,所以需要设置 .spec.successfulJobsHistoryLimit
(默认为3) 与 .spec.failedJobsHistoryLimit
(默认为1),如果设置限制的值为 0,那么相关类型的 Job 完成后将不会被保留。