24、K8S-控制器之CronJob
1、基础知识
1.1、需求
job的功能是对于某些临时任务来说是非常好的一个功能,但是我们还会遇到更多更常见的定时任务,而对于定时任务,k8s给我们提供了 Cronjob的功能。
1.2、简介
CronJob其实就是在Job的基础上加上了时间调度,我们可以:在给定的时间点运行一个任务,也可以周期性 地在给定时间点运行。其效果与linux中的crontab效果非常类似,一个CronJob对象其实就对应中 crontab文件中的一行,它根据配置的时间格式周期性地运行一个Job,格式和crontab也是一样的。 crontab的格式如下: 分 时 日 月 周 命令
(0~59) (0~23) (1~31) (1~12) (0~7)
1.3、资源清单属性解析
apiVersion: batch/v1 # API群组及版本 kind: CronJob # 资源类型特有标识 metadata: name <string> # 资源名称,在作用域中要唯一 namespace <string> # 名称空间;CronJob资源隶属名称空间级别 spec: jobTemplate <Object> # job作业模板,必选字段 metadata <object> # 模板元数据 spec <object> # 作业的期望状态 schedule <string> # 调度时间设定,必选字段 concurrencyPolicy <string> # 并发策略,可用值有Allow、Forbid和Replace failedJobsHistoryLimit <integer> # 失败作业的历史记录数,默认为1 successfulJobsHistoryLimit <integer> # 成功作业的历史记录数,默认为3 startingDeadlineSeconds <integer> # 因错过时间点而未执行的作业的可超期时长 suspend <boolean> # 是否挂起后续的作业,不影响当前作业,默认为false
2、实践1 - 简单周期任务
2.1、定义资源清单
cat >cronjob.yml<<'EOF' apiVersion: batch/v1 kind: CronJob metadata: name: cronjob spec: schedule: "*/1 * * * *" jobTemplate: spec: template: spec: restartPolicy: OnFailure containers: - name: cronjob image: 192.168.10.33:80/k8s/busybox:latest command: ["/bin/sh","-c","echo job"] EOF
2.2、应用资源清单
master1 ]# kubectl apply -f cronjob.yml master1 ]# kubectl get cronjobs.batch NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE cronjob */1 * * * * False 0 <none> 3s master1 ]# kubectl get pod | grep cronjob cronjob-27990863-kgjl8 0/1 Completed 0 68s cronjob-27990864-m9qnq 0/1 Completed 0 8s master1 ]# cronjob_list=$(kubectl get pod | grep cronjob | awk '{print $1}') master1 ]# for i in $cronjob_list;do kubectl logs $i --timestamps=true; done 2023-03-22T10:23:00.692986670+08:00 job 2023-03-22T10:24:00.692771041+08:00 job
3、实践2 - 秒级周期任务
3.1、定义资源清单
cat >cronjob-second.yml<<'EOF' apiVersion: batch/v1 kind: CronJob metadata: name: cronjob-second spec: schedule: "* * * * *" jobTemplate: spec: template: spec: restartPolicy: OnFailure containers: - name: cronjob image: 192.168.10.33:80/k8s/busybox:latest command: ["/bin/sh","-c","i=0; until [ $i -eq 60 ]; do sleep 10; let i=i+10; echo $i job; done"] EOF 属性解析: 我们这里的调度是每秒都执行后面的命令,命令是每执行一下休息10s 注意:这里的10s应该符合原则上的时间切分规则 -- 整除
3.2、定义资源清单
master1 ]# kubectl apply -f cronjob-second.yml cronjob.batch/cronjob-second created master1 ]# kubectl get cronjobs.batch NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE cronjob-second * * * * * False 0 <none> 3s master1 ]# kubectl get pods NAME READY STATUS RESTARTS AGE cronjob-second-27990876-sfwz4 0/1 Completed 0 3m40s cronjob-second-27990877-brts5 0/1 Completed 0 2m40s cronjob-second-27990878-czlfg 0/1 Completed 0 100s cronjob-second-27990879-49wl7 1/1 Running 0 40s 结果显示: 周期性任务每分钟执行一次 master1 ]# kubectl logs cronjob-second-27990877-brts5 10 job 20 job 30 job 40 job 50 job 60 job 结果显示:每个任务中,周期性的执行一个动作