×

一个Job在您的 OpenShift Dedicated 集群中执行任务。

Job 跟踪任务的整体进度,并使用有关活动、成功和失败 Pod 的信息更新其状态。删除 Job 将清理它创建的任何 Pod 副本。Job 是 Kubernetes API 的一部分,可以使用oc命令像其他对象类型一样进行管理。

示例 Job 规范
apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  parallelism: 1    (1)
  completions: 1    (2)
  activeDeadlineSeconds: 1800 (3)
  backoffLimit: 6   (4)
  template:         (5)
    metadata:
      name: pi
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: OnFailure    (6)
#...
1 Job 应并行运行的 Pod 副本数。
2 成功的 Pod 完成数是标记 Job 完成所需的。
3 Job 可以运行的最大持续时间。
4 Job 的重试次数。
5 控制器创建的 Pod 模板。
6 Pod 的重启策略。

理解 Job 和 CronJob

Job 跟踪任务的整体进度,并使用有关活动、成功和失败 Pod 的信息更新其状态。删除 Job 会清理它创建的任何 Pod。Job 是 Kubernetes API 的一部分,可以使用oc命令像其他对象类型一样进行管理。

在 OpenShift Dedicated 中,有两种可能的资源类型允许创建一次性运行的对象

Job

常规 Job 是一种一次性运行的对象,它创建任务并确保 Job 完成。

有三种主要类型的任务适合作为 Job 运行

  • 非并行 Job

    • 除非 Pod 失败,否则只启动一个 Pod 的 Job。

    • 一旦其 Pod 成功终止,Job 就完成了。

  • 具有固定完成计数的并行 Job

    • 启动多个 Pod 的 Job。

    • 当范围1completions值中的每个值都有一个成功的 Pod 时,Job 就代表了整个任务并完成。

  • 具有工作队列的并行 Job

    • 在给定 Pod 中具有多个并行工作进程的 Job。

    • OpenShift Dedicated 协调 Pod 以确定每个 Pod 应该处理什么内容或使用外部队列服务。

    • 每个 Pod 都能够独立地确定所有对等 Pod 是否已完成以及整个 Job 是否已完成。

    • 当 Job 中的任何 Pod 成功终止时,就不会创建新的 Pod。

    • 当至少一个 Pod 成功终止且所有 Pod 都已终止时,Job 成功完成。

    • 当任何 Pod 成功退出时,其他 Pod 不应该为此任务执行任何工作或写入任何输出。所有 Pod 都应该正在退出过程中。

      有关如何使用不同类型 Job 的更多信息,请参阅 Kubernetes 文档中的Job 模式

CronJob

可以使用 CronJob 将 Job 预定为多次运行。

CronJob基于常规 Job,允许您指定 Job 的运行方式。CronJob 是Kubernetes API 的一部分,可以使用oc命令像其他对象类型一样进行管理。

CronJob 可用于创建定期和重复的任务,例如运行备份或发送电子邮件。CronJob 还可以为特定时间安排单个任务,例如,如果您想为低活动期间安排一个 Job。CronJob 基于在运行 cronjob 控制器的控制平面节点上配置的时区创建Job对象。

Cron 作业大约会在其调度计划的每次执行时间创建一次Job 对象,但在某些情况下,它可能无法创建作业,或者可能创建两个作业。因此,作业必须是幂等的,并且您必须配置历史限制。

理解如何创建作业

这两种资源类型都需要一个作业配置,该配置包含以下关键部分

  • Pod 模板,描述 OpenShift Dedicated 创建的 Pod。

  • parallelism 参数,指定在任何时间点并行运行的 Pod 数量,这些 Pod 应该执行作业。

    • 对于非并行作业,保持未设置。未设置时,默认为1

  • completions 参数,指定需要多少个成功的 Pod 完成才能完成作业。

    • 对于非并行作业,保持未设置。未设置时,默认为1

    • 对于具有固定完成计数的并行作业,请指定一个值。

    • 对于具有工作队列的并行作业,保持未设置。未设置时,默认为parallelism 值。

理解如何设置作业的最大持续时间

在定义作业时,您可以通过设置activeDeadlineSeconds 字段来定义其最大持续时间。它以秒为单位指定,默认情况下未设置。未设置时,不会强制执行最大持续时间。

最大持续时间从系统中第一个 Pod 被调度的时间开始计算,并定义作业可以处于活动状态的时间长度。它跟踪执行的总时间。达到指定超时后,OpenShift Dedicated 将终止作业。

理解如何为 Pod 故障设置作业回退策略

由于配置中的逻辑错误或其他类似原因,在达到设定的重试次数后,作业可以被认为是失败的。与作业关联的失败 Pod 将由控制器使用指数回退延迟(10s20s40s……)重新创建,上限为六分钟。如果控制器检查之间没有出现新的失败 Pod,则限制将重置。

使用spec.backoffLimit 参数设置作业的重试次数。

了解如何配置 Cron 作业以删除工件

Cron 作业可能会留下作业或 Pod 等工件资源。作为用户,务必配置历史限制,以便正确清理旧作业及其 Pod。Cron 作业的规范中包含两个负责此事的字段

  • .spec.successfulJobsHistoryLimit。要保留的成功完成作业的数量(默认为 3)。

  • .spec.failedJobsHistoryLimit。要保留的失败完成作业的数量(默认为 1)。

