k8s-job和cronjob
今天我们来给大家介绍另外一个资源对象job,我们在日常工作中,经常遇到一些需要进行批量数据处理和分析的需求,当然也会按照时间来进行调度的工作,我们的kubernetes集群中为我们体统了job和cronjob两种资源对象应对我们的需求job负责处理任务,即仅执行一次任务,它保证批处理任务的一个或多个pod成功结束,而cornjob则就是在job上加时间调度[root@master1 ~]# kub
今天我们来给大家介绍另外一个资源对象job,我们在日常工作中,经常遇到一些需要进行批量数据处理和分析的需求,当然也会按照时间来进行调度的工作,我们的kubernetes集群中为我们体统了job和cronjob两种资源对象应对我们的需求
job负责处理任务,即仅执行一次任务,它保证批处理任务的一个或多个pod成功结束,而cornjob则就是在job上加时间调度
[root@master1 ~]# kubectl describe job job-demo
Name: job-demo
Namespace: default
Selector: controller-uid=d7033ebb-01f9-4ace-8812-ef89c1a9b483
Labels: controller-uid=d7033ebb-01f9-4ace-8812-ef89c1a9b483
job-name=job-demo
Annotations: <none>
Parallelism: 1
Completions: 1
Start Time: Wed, 11 May 2022 04:57:22 -0400
Completed At: Wed, 11 May 2022 04:57:58 -0400
Duration: 36s
Pods Statuses: 0 Running / 1 Succeeded / 0 Failed
Pod Template:
Labels: controller-uid=d7033ebb-01f9-4ace-8812-ef89c1a9b483
job-name=job-demo
Containers:
counter:
Image: busybox
Port: <none>
Host Port: <none>
Command:
bin/sh
-c
for i in 9 8 7 6 5 4 3 2 1 ; do echo $i ;sleep 2;done
Environment: <none>
Mounts: <none>
Volumes: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 2m20s job-controller Created pod: job-demo-g6k6k
Normal Completed 104s job-controller Job completed
可以看到job对象在创建后,它的pod模板,被自动加上了一个controller-uid,一个随机字符串,这样的label标签,而这个job对象本身,则自动被加上了label对应的selector,从而保证了job与它所管理的pod之前的匹配关系,而job控制器之所以要使用这种携带了UID的label,就是为了避免不同job对象管理的pod发生重合。
[root@master1 ~]# cat job-demo.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: job-demo
spec:
template:
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 ;sleep 2;done "
我们可以看到很多pod变成了comleted状态,这是因为容器的任务执行完成正常退出了,如果任务执行失败了,如果定义了restartPolicy=OnFailure,那么任务在执行失败后job控制器就会不断的尝试创建新的pod,当然这个尝试肯定不能无线进行下去,我们可以通过job对象的spec.backofflimit字段来定义重试次数,另外需要注意的是job控制器重新创建pod的间隔是呈指数增加的
如果我们定义的restartPolicy=Never 那么任务执行失败后,job控制器就不会尝试创新pod,它会不断尝试重启pod里的容器
上面我们这里的job任务对应pod在运行结束后,会变成completed状态,但是如果执行任务的pod因为某种原因一直没有结束怎么办?同样的我们可以在job对象通过设置字段spec.activeDeadlineSenconds来限制任务运行的最长时间
spec:
activeDeadlineSeconds:100
那么当我们的任务pod运行超多了100s后,这job的所有pod都会被终止,并且pod的终止原因会变成deadlineExceeded
除此之外,我们还可以通过设置spec.parallellism参数来进程并行控制,改参数定了一个job在任意时间最多可以多个pod同时运行,spec.completions参数可以定义job至少要完成的pod数目
CronJob
CronJob其实就是在Job的基础上加上了时间角度,我们可以在给定的时间点运行一个任务,也可以周期性的给定时间点运行,这个实际上和我们linux中的crontab就非诚类似了
一个CronJob对象其实就对应中crontab文件中的一行,他根据配置的时间格式周期性的运行一个Job,格式和crontab也是一样的
crontab的格式为“ 分 时 日 月 周 comand”
分钟0-59 小时0-23 日 1-31 月 1-14 周 0-7 0和7表示星期天
现在我们用cronjob来管理我们job任务,定义如下所示的资源清单
稍微等一会就可以发现多了几个job资源对象,这个就是上面我们设置的cronjob资源对象,每一分钟执行一个新的job
一旦不需要cronjob我们可以使用kubectl 删除
kubectl delete cronjob cronjob-demo 正在创建的job不会立刻被删除
更多推荐
所有评论(0)