探索 Kubernetes 中的 Job

学习目标

  • 比较 Kubernetes 中不同类型的 Job

  • 在 Kubernetes 中使用 Job 和 CronJob

Kubernetes 中的 Job 类型

使用场景

您已经将不同类型的工作负载部署到 Kubernetes 集群。然而,对于某些用例,您不需要始终运行的工作负载。相反,您希望仅运行一次工作负载然后终止它,或者将它调度为定期运行。要了解如何做到这一点,请探索 Kubernetes 中 Job 的能力。

Job 类型

Job 用于仅运行一次工作负载。例如,您可以使用 Job 运行数据库迁移或执行批处理作业。与 Kubernetes 中的其他工作负载相比,Job 不应长时间运行。相反,它们应当运行至完成然后终止。不过,如果 Job 失败,它会被重启直到成功为止。

点击下面的按钮以了解每种 Job 类型的更多信息。

一次性/非并行 Job

查看一个简单的 Job 清单来声明一次性 Job:

apiVersion: batch/v1
kind: Job
metadata:
name: my-job
spec:
backoffLimit: 4
template:
spec:
containers:
- name: my-job
image: busybox:1.35.0
command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 10 && echo Job done!']
restartPolicy: OnFailure

上面的清单定义了一个 Job,它运行一个包含基于 busybox 镜像的容器的 Pod。该容器运行命令 echo Hello Kubernetes! && sleep 10 && echo Job done!restartPolicy 设置为 OnFailure,这意味着如果 Job 失败,它会被重启。或者,您也可以将 restartPolicy 设置为 Never,这意味着 Job 失败时不会重启。backoffLimit 设置为 4,意味着该 Job 最多重启四次。如果该 Job 失败 4 次,它就会被标记为失败。

并行 Job

在定义并行 Job 时,您可以指定总共必须创建的并行 Pod 数量(.spec.parallelism)以及应同时运行的最大并行 Pod 数量(.spec.completions)。以下清单定义了一个并行 Job,它总共创建六个 Pod,并并行运行三个 Pod:

apiVersion: batch/v1
kind: Job
metadata:
name: my-parallel-job
spec:
parallelism: 3
completions: 6
backoffLimit: 4
template:
metadata:
labels:
sidecar.istio.io/inject: "false"
spec:
containers:
- name: my-parallel-job
image: busybox:1.35.0
command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 10 && echo Job done!']
restartPolicy: Never

Kubernetes 还会等待所有三个 Pod 成功完成后,才开始创建接下来的三个 Pod。

您也可以在 Kyma dashboard 中观察到这一点。在您选择的命名空间中,转到 Workloads > Jobs,选择 Create,然后粘贴上面的 Job 清单。您会看到起初只有三个 Pod 在运行。一旦这些 Pod 进入 Completed 状态,就会再创建三个 Pod。当这些额外的 Pod 完成任务后,全部六个 Pod 都处于 Completed 状态。

Kyma dashboard 中显示名为 my-parallel-job 的并行 Job 的详细信息。它突出显示 3/6 完成,并列出多个 Pod 及其状态,包括 RUNNING 和 COMPLETED。

使用 CronJob 调度 Job

要将工作负载调度为定期运行,您可以使用 CronJob。CronJob 与 Job 类似,但被调度为在固定时间、日期或特定时间间隔定期运行。以下清单定义了一个每晚 2:00 运行的 CronJob:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: my-cronjob
spec:
schedule: "0 2 * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: my-cronjob
image: busybox:1.35.0 # busybox is a small image that contains a few useful utilities
command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 10 && echo Job done!']
restartPolicy: OnFailure
backoffLimit: 4

schedule 字段以 Cron 格式定义调度。在上面的示例中,CronJob 被调度为每晚 2:00 运行。jobTemplate 字段定义了用于该 CronJob 的 Job 模板。CronJob 基于此模板创建一个 Job,然后将其调度为定期运行。

小结

在 Kubernetes 中,您可以使用 Job 来运行非长时间运行、而是运行至完成然后终止的工作负载。Job 可以是非并行的,即运行单个 Pod;也可以是并行的,即多个 Pod 并发运行。此外,CronJob 允许将 Job 调度为在固定时间、日期或间隔定期运行。

关于 Kubernetes 中 Job 的延伸阅读

  • Kubernetes Jobs

  • Kubernetes CronJobs

  • Cron format

本课其余配图

u3_l9_parallel job

本课其余配图

u3_l9_parallel job

本课其余配图

u3_l9_parallel job

本课其余配图

u3_l9_parallel job