×

一个作业在您的 Red Hat OpenShift Service on AWS 集群中执行任务。

作业跟踪任务的整体进度,并使用有关活动、成功和失败 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命令进行管理。

Red Hat OpenShift Service on AWS 中有两种可能的资源类型允许创建一次性运行的对象

作业

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

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

  • 非并行作业

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

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

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

    • 启动多个 Pod 的作业。

    • 当从 1completions 值的范围内每个值的成功 Pod 都有一个时,作业表示整个任务并完成。

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

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

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

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

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

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

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

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

Cron 作业

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

一个cron 作业基于常规作业,允许您指定作业的运行方式。Cron 作业是Kubernetes API 的一部分,可以使用与其他对象类型相同的oc命令进行管理。

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

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

了解如何创建作业

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

  • 一个 Pod 模板,描述 Red Hat OpenShift Service on AWS 创建的 Pod。

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

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

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

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

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

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

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

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

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

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

如果作业由于配置中的逻辑错误或其他类似原因在设定的重试次数后仍失败,则该作业将被视为失败。控制器将以指数退避延迟 (10s20s40s……) 重新创建与作业关联的失败 Pod,最大延迟为六分钟。如果控制器检查期间没有出现新的失败 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。

创建作业

您可以在 AWS 上的 Red Hat OpenShift Service 中通过创建作业对象来创建作业。

步骤

要创建作业

  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。始终重启作业。

      有关 AWS 上的 Red Hat OpenShift Service 如何将重启策略与失败的容器一起使用的详细信息,请参阅 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 作业

您可以在 AWS 上的 Red Hat OpenShift Service 中通过创建作业对象来创建 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 格式的计划。