简介
作业的概述及其使用方式。
作业简介
到目前为止,我们运行的所有 Pod 都是设计为无限期持续运行的。也就是说,除非我们主动终止它们,否则它们应一直保持运行状态。 但这并非总是我们想要的行为。有时我们需要运行一个执行特定任务后退出的进程。数据库迁移就是一个典型例子:我们希望它启动、完成所需工作后退出,而无需持续运行。对于这类场景,我们可以使用 `Job` 资源。
Job 是一种资源,与 Deployment 类似,会为我们创建一个或多个 Pod。它会监控这些 Pod,确保它们完成指定任务并成功退出。当所有 Pod 都完成时,Job 就会被标记为“已完成”,其工作也就结束了。
让我们看一个示例:

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 长期堆积在系统中。