kubernetes-job、CronJob介绍

281 阅读5分钟

Job介绍

Job负责编排运行有结束时间的“一次性”任务,而前面的Deployment和DaemonSet主要负责编排始终运行的守护进程类应用;

  • 控制器要确保Pod内的进程“正常(成功完成任务)”地退出
  • 非正常退出的Pod可以根据需要重启,并在重试一定的次数后终止
  • 有些Job是单次任务,也有些Job需要运行多次(次数通常固定)
  • 有些任务支持同时创建及并行运行多个Pod以加快任务处理速度,Job控制器还允许用户自定义其并行度

需要周期性运行的Job,则由CronJob控制器负责编排

  • CronJob建立在Job的功能之上,是更高层级的控制器
  • 它以Job控制器完成单批次的任务编排,而后为这种Job作业提供需要运行的周期定义

Job资源规范

apiVersion: batch/v1 # API群组及版本;
kind: Job # 资源类型特有标识;
metadata:
name <string> # 资源名称,在作用域中要惟一;
namespace <string> # 名称空间;Job资源隶属名称空间级别;
spec:
selector <object> # 标签选择器,必须匹配template字段中Pod模板中的标签;
suspend <boolean> # 是否挂起当前Job的执行,挂起作业会重置StartTime字段的值;
template <object> # Pod模板对象;
completions <integer> # 期望的成功完成的作业次数,成功运行结束的Pod数量;
completionMode <string> # 追踪Pod完成的模式,支持Indexed和NonIndexed(默认)两种;
ttlSecondsAfterFinished <integer> # 终止状态作业的生存时长,超期将被删除;
parallelism <integer> # 作业的最大并行度,默认为1;
backoffLimit <integer> # 将作业标记为“Failed”之前的重试次数,默认为6;
activeDeadlineSeconds <integer> # 作业启动后可处于活动状态的时长;

Job资源同样需要标签选择器和Pod模板,但它不需要指定replicas,而是应该给定completions,即需要完成的作业次数,默认为1次;

  • Job资源会为其Pod对象自动添加“job-name=JOB_NAME”和“controller-uid=UID”标签,并使用标签选择器完成对controller-uid标签的关联, 因此,selector并非必选字段
  • Pod的命名格式:$(job-name)-$(index)-$(random-string),其中的$(index)字段取值与completions和completionMode有关

注意:

  • Job资源所在群组为“batch/v1”
  • Job资源中,Pod的RestartPolicy的取值只能为Never或OnFailure

yaml示例

apiVersion: batch/v1
kind: Job
metadata:
  name: job-demo
spec:
  template:
    spec:
      containers:
      - name: myjob
        image: ikubernetes/admin-box:v1.2
        imagePullPolicy: IfNotPresent
        command: ["/bin/sh", "-c", "sleep 60"]
      restartPolicy: Never
  completions: 2
  ttlSecondsAfterFinished: 3600
  backoffLimit: 3
  activeDeadlineSeconds: 300

Job的状态

kubectl get jobs

~$ kubectl get jobs job-demo 

NAME COMPLETIONS DURATION AGE 
job-demo 1/3 58s 58s 

~$ kubectl get pods -l job-name=job-demo 
NAME READY STATUS RESTARTS AGE 
job-demo--1-4vds6 1/1 Running 0 5s 
job-demo--1-5xd5s 0/1 Completed 0 44s 

状态描述(示例集群中共有两个工作节点): 
COMPLETIONS:已经正常完成任务并退出的Pod数量 
DURATION:Job业务的实际运行时长 
AGE:Job资源创建后的时长

image.png

kubectl describe jobs

kubectl describe jobs job-demo

image.png

并行式Job

apiVersion: batch/v1
kind: Job
metadata:
  name: job-para-demo
spec:
  template:
    spec:
      containers:
      - name: myjob
        image: ikubernetes/admin-box:v1.2
        imagePullPolicy: IfNotPresent
        command: ["/bin/sh", "-c", "sleep 60"]
      restartPolicy: Never
  completions: 12 
  parallelism: 2
  ttlSecondsAfterFinished: 3600
  backoffLimit: 3
  activeDeadlineSeconds: 1200

Job对象能够支持多个Pod的可靠、并发执行

  • 编排彼此间相互通信的并行进程并非Job的设计目标,它仅用于支撑一组相互独立而又有所关联的工作任务的并行处理 -常见的场景,有如发送电子邮件、渲染视频帧、编解码文件、NoSQL数据库中扫描主键范围等

并行式Job的关键配置参数

  • parallelism:任务并行度,即最大可同行运行的Pod数量,可以将其理解为工作队列的数量
  • completions:总共需要完成的任务数量,即总共需要多少个相关的Pod成功完成执行,通常要大于parallelism的值

image.png

CronJob

  • CronJob控制器用于管理Job资源的运行时间,它允许用户在特定的时间或以指定的间隔运行Job
  • CronJob控制器的功能类似于linux操作系统的周期性任务作业计划(crontab),用于控制作业运行的时间点及周期性运行的方式:
    • 仅在未来某时间点将指定的作业运行一次
    • 在指定的周期性时间点重复运行指定的作业
  • CronJob资源也是标准的API资源类型
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;

注意: 在CronJob中,通配符“?”和“*”的意义相同,它们都表示任何可用的有效值

yaml示例

schedule: "*/2 * * * *" # 分钟 小时 日 月 周

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: cronjob-demo
  namespace: default
spec:
  schedule: "*/2 * * * *"
  jobTemplate:
    metadata:
      labels:
        controller: cronjob-demo
    spec:
      parallelism: 1
      completions: 1
      ttlSecondsAfterFinished: 600
      backoffLimit: 3
      activeDeadlineSeconds: 60
      template:
        spec:
          containers:
          - name: myjob
            image: ikubernetes/admin-box:v1.2
            command:
            - /bin/sh
            - -c
            - date; echo Hello from CronJob, sleep a while...; sleep 10
          restartPolicy: OnFailure
  startingDeadlineSeconds: 300