k8s-Cronjob部署文档

1. CronJob

Cron Job 创建是基于时间调度的 Jobs

一个 CronJob 对象就像 crontab (cron table) 文件中的一行。它用 Cron 格式进行编写,并周期性地在给定的调度时间执行 Job。

 

1.1 CronJob 限制

CronJob 创建 Job 对象,每个 Job 的执行次数大约为一次。 之所以说 “大约” ,是因为在某些情况下,可能会创建两个 Job,或者不会创建任何 Job。虽然试图使这些情况尽量少发生,但不能完全杜绝。因此,Job 应该是幂等的。

CronJob 仅负责创建与其调度时间相匹配的 Job,而 Job 又负责管理其代表的 Pod。

使用案例:

1、在给定时间点调度Job

2、创建周期性运行的Job。如:数据备份、数仓导数、执行任务、邮件发送、数据拉取、数据推送

 

1.2特殊说明

.spec.schedule 必选,任务被创建和执行的调度时间。同Cron格式串,例如 0 * * * *。

  • .spec.jobTemplate 必选,任务模版。它和 Job的语法完全一样
  • .spec.startingDeadlineSeconds 可选的。默认未设置。它表示任务如果由于某种原因错过了调度时间,开始该任务的截止时间的秒数。过了截止时间,CronJob 就不会开始任务。不满足这种最后期限的任务会被统计为失败任务。如果没有该声明,那任务就没有最后期限。
  • .spec.concurrencyPolicy 可选的。它声明了 CronJob 创建的任务执行时发生重叠如何处理。spec 仅能声明下列规则中的一种:

Allow (默认):CronJob 允许并发任务执行。

Forbid:CronJob 不允许并发任务执行;如果新任务的执行时间到了而老任务没有执行完,CronJob 会忽略新任务的执行。

Replace:如果新任务的执行时间到了而老任务没有执行完,CronJob 会用新任务替换当前正在运行的任务。

请注意,并发性规则仅适用于相同 CronJob 创建的任务。如果有多个 CronJob,它们相应的任务总是允许并发执行的。

  • .spec.suspend 可选的。如果设置为 true ,后续发生的执行都会挂起。这个设置对已经开始执行的Job不起作用。默认是关闭的false。
    备注:在调度时间内挂起的执行都会被统计为错过的任务。当 .spec.suspend 从 true 改为 false 时,且没有开始的最后期限,错过的任务会被立即调度。
  • .spec.successfulJobsHistoryLimit 和 .spec.failedJobsHistoryLimit 可选的。 这两个声明了有多少执行完成和失败的任务会被保留。默认设置为3和1。限制设置为0代表相应类型的任务完成后不会保留。

说明:如果 startingDeadlineSeconds 设置为很大的数值或未设置(默认),并且 concurrencyPolicy 设置为 Allow,则作业将始终至少运行一次。

 

2. 创建镜像

• Springboot项目注销以前的定时任务,在启动类里创建一个bean实例

 

public class DataCollectionApplication {



    public static void main(String[] args) {

        SpringApplication.run(DataCollectionApplication.class, args);

    }

    @Bean

    public StartupRunner startupRunner(){

        return new StartupRunner();

    }

  



实现在项目启动后执行的功能,SpringBoot提供的一种简单的实现方案就是添加一个model并实现CommandLineRunner接口,实现功能的代码放在实现的run方法中,任务执行完成以后调用System.exit方法退出。

 

@Slf4j

public class StartupRunner implements CommandLineRunner {



    @Autowired

    HttpUtil httpUtil;



    @Override

    public void run(String... args) throws Exception {

        log.info("startup runner");

        log.info("args:{}",args);

        httpUtil.getData();

        log.info("task finished");

        // 程序执行完springboot自动退出

        System.exit(0);

    }

  

 

项目打成jar包,放在docker容器下用dockerfile创建镜像上传私库里。

3. CronJob示例

创建yaml文件

apiVersion: batch/v1beta1  # 当前 CronJob 的 apiVersion

kind: CronJob # 指明当前资源的类型为 CronJob。

metadata:

  name: earlydata-cronjob

  namespace: job

spec:

  schedule: '*/3 * * * *'   # schedule 指定什么时候运行 Job

  successfulJobsHistoryLimit: 1

  terminationGracePeriodSeconds: 3  #新pod产生后老pod存活时间默认30秒

  jobTemplate:   # jobTemplate 定义 Job 的模板,格式与上文的 Job 一致 

    spec:

      template:

        spec:

          containers:

            - name: earlydata-cronjob

              image: 10.0.0.0:5000/form/earlydata

          restartPolicy: OnFailure    #Pod的重启策略

  

 

启动cronjob并查看状态

 Kubectl  apply  -f  cronjob.yaml

  

几分钟之后的状态信息

 
[root@k8s-master controller]# kubectl get cronjob -n  fzjz
NAME                       SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
earlywarningdata-cronjob   */5 * * * *   False     1        19s             6d

  

 

 

posted on 2021-10-22 10:48  奔跑吧人生  阅读(275)  评论(0编辑  收藏  举报

导航