Cronjob从名字上能够看到,它就是一个计划任务,与Linux中的crontab无异,其格式基本上都crontab同样,docker
其格式以下: ubuntu
Minutes Hours DayofMonth Month DayofWeek Yea
支持 ", - * / "四个字符,api
*:表示匹配任意值,若是在Minutes 中使用,表示每分钟bash
/: 表示起始时间开始触发,而后每隔固定时间触发一次,ide
例如在Minutes 设置的是5/20,则表示第一次触发是在第5min时,接下来每20min触发一次,3d
即,第25min,45min等时刻触发rest
示例:好比每隔1min执行一次任务:则Cron 表达式以下:日志
*/1 * * * *
如今编写一个Cronjob资源对象来执行job: 对象
Cronjob 在Kubernetes1.8版本以前使用的API版本是batch/v2alpha1, 须要在API Server启动时启用此功能:crontab
--runtime-config=batch/v2alpha1=true
在版本>1.8后,API版本已转为batch/v1beta1,而且默认启用。
apiVersion: batch/v1beta1 kind: CronJob metadata: name: hello #Cronjob的名称 spec: schedule: "*/1 * * * *" #job执行的周期,cron格式的字符串 jobTemplate: #job模板 spec: template: spec: containers: - name: hello-cronjob image: 10.3.1.15:5000/ubuntu:16.04 command: ["bash","-c","date;echo Hello from the Kubernetes cluste"] #job具体执行的任务 restartPolicy: OnFailure
建立并查看任务状态:
root@ubuntu15:# kubectl get cronjob NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE hello */1 * * * * False 0 <none> #刚建立尚未活跃的工做,也没有计划任何工做
而后,每隔一分钟执行kubectl get cronjob hello 查看任务状态,发现的确是每分钟调度了一次。
root@ubuntu# kubectl get cronjob hello NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE hello */1 * * * * False 1 Thu, 01 Feb 2018 06:22:00 +0000 root@ubuntu15:/data/yaml# kubectl get cronjob hello NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE hello */1 * * * * False 0 Thu, 01 Feb 2018 06:22:00 +0000 #能够看到在指定的时间内已成功执行了一个job,在LAST-SCHEDULE,目前有0个活动做业,意味着做业已完成或失败。
经过在Node查找Cronjob对应的容器,能够看到每隔一分钟产生一个容器,执行完后就会正常退出,而不会再重启容器。
root@ubuntu:/# docker ps -a |grep hello-cronjob 94f0e79db981 10.3.1.15:5000/ubuntu "bash -c 'date;ech..." 11 seconds ago Exited (0) 11 seconds ago k8s_hello-cronjob_hello-15174... 3d79b4e4a8f0 10.3.1.15:5000/ubuntu "bash -c 'date;ech..." About a minute ago Exited (0) About a minute ago k8s_hello-cronjob_hello-15176... f5d99c855c77 10.3.1.15:5000/ubuntu "bash -c 'date;ech..." 2 minutes ago Exited (0) 2 minutes ago k8s_hello-cronjob_hello-15174... 0fd8f23cb624 10.3.1.15:5000/ubuntu "bash -c 'date;ech..." 3 minutes ago Exited (0) 3 minutes ago k8s_hello-cronjob_hello-15174...
查看任意容器的日志:
root@ubuntu:/# docker logs 96f93b1dbf53 Thu Feb 1 06:08:19 UTC 2018 Hello from the Kubernetes cluste root@ubuntu:/# docker logs 2271a37d07b4 Thu Feb 1 06:07:19 UTC 2018 Hello from the Kubernetes cluste #两个相临的时间的容器恰好是一分钟执行一次命令。
如上每一次执行一次任务就会产生一个容器,且任务执行完成后就会正常退出容器,根据在定义contains
重启策略为 OnFailure因此不会再重启容器,下次执行任务的时间到了就会再启动一个容器来执行,
这样就会不会形成不少Exited的容器,可是Kubernetes
不会让它出现这样的状况的,在CronJob中有个字段来限制历史做业的个数:
.spec.successfulJobsHistoryLimit: #成功完成的做业保存多少个,默认为3 .spec.failedJobsHistoryLimit: #失败的做业保存多少个,默认为1 # 设置为0则不会保存。这两个字段与jobTemplate同级.
使用以下命令可更加直观的实时看到每次Cron Job按期触发任务执行的历史和现状状况:
root@ubuntu:/# kubectl get job --watch NAME DESIRED SUCCESSFUL AGE hello-1517466900 1 1 2m hello-1517466960 1 1 1m hello-1517467500 1 1 46s 其中,NAME为CronJob的名称,每一次执行任务都会启动一个Pod SUCCESSFUL 列为1,表示任务执行成功。
找出由CronJob资源对象建立出来的Pod: 能够经过上面的CronJob NAME:
root@ubuntu:/# kubectl get pods --show-all -o wide |grep hello-1517467500 hello-1517467500-brhlx 0/1 Completed 0 56s <none> 10.3.1.16
找到对应的Pod后,查看它的日志:
root@ubuntu:/# kubectl logs hello-1517467980-q9dvk Thu Feb 1 06:33:13 UTC 2018 Hello from the Kubernetes cluste #正是前面设置的命令输出结果
若是不须要这个CronJob,删除之:
root@ubuntu:/# kubectl delete cronjob hello
Cronjob就是这么简单。