探索 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 状态。

使用 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
本课其余配图

本课其余配图

本课其余配图

本课其余配图
