Job
我们在日常的工作中经常都会遇到一些需要进行批量数据处理和分析的需求,当然也会有按时间来进行调度的工作,在Kubernetes集群中为我们提供了Job和CronJob两种资源对象来应对这种需求。
Job负责处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束。而CronJob则就是在Job上加上了时间调度。
apiVersion: batch/v1
kind: Job
metadata:
labels:
job-name: echo
name: echo
namespace: default
spec:
suspend: true # 1.21+
ttlSecondsAfterFinished: 100 # Job在执行结束之后(状态为completed或Failed)自动清理。设置为0表示执行结束立即删除,不设置则不会清除,需要开启TTLAfterFinished特性
backoffLimit: 4 # 如果任务执行失败,失败多少次后不再执行
completions: 1 # 有多少个Pod执行成功,认为任务是成功的,为空默认和parallelism数值一样
parallelism: 1 # 并行执行任务的数量,如果parallelism数值大于未完成任务数,只会创建未完成的数量;比如completions是4,并发是3,第一次会创建3个Pod执行任务,第二次只会创建一个Pod执行任务
template:
spec:
containers:
- command:
- echo
- Hello, Job
image: registry.cn-beijing.aliyuncs.com/dotbalo/busybox
imagePullPolicy: Always
name: echo
resources: {}
restartPolicy: Never
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列要运行的命令
apiVersion: batch/v1beta1 # batch/v1beta1 #1.21+ batch/v1
kind: CronJob
metadata:
labels:
run: hello
name: hello
namespace: default
spec:
concurrencyPolicy: Allow # 并发调度策略。可选参数如下
# Allow:允许同时运行多个任务。
# Forbid:不允许并发运行,如果之前的任务尚未完成,新的任务不会被创建。
# Replace:如果之前的任务尚未完成,新的任务会替换的之前的任务。
failedJobsHistoryLimit: 1 # 保留多少失败的任务
jobTemplate:
metadata:
spec:
template:
metadata:
labels:
run: hello
spec:
containers:
- args:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
image: registry.cn-beijing.aliyuncs.com/dotbalo/busybox
imagePullPolicy: Always
name: hello
resources: {}
restartPolicy: OnFailure # 重启策略,和Pod一致
securityContext: {}
schedule: '*/1 * * * *' # 调度周期,和Linux一致,分别是分时日月周。
successfulJobsHistoryLimit: 3 # 保留多少已完成的任务,按需配置
suspend: false # 如果设置为true,则暂停后续的任务,默认为false。