1. Job 概述
与需要长时间运行的服务程序不同,Job 用于管理短暂任务(即一次性任务)的运行。Job 控制器能够确保 Pod 成功完成任务,并在任务完成后终止 Pod。对于运行失败的 Pod,Job 控制器会创建一个新的 Pod 再次运行。
2. Job 配置示例
# job.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: hello
spec:
template:
spec:
containers:
- name: hello
image: ubuntu
command: ["echo", "Hello World!"]
restartPolicy: Never
backoffLimit: 4
YAMLJob 资源配置字段说明:
- template:Pod模板,其中的配置项就是 Pod 的定义。
- selector:在默认情况下,不需要特别设置标签选择器,系统会自动设置 Pod 的标签和标签选择器,以 key 为 batch.kubernetes.io/controller-uid 进行设置,此外还会给 Pod 和 Job 本身设置 key 为 batch.kubernetes.io/job-name 的标签,将值value 设置为 Job 的名称。也允许用户自行设置标签选择器,需要注意用户自定义的标签选择器不应该包含其他 Job 创建的 Pod,否则删除该 Pod 时会连带删除该标签选择器匹配的其他 Pod。
- restartPolicy:Pod 重启策略,可选项包括 Never 和 OnFailure,不能被设置为Always。
- Never 表示不论 Pod 是否运行失败,也不会重启。
- OnFailure 表示在 Pod 运行失败时重启 Pod。
- parallelism:可以并行运行的任务数量,应将其设置为大于或等于0的整数,默认值为1。设置为0来表示 Job 启动之后就被暂停执行,直到这个值被修改为大于0的数值。
- completions 和 completionMode:completions 用于设置成功完成的 Pod 数量,默认值为 1。completionMode(完成模式)可被设置为 NonIndexed 或 Indexed,默认值为 NonIndexed,表示成功完成的 Pod 数量达到 completions 时Job 完成。如果 completions 被设置为空值,completionMode 将被默认设置为NonIndexed。completionMode 被设置为 Indexed 时表示系统会给已经完成的Pod 设置一个索引(Index)编号,用于在并行(parallelism)模式下为每个 Pod 设置身份标识,以及与 Service 共同使用时,Index 可用于 Pod 的服务名。
- backoffLimit:设置对失败任务的重试次数上限,与 Pod 失效特性相关。
3. Job 运行模式
Job 通常适用于以下 3 种形式运行的任务:
- 单个一次性任务(Non-parallel Job):通常一个 Job 只启动一个 Pod,除非 Pod异常,才会重启该 Pod,一旦该 Pod 正常结束,Job 将完成。
- 具有指定完成数量的并行任务(Parallel Job with a fixed completion count):并行 Job 会启动多个 Pod,此时需要设定 Job 的 spec.completions 参数为一个正数,当正常结束的 Pod 数量达到该参数设定的值后,Job 完成。此外,Job 的spec.parallelism 参数用于控制并行度,即同时启动几个Job来处理工作项(Work Item)。在设置了 completionMode=”Indexed” 时,系统会为每个 Pod 设置一个0 和 completions-1 之间的索引值。
- 带有工作队列的并行任务:任务队列方式的并行 Job 需要一个独立的 Queue,工作项都在一个 Queue 中存放,不能设置 Job 的 spec.completions 参数,此时Job有以下特性。
- 多个 Pod 之间必须能够协调好分别要处理哪个工作项,或者借助外部服务来确定。
- 每个 Pod 都能够确定其他 Pod 是否完成工作,进而确定 Job 是否完成
- 如果某个 Pod 正常结束,则 Job 不会再启动新的 Pod。
- 如果一个 Pod 成功结束,则此时应该不存在其他 Pod 还在工作的情况,它们应该都处于即将结束、退出的状态。
- 如果所有 Pod 都结束了,或至少有一个 Pod 成功结束,则整个 Job 成功结束。