Kubernetes集群提供了Job
和CronJob
两种资源对象
这里使用job资源对象创建一个任务,用于倒计时:
[root@k8s-01 ~]# cat 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"
创建并检查job
[root@k8s-01 ~]# kubectl create -f job.yaml
job.batch/job-demo created
[root@k8s-01 ~]# kubectl get job
NAME COMPLETIONS DURATION AGE
job-demo 1/1 14s 48s
#COMPLETIONS 任务状态
#DURATION 持续时间
查看一下Pod状态
[root@k8s-01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
job-demo-h4vl4 0/1 Completed 0 73s
#job任务执行完毕后状态就变更为Completed(完成状态),不会像其他pod属于running状态
用describe
查看job的详细信息
[root@k8s-01 ~]# kubectl describe job job-demo
Name: job-demo
Namespace: default
Selector: controller-uid=19c3a4fe-ae3f-4a45-a665-1be61a3a484c
Labels: controller-uid=19c3a4fe-ae3f-4a45-a665-1be61a3a484c
job-name=job-demo
Annotations: <none>
Parallelism: 1
Completions: 1
Start Time: Wed, 13 May 2020 14:00:36 +0800
Completed At: Wed, 13 May 2020 14:00:50 +0800
Duration: 14s
Pods Statuses: 0 Running / 1 Succeeded / 0 Failed
Pod Template:
Labels: controller-uid=19c3a4fe-ae3f-4a45-a665-1be61a3a484c
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;done
Environment: <none>
Mounts: <none>
Volumes: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 3m31s job-controller Created pod: job-demo-h4vl4
还可以通过pod日志,查看pod运行状态:
[root@k8s-01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
job-demo-h4vl4 0/1 Completed 0 4m41s
[root@k8s-01 ~]# kubectl logs job-demo-h4vl4
9
8
7
6
5
4
3
2
1
只有job执行完毕后,STATUS的状态才为Complete,没有执行完毕的状态为Running。
注意:Job Pod类型中的RestartPolicy (pod重启策略)仅支持Never和OnFailure两种,不支持Always,Job就相当于来执行一批处理任务,执行完就结束,如果支持Always(一直重启,直到pod健康)就会陷入死循环
Cronjob其实就是在Job的基础上加上了时间调度,我们可以在指定的时间点运行一个类似于任务,也可以周期性的在指定时间点运行。这个实际上和Linux中的crontab非常类似。一个CronJob对象其实就是对应crontab中的一行,根据时间配置格式周期运行一个Job,配置格式和crontab相同。
接下来创建一个每隔2分钟打印数字的定时任务
[root@k8s-01 ~]# cat cronjob.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: cronjob-demo
spec:
schedule: "*/2 * * * *" #这里需要添加一个时间调度的周期,和crontab调度是一样的,这也是主要和job任务的区别,同时这里也不需要添加执行的命令
jobTemplate: #cronjob实际上下面就是用的job配置,这里可以直接将上面job的配置复制过来即可
spec:
template:
metadata:
name: cronjob-demo #pod名称
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"
创建
[root@k8s-01 ~]# kubectl create -f cronjob.yaml
cronjob.batch/cronjob-demo created
创建完毕后可以通过下面的方式进行查看
[root@k8s-01 ~]# kubectl get cronjob
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
cronjob-demo */2 * * * * False 1 19s 4m47s
[root@k8s-01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
cronjob-demo-1589350440-2s6v5 0/1 Completed 0 4m19s
cronjob-demo-1589350560-5xfkg 0/1 Completed 0 2m18s
cronjob-demo-1589350680-lsbcd 0/1 Completed 0 18s
[root@k8s-01 ~]# kubectl get job
NAME COMPLETIONS DURATION AGE
cronjob-demo-1589350440 1/1 4s 4m26s
cronjob-demo-1589350560 1/1 12s 2m25s
cronjob-demo-1589350680 1/1 13s 25s
可以看到,每2分钟执行一次job,执行完毕job后状态会进行保留。通过get jobs和get pod都可以看到。
我们需要给cronjob设置一个历史记录限制,否则jobs会一直增加(1.14版本默认只保留3个)
在spec下面添加如下2条内容,自定义历史记录限制
successfulJobsHistoryLimit: 5 #成功保留次数
failedJobsHistoryLimit: 10 #失败保留次数