在 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 的工作流程是:
- 根据 .spec.parallelism 创建 Pod,至少一个,最多个数由用户定义。
- 这些 Pod 被称为 “任务 Pod”。 Job 会管理这些 Pod,保证至少运行指定数目(.spec.completions)的成功任务。
- 任务 Pod 完成(退出且退出码为0)后会执行下一个,直到达到 .spec.completions设置的完成次数。
- 任何一个 Pod 失败重试达到 .spec.backoffLimit 设置的次数后,Job 会标记为失败。
- 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 主要用于管理批处理任务,其特征是:
- 一次性任务:运行直到完成,不重复执行。
- 支持并行运行:通过 .spec.parallelism 设置并行数。
- 失败重试:通过 .spec.backoffLimit 设置重试次数。
- 幂等性:同名 Job 不会重复运行,需要当前 Job 完成。
它由以下几部分组成:
- Pod 模板:要运行的任务容器配置。
- 并行 Pod 数:通过 .spec.parallelism 设置。
- 完成次数:通过 .spec.completions 设置。
- 失败重试次数:通过 .spec.backoffLimit 设置。
- 选择器:选择任务 Pod。
- 状态:成功与失败 Pod 数。