Job
批处理任务通常并行(或者串行)启动多个计算进程去处理一批工作项(work item),在处理完成后,整个批处理任务结束。
Job也是一种特殊的Pod副本自动控制器。Job所控制的Pod副本都仅仅运行一次。当Job控制的所有Pod副本都运行结束时,对应的Job也就结束了。
资源清单 (job-demo.yaml)
apiVersion: batch/v1kind: Jobmetadata:name: job-demospec:template:spec:restartPolicy: Never #执行失败后不断地创建一个新Pod。若值为OnFailure,则执行失败后不会创建新Pod,而是不断地重启Pod里的容器。containers:- name: counterimage: busyboxcommand:- "bin/sh"- "-c"- "for i in 9 8 7 6 5 4 3 2 1; do echo $i; done"
创建
$ kubectl apply -f job-demo.yaml
$ kubectl get job
NAME COMPLETIONS DURATION AGE
job-demo 1/1 26s 3m4s
# 显示 Completed 状态,因为容器的任务执行完成正常退出了
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
job-demo-frs2r 0/1 Completed 0 2m41s
$ kubectl logs -f job-demo-s5442
9
8
7
6
5
4
3
2
1
Job 任务对应的 Pod 在运行结束后,会变成 Completed 状态。字段 spec.activeDeadlineSeconds 可限制任务运行的最长时间,当任务 Pod 运行超过了设置的限制时间时,此 Job 的所有 Pod 都会被终止,Pod 会变成 DeadlineExceeded 状态。
字段 spec.parallelism 可进行并行控制,该参数定义了一个 Job 在任意时间最多可以有多少个 Pod 同时运行。
CronJob
CronJob 是在 Job 的基础上加上了时间调度,类似于 Linux 中的 crontab 。一个 CronJob 对象对应 crontab 文件中的一行,它根据配置的时间格式周期性地运行一个Job,格式和 crontab 也是一样的。
Crontab 的格式为:分 时 日 月 星期 要运行的命令
- 第1列分钟0~59
- 第2列小时0~23
- 第3列日1~31
- 第4列月1~12
- 第5列星期0~7(0和7表示星期天)
- 第6列要运行的命令
示例资源清单 (cronjob-demo.yaml)
apiVersion: batch/v1beta1
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"
应用
# 创建
$ kubectl create -f cronjob-demo.yaml
# 查看
$ kubectl get cronjob
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
cronjob-demo */1 * * * * False 0 <none> 7s
# $ kubectl get job
NAME COMPLETIONS DURATION AGE
cronjob-demo-1574147280 1/1 6s 2m45s
cronjob-demo-1574147340 1/1 11s 105s
cronjob-demo-1574147400 1/1 5s 45s
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
cronjob-demo-1574147340-ksd5x 0/1 Completed 0 3m7s
cronjob-demo-1574147400-pts94 0/1 Completed 0 2m7s
cronjob-demo-1574147460-t5hcd 0/1 Completed 0 67s
cronjob-demo-1574147520-vmjfr 0/1 ContainerCreating 0 7s
# 删除
$ kubectl delete cronjob cronjob-demo
