×

作业在您的 OpenShift Container Platform 集群中执行任务。

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

作业规范示例
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 副本数。
2 成功完成的 Pod 数量,用于标记作业已完成。
3 作业可以运行的最大持续时间。
4 作业的重试次数。
5 控制器创建的 Pod 模板。
6 Pod 的重启策略。

了解作业和 cron 作业

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

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

作业 (Job)

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

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

  • 非并行作业

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

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

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

    • 启动多个 Pod 的作业。

    • 作业代表整个任务,当从 1completions 值的范围内每个值都存在一个成功的 Pod 时,作业就完成了。

  • 具有工作队列的并行作业

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

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

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

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

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

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

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

Cron 作业

可以使用 Cron 作业安排作业多次运行。

Cron 作业在常规作业的基础上构建,允许您指定作业的运行方式。Cron 作业是 Kubernetes API 的一部分,可以使用oc命令像其他对象类型一样进行管理。

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

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

了解如何创建作业

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

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

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

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

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

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

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

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

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

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

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

了解如何为 Pod 失败设置作业回退策略

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

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

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

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

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

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

  • 删除不再需要的 Cron 作业

    $ oc delete cronjob/<cron_job_name>

    这样做可以防止它们生成不必要的工件。

  • 您可以通过将spec.suspend设置为 true 来暂停进一步的执行。所有后续执行都将暂停,直到您将其重置为false

已知限制

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

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

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

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

创建作业

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

步骤

要创建作业

  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 Container Platform 如何将重启策略与失败的容器一起使用的详细信息,请参阅 Kubernetes 文档中的示例状态 (Example States)

  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 Container Platform 中通过创建作业对象来创建 cron 作业。

步骤

要创建 cron 作业:

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

    apiVersion: batch/v1
    kind: CronJob
    metadata:
      name: pi
    spec:
      schedule: "*/1 * * * *"          (1)
      timeZone: Etc/UTC                (2)
      concurrencyPolicy: "Replace"     (3)
      startingDeadlineSeconds: 200     (4)
      suspend: true                    (5)
      successfulJobsHistoryLimit: 3    (6)
      failedJobsHistoryLimit: 1        (7)
      jobTemplate:                     (8)
        spec:
          template:
            metadata:
              labels:                  (9)
                parent: "cronjobpi"
            spec:
              containers:
              - name: pi
                image: perl
                command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
              restartPolicy: OnFailure (10)
    #...
    1 为作业安排计划,使用 cron 格式。在此示例中,作业将每分钟运行一次。
    2 计划的可选时区。请参阅 时区数据库时区列表 以了解有效选项。如果未指定,Kubernetes 控制器管理器将根据其本地时区解释计划。
    3 一个可选的并发策略,指定如何处理 cron 作业中的并发作业。只能指定以下并发策略之一。如果未指定,则默认为允许并发执行。
    • Allow 允许 cron 作业并发运行。

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

    • Replace 取消当前正在运行的作业并将其替换为新的作业。

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