Kubernetes 中的 Job 是什么?

在 Kubernetes 中,Job 是一种控制器,用于管理批处理任务,即仅执行一次的任务。它的主要特征是:

  • 一次性任务:Job 创建后会运行直到完成,不会重复运行。
  • 支持并行运行:可以通过 .spec.parallelism 参数设置并行任务数。
  • 失败重试:通过 .spec.backoffLimit 设置失败重试次数,达到重试上限后 Job 会失败。
  • 幂等性:重复创建同名 Job 不会产生新任务,当前 Job 需要先完成。

Job 的定义包含以下主要字段:

  • .spec.template:Pod 模板,指定要运行的任务容器和设置。
  • .spec.parallelism:并行执行的 Pod 数,默认 1。
  • .spec.completions:完成次数,默认 1。
  • .spec.backoffLimit:失败重试次数,默认 6。
  • .spec.selector:spec.template的标签选择器,用于筛选任务 Pod。
  • .status.succeeded:已成功完成的 Pod 数。
  • .status.failed:失败的 Pod 数。

Job 的工作流程是:

  1. 根据 .spec.parallelism 创建 Pod,至少一个,最多个数由用户定义。
  2. 这些 Pod 被称为 “任务 Pod”。 Job 会管理这些 Pod,保证至少运行指定数目(.spec.completions)的成功任务。
  3. 任务 Pod 完成(退出且退出码为0)后会执行下一个,直到达到 .spec.completions设置的完成次数。
  4. 任何一个 Pod 失败重试达到 .spec.backoffLimit 设置的次数后,Job 会标记为失败。
  5. Job 不会删除已经成功完成的任务 Pod。需要手动或设置 TTL 进行清理。

例如,下面的 Job 会启动 3 个并行 Pod,失败重试 5 次,运行 2 次(2 个完成 Pod)后结束:

yaml
apiVersion: batch/v1 
kind: Job
metadata:
  name: pi
spec:
  parallelism: 3   #  three parallel tasks
  completions: 2   # complete 2 times 
  backoffLimit: 5 # retry 5 times 
  template: 
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never

这些 Pod 会计算 Pi 至 2000 位小数。3 个 Pod 会同时运行,如果有失败最多重试 5 次,最终 2 个任务成功完成后 Job 就结束。

所以总结来说,Job 主要用于管理批处理任务,其特征是:

  1. 一次性任务:运行直到完成,不重复执行。
  2. 支持并行运行:通过 .spec.parallelism 设置并行数。
  3. 失败重试:通过 .spec.backoffLimit 设置重试次数。
  4. 幂等性:同名 Job 不会重复运行,需要当前 Job 完成。

它由以下几部分组成:

  1. Pod 模板:要运行的任务容器配置。
  2. 并行 Pod 数:通过 .spec.parallelism 设置。
  3. 完成次数:通过 .spec.completions 设置。
  4. 失败重试次数:通过 .spec.backoffLimit 设置。
  5. 选择器:选择任务 Pod。
  6. 状态:成功与失败 Pod 数。