K8s系列之:Cronjob定时任务
K8s新类型的Job,类似Linux Cron的定时任务Cron Job。
在API Server的启动进程上增加以下配置参数并重启:
--runtime-config=batch/v2alpha1=true
Cron Job的定时表达式,基本上照搬了Linux Cron的表达式,区别是第1位是分钟而不是秒,格式如下:
Minutes Hours DayofMonth Month DayofWeek Year
每一个域可出现的字符如下:
- Minutes:可出现",-*/"这4个字符,有效范围为0-59的整数
- Hours:可出现",-*/"这4个字符,有效范围0-23的整数
- DayofMonth:可出现",-*/?LWC"这8个字符,有效范围为0-31的整数
- Month:可出现",-*/"这4个字符,有效范围为1-12的整数或JAN-DEC。
- DayofWeek:可出现",-*/?LC#"这8个字符,有效范围为1-7的整数或SUN-SAT两个范围。1表示星期天,2表示星期一,以此类推。
表达式的特殊字符"*“与”/"的含义如下:
- *:表示匹配该域的任意值,假如在Minutes域使用*则表示每分钟都会触发事件。
- /:表示起始时间开始触发,然后每隔固定时间触发一次,例如在Minutes域设置为5/20,则意味着第1次出发在第5min时接下来每20min触发一次,将在第25min、第45min等时刻分别触发。
- 比如每隔1min执行一次任务,则Cron表达式如下:*/1 * * * *
编写一个Cron Job的配置文件
cron.yaml
apiVersion: batch/v2alpha1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
containers:
- name: hello
image: busybox
args:
- /bin/sh
- -c
- date;echo Hello from the Kubernetes cluster
restartPolicy: OnFailure
定义了一个名为hello的Cron Job,任务每隔1min执行一次,运行的镜像是busybox,执行的命令是shell脚本,脚本执行时会在控制台输出当前时间和字符串"hello from the kubernetes cluster"
执行kubectl create命令完成创建:
kubectl create -f cron.yaml
cronjob "hello" created
每隔1min执行kubectl get cronjob hello查看任务状态,发现的确是每分钟调度了一次
kubectl get cronjob hello
NAME SCHEDULE SUSPEND ACTIVE LAST_SCHEDULE
hello */1 * * * * False 0
还可以通过查找Cron Job对应的容器,验证每隔1min产生一个容器的事实,如下所示:
docker ps -a | grep busybox
查看任意一个容器的日志,结果如下
docker logs 83f7b86728ea
运行下面的命令,可以更加直观地了解Cron Job定期触发任务执行的历史和现状:
kubectl get jobs --watch
NAME DESIRED SUCCESSFUL AGE
hello-14852 1 1 31m
hello-25930 1 1 30m
查看具体的Pod可以通过下面方式:
kubectl get pods --show-all | grep hello-14852
当不需要某个Cron Job时,可以通过下面的命令删除
kubectl delete cronjob hello