已知限制

作业规范重启策略仅适用于Pod,而不适用于作业控制器。但是,作业控制器被硬编码为持续重试作业直至完成。

因此,restartPolicy: Never--restart=Never 的行为与restartPolicy: OnFailure--restart=OnFailure 相同。也就是说,当作业失败时,它会自动重启,直到成功(或手动丢弃)。该策略仅设置哪个子系统执行重启。

使用Never 策略,作业控制器执行重启。每次尝试时,作业控制器都会增加作业状态中的失败次数并创建新的 Pod。这意味着每次失败尝试都会增加 Pod 的数量。

使用OnFailure 策略,kubelet 执行重启。每次尝试都不会增加作业状态中的失败次数。此外,kubelet 将重试失败的作业,在相同的节点上启动 Pod。

创建作业

您可以通过创建作业对象在 OpenShift Dedicated 中创建作业。

步骤

创建作业

  1. 创建一个类似于以下内容的 YAML 文件

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: pi
    spec:
      parallelism: 1    (1)
      completions: 1    (2)
      activeDeadlineSeconds: 1800 (3)
      backoffLimit: 6   (4)
      template:         (5)
        metadata:
          name: pi
        spec:
          containers:
          - name: pi
            image: perl
            command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
          restartPolicy: OnFailure    (6)
    #...
    1 可选:指定作业应并行运行的 Pod 副本数;默认为1
    • 对于非并行作业,保持未设置。未设置时,默认为1

    2 可选:指定需要多少个成功的 Pod 完成才能标记作业已完成。
    • 对于非并行作业,保持未设置。未设置时,默认为1

    • 对于具有固定完成计数的并行作业,请指定完成次数。

    • 对于具有工作队列的并行作业,保持未设置。未设置时,默认为parallelism 值。

    3 可选:指定作业可以运行的最大持续时间。
    4 可选:指定作业的重试次数。此字段默认为六。
    5 指定控制器创建的 Pod 的模板。
    6 指定 Pod 的重启策略
    • Never。不要重启作业。

    • OnFailure。仅当作业失败时才重启作业。

    • Always。始终重启作业。

      有关 OpenShift Dedicated 如何将重启策略与失败容器一起使用的详细信息,请参阅 Kubernetes 文档中的示例状态

  2. 创建作业

    $ oc create -f <file-name>.yaml

您还可以使用oc create job 从单个命令创建和启动作业。以下命令将创建并启动一个类似于上例中指定的作业。

$ oc create job pi --image=perl -- perl -Mbignum=bpi -wle 'print bpi(2000)'

创建 Cron 作业

您可以通过创建作业对象在 OpenShift Dedicated 中创建 Cron 作业。

步骤

创建 Cron 作业

  1. 创建一个类似于以下内容的 YAML 文件

    apiVersion: batch/v1
    kind: CronJob
    metadata:
      name: pi
    spec:
      schedule: "*/1 * * * *"          (1)
      concurrencyPolicy: "Replace"     (2)
      startingDeadlineSeconds: 200     (3)
      suspend: true                    (4)
      successfulJobsHistoryLimit: 3    (5)
      failedJobsHistoryLimit: 1        (6)
      jobTemplate:                     (7)
        spec:
          template:
            metadata:
              labels:                  (8)
                parent: "cronjobpi"
            spec:
              containers:
              - name: pi
                image: perl
                command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
              restartPolicy: OnFailure (9)
    1 根据cron 格式指定的作业调度。在此示例中,作业将每分钟运行一次。
    2 可选的并发策略,指定如何处理 Cron 作业中的并发作业。只能指定以下并发策略之一。如果未指定,则默认为允许并发执行。
    • Allow 允许 Cron 作业并发运行。

    • Forbid 禁止并发运行,如果前一个作业尚未完成,则跳过下一个运行。

    • Replace 取消当前正在运行的作业,并用新的作业替换它。

    3 可选的截止时间(以秒为单位),用于在因任何原因错过其预定时间的情况下启动作业。错过的作业执行将计为失败的作业。如果未指定,则没有截止时间。
    4 一个可选标志,允许暂停 Cron 作业。如果设置为true,则所有后续执行都将被暂停。
    5 要保留的成功完成作业的数量(默认为 3)。
    6 要保留的失败完成作业的数量(默认为 1)。
    7 作业模板。这类似于作业示例。
    8 为此 Cron 作业生成的作业设置标签。
    9 Pod 的重启策略。这并不适用于作业控制器。

    .spec.successfulJobsHistoryLimit.spec.failedJobsHistoryLimit 字段是可选的。这些字段指定应保留多少已完成和失败的作业。默认情况下,它们分别设置为31。将限制设置为0 对应于在作业完成之后不保留任何相应的作业。

  2. 创建 Cron 作业

    $ oc create -f <file-name>.yaml

您还可以使用oc create cronjob 从单个命令创建和启动 Cron 作业。以下命令将创建并启动一个类似于上例中指定的 Cron 作业。

$ oc create cronjob pi --image=perl --schedule='*/1 * * * *' -- perl -Mbignum=bpi -wle 'print bpi(2000)'

使用oc create cronjob--schedule 选项接受cron 格式的调度。