Logo
Section 1 / 6

简介

作业的概述及其使用方式。

导入

简介

作业的概述及其使用方式。

作业简介

到目前为止,我们运行的所有 Pod 都是设计为无限期持续运行的。也就是说,除非我们主动终止它们,否则它们应一直保持运行状态。 但这并非总是我们想要的行为。有时我们需要运行一个执行特定任务后退出的进程。数据库迁移就是一个典型例子:我们希望它启动、完成所需工作后退出,而无需持续运行。对于这类场景,我们可以使用 `Job` 资源。

Job 是一种资源,与 Deployment 类似,会为我们创建一个或多个 Pod。它会监控这些 Pod,确保它们完成指定任务并成功退出。当所有 Pod 都完成时,Job 就会被标记为“已完成”,其工作也就结束了。

让我们看一个示例:

Course Image
1# echo-job.yaml 2apiVersion: batch/v1 3kind: Job 4metadata: 5 name: echo-job 6spec: 7 template: 8 spec: 9 restartPolicy: OnFailure 10 containers: 11 - name: echo 12 image: busybox 13 command: ["echo", "Running in a job"]

这是一个“一次性” Job。它会启动一个容器,输出一条消息后退出。一旦该容器执行完毕,它就会被标记为“已完成”,这个 Job 也就完成了。

No configuration found for ID: 85e7cf68df994412e13fed996764ae24716aff9a24e8820c35d76f5bac67c193

运行上述代码,并执行以下命令:

1kubectl apply -f echo-job.yaml 2# job.batch/echo-job created 3 4kubectl get pods 5# NAME READY STATUS 6# echo-job-sttd5 0/1 Completed 7 8kubectl logs echo-job-sttd5 9# Running in a job 10 11kubectl get jobs 12# NAME DESIRED SUCCESSFUL 13# echo-job 1 1

如你所见,该模板与 Deployment 非常相似,只是多了一个我们之前未见过的 restartPolicy 属性。该属性用于定义 Pod 在什么情况下应该被重启,其可能值有 Always、OnFailure 和 Never。

该 Pod 属性的默认值是 Always,表示无论 Pod 为何结束(例如正常退出或失败),都应始终重启。但由于 Job 的特性,这种策略无法使用,因此我们必须显式覆盖它,使得由 Job 管理的 Pod 只能选择 OnFailure 或 Never 两种值。

如果设置为 OnFailure,当 Pod 失败时将被重启;如果设置为 Never,则会创建一个全新的 Pod(而不是重启失败的旧 Pod)。除非有特殊原因不希望就地重启 Pod,一般建议始终使用 OnFailure,这样可以在发生故障时避免不必要的 Pod 创建。

Pod 退出后不会被自动删除,因此我们仍可查看其日志,但其状态会从 Running 变为 Completed。当我们检查 Job 时,也会发现期望完成数(1)与实际成功运行次数一致,这意味着该 Job 的生命周期就此结束。

需要注意的一点是,这个 Job 不会被自动删除,即使它以后不会再执行任何操作。Kubernetes 1.12 引入了 ttlSecondsAfterFinished 属性,顾名思义,它允许我们指定一个秒数,表示 Job 完成后多久应被自动删除。保留 Job 一段时间以便调试问题和查阅日志是很有用的,但建议设置此属性,以避免大量已完成的 Job 长期堆积在系统中。

部署

运行多个Pod