24、CronJob-控制器

发布时间 2023-03-22 21:14:24作者: 小粉优化大师

1、基础知识

1.1、需求

job的功能是对于某些临时任务来说是非常好的一个功能,但是我们还会遇到更多更常见的定时任务,而对于定时任务,k8s给我们提供了 Cronjob的功能。

1.2、简介

CronJob其实就是在Job的基础上加上了时间调度,我们可以:在给定的时间点运行一个任务,也可以周期性
地在给定时间点运行。其效果与linux中的crontab效果非常类似,一个CronJob对象其实就对应中
crontab文件中的一行,它根据配置的时间格式周期性地运行一个Job,格式和crontab也是一样的。
crontab的格式如下:
   分       时       日       月     周     命令
 
(
059) (023) (131) (112) (07)

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
结果显示:每个任务中,周期性的执行一个动作