Job
负责处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个Pod
成功结束。
而CronJob
则就是在Job
上加上了时间调度。
一、job
用Job
这个资源对象来创建一个任务,我们定一个Job
来执行一个倒计时的任务,定义YAML
文件
apiVersion: batch/v1
kind: Job
metadata:
name: job-demo
spec:
template:
metadata:
name: job-demo
spec:
restartPolicy: Never
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"
查看运行日志
#kubectl describe jobs job-demo
Name: job-demo
Namespace: default
Selector: controller-uid=7813fcb3-6d4d-4153-a32e-ed675b32e37e
Labels: controller-uid=7813fcb3-6d4d-4153-a32e-ed675b32e37e
job-name=job-demo
Pods Statuses: 1 Running / 0 Succeeded / 2 Failed
Pod Template:
Labels: controller-uid=7813fcb3-6d4d-4153-a32e-ed675b32e37e
job-name=job-demo
Containers:
counter:
Image: busybox
Port: <none>
Host Port: <none>
Command:
bin/bash
-c
for i in 9 8 7 6 5 4 3 2 1; do echo $i; done
Environment: <none>
Mounts: <none>
Volumes: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 60s job-controller Created pod: job-demo-d26wx
Normal SuccessfulCreate 42s job-controller Created pod: job-demo-tm896
Normal SuccessfulCreate 2s job-controller Created pod: job-demo-wpbcs
https://kubernetes.io/zh/docs/concepts/workloads/controllers/job/ 官网
注意Job
的RestartPolicy
仅支持Never
和OnFailure
两种,不支持Always
,我们知道Job
就相当于来执行一个批处理任务,执行完就结束了,如果支持Always
的话是不是就陷入了死循环了?
二、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
来管理我们上面的Job
任务,
我们这里的Kind
是CronJob
了,要注意的是.spec.schedule
字段是必须填写的,用来指定任务运行的周期,格式就和crontab
一样,另外一个字段是.spec.jobTemplate
, 用来指定需要运行的任务,格式当然和Job
是一致的。还有一些值得我们关注的字段.spec.successfulJobsHistoryLimit
和.spec.failedJobsHistoryLimit
,表示历史限制,是可选的字段。它们指定了可以保留多少完成和失败的Job
,默认没有限制,所有成功和失败的Job
都会被保留。然而,当运行一个Cron Job
时,Job
可以很快就堆积很多,所以一般推荐设置这两个字段的值。如果设置限制的值为 0,那么相关类型的Job
完成后将不会被保留.
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
查看cronjob
# kubectl get cronjob hello
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
hello */1 * * * * False 0 51s 3m25s
# kubectl get pod
NAME READY STATUS RESTARTS AGE
hello-1606739520-d67pb 0/1 Completed 0 87s
hello-1606739580-cpfbp 0/1 Completed 0 27s
# kubectl logs hello-1606739580-cpfbp
Mon Nov 30 12:33:25 UTC 2020
Hello from the Kubernetes cluster
https://kubernetes.io/zh/docs/tasks/job/automated-tasks-with-cron-jobs/ 使用 CronJob 运行自动化任务
当然,也可以用kubectl run
来创建一个CronJob
:
kubectl run hello --schedule="*/1 * * * *" --restart=OnFailure --image=busybox -- /bin/sh -c "date; echo Hello from the Kubernetes cluster"
$ kubectl get cronjob
NAME SCHEDULE SUSPEND ACTIVE LAST-SCHEDULE
hello */1 * * * * False 0 <none>
$ kubectl get jobs
NAME DESIRED SUCCESSFUL AGE
hello-1202039034 1 1 49s
$ pods=$(kubectl get pods --selector=job-name=hello-1202039034 --output=jsonpath={.items..metadata.name} -a)
$ kubectl logs $pods
Mon Aug 29 21:34:09 UTC 2016
Hello from the Kubernetes cluster