Kubernetes之Job、CronJob详解

最近学习Kubernetes碰到Job和CronJob,在这里总结记录一下。

Job

Job控制器也是Kubernetes中的一个重要的控制器资源,但是它和Deployment、DaemonSet不同的是:Job控制器用于调配pod对象中的运行一次性的任务。

在实践中可能任务不止运行一次就结束,用户可以配置它们以串行或并行的方式运行。

Job运行方式

总结起来就是两种运行方式:并行和串行。

  • 单工作队列的串行方式:即以多个一次性的作业放式串行执行多次任务,直至满足期望的次数,可以理解为并行度为1的作业执行方式,在某一个时刻至存在一个pod资源。
  • 多工作队列的并行方式:这种工作方式可以设置任务数、并行度。可以多个任务队列每个队列执行一个任务,也可以多个任务队列每个队列执行多个任务。

通过以下job创建示例来说明:

apiVersion: batch/v1
kind: Job
metadata:
  name: job-example
spec:
  template:
    spec:
      containers:
      - name: myjob
        image: nginx
        command: ["/bin/sh","-c", "sleep 120"]
        restartPolicy: Never

注意:

  • Job位于API群组“batch/v1"内。
  • Pod模板的spec.restartPolicy默认为"Always",这对Job控制器来讲并不适用,因此必须指定为Never或OnFailure。

上述示例是并行式Job,通过spec.parallelism的值进行设置,并通过spec.completion的值设定总任务数。上例中表示已2个队列运行,总共运行5次任务。

Job扩容

Job控制器的spec.parallelism定义的并行度表示同时运行的Pod对象数,此属性值支持运行时调整从而改变其队列总数,实现扩容缩容。

使用" Kubectl scale --replicas"命令扩展:

$ Kubectl scale jobs job-example --replicas=3
Job删除

Job控制器待其执行结束之后,将不会占用系统资源。用户可按需删除资源,但是存在一些Job控制器的容器无法正常结束,而restartPolicy又定义为重启了,那它可能就会一直处于重启状态。

Job控制器提供了如下两种方式来防止该类情况:

  • spec.activeDealineSeconds : Job的deadline,用于指定最大活动时间长度,超出此时间长度作业会被终止。。
  • spec.backoffLimit : 将作业标记为失败状态之前的重试次数,默认值为6。
spec: 
  backoffLimit: 5
  activeDealineSeconds: 100

说了这么多Job,那CronJob和它有什么关系呢

CronJob

CronJob控制器是用于管理Job控制器资源的运行时间。

Job控制器定义的作业任务在其控制器资源创建之后便可以立即执行,但是CronJob可以做到类似于Linux操作系统的周期性任务作业计划(cronTab)的方式控制其运行的时间点和重复运行的方式。包括以下两种:

  • 在未来某个时间点运行作业一次。
  • 在指定的时间点重复运行作业。
CronJob对象创建

CronJob控制器的spec字段可嵌套使用以下字段:

  • jobTemplate : Job控制器模板,用于为CronJob控制器生成Job对象;
  • schedule : Cron格式的作业调度运行时间点;
  • concurrencyPolicy : 并发执行策略,可用值有Allow(允许)、Forbid(禁止)和Replace(替换),用于定义前一次作业运行尚未完成时是否和后一次作业一同运行;
  • failedJobHistoryLimit: 为失败的任务执行保留历史记录数,默认为1.
  • successfulJobHistoryLimit : 为成功执行的任务保留历史记录,默认值为3;
  • startingDeadlineSeconds : 因为各种原因缺乏执行作业的时间点导致的启动作业错误的超时时长,会被记入错误历史记录;
  • suspend :是否挂起后续的任务执行,默认为false,对运作中的任务不会产生影响;

通过以下CronJob来说明:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: Cronjob-example
  labels:
    app: mycronjob
spec:
  schedule: "*/2 * * * *"
  jobTemplate:
    metadata:
      labels:
        app: mycronjob-jobs
    spec:
      parallelism: 2
      template:
        spec;
          containers:
          - name: myjob
            image: nginx
            command: ["/bin/sh","-c", "sleep 120"]
            restartPolicy: OnFailure

上例创建一个每隔两分钟运行一次的简单CronJob任务。

CronJob的控制机制

CronJob是一个跟高级别的资源,它是以Job控制器资源为管控对象,并借助它管理Pod资源对象。

如果作业的重复指定时间比较密集,,而作业执行时间又比较长,则会出现两个Job对象同时存在的情况。有些Job对象可能会存在无法或不能同时运行的情况,这个时候就要通过 spec.concurrencyPolicy属性控制作业并存的机制,其默认值为“Allow",即允许前后Job甚至是属于同一个CronJob的Job同时运行。其他两个可用值中,“foebid” 用于禁止前后两个job同时运行,“Replace” 用于让后一个代替前一个。

参考书籍《Kubernetes进阶实战》
个人github账号:https://github.com/SpecialAll

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kubernetes中的CronJob是一种用于周期性执行任务的机制。它主要用于定期运行特定的作业,如数据备份、定时报告、定时任务等。 CronJob是基于Unix中的cron表达式的,该表达式由五个字段组成:分、时、日、月、周几。通过这些字段的组合,可以实现对任务在不同时间间隔进行精确调度。在Kubernetes中,CronJob将每个字段的定义封装为一个对象,并使用Cron表达式将这些对象组合起来。 CronJob是由Kubernetes的控制平面负责执行的。当到达指定的时间时,控制平面将自动创建一个Job对象,并将其分发到合适的Worker节点上运行。Job对象的创建和管理完全由Kubernetes控制平面处理,对用户而言是透明的。 CronJob对象的定义包括了作业的调度规则和执行的任务。可以指定作业的运行时间、重试策略、并行性等属性。执行的任务可以是容器或命令行,可以是存储在镜像中的应用程序或是运行在Pod中的脚本。用户可以根据实际需求定义不同的任务。 除了基本的调度功能外,CronJob还提供了监控和日志功能,可以通过指定调度失败阈值和记录日志的级别来跟踪作业的状态和执行情况。这些信息对于定位问题、排查故障非常有帮助。 总之,KubernetesCronJob是一种非常强大和灵活的调度机制,可以满足周期性任务的需求。通过使用CronJob,用户可以方便地配置和管理定时任务,提高任务的可靠性和稳定性。同时,CronJob还提供了丰富的监控和日志功能,帮助用户更好地了解和管理任务的执行情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值