Job创建一个或多个Pod并确保指定数量的Pod成功执行并终止。 当pod成功完成后,Job会跟踪任务完成情况。 达到指定数量的成功完成时,任务(即Job)完成。您还可以使用Job并行运行多个Pod。

一个简单的例子是创建一个Job任务对象,以便可靠地运行一个Pod来完成。 如果第一个Pod失败或被删除(例如由于节点硬件故障或节点重启),Job对象将启动一个新的Pod。

Job示例

job.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: batch/v1
kind: Job # 创建Job控制器
metadata:
name: pi # Job名
spec:
template: # Pod模板
spec:
containers: # 容器参数
- name: pi # 容器名
image: perl # 镜像
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"] # 运行的Job任务命令
restartPolicy: Never # 重启策略,仅支持Never和OnFailure
backoffLimit: 4 # 决定失败之前的重试次数

运行Job

1
2
[root@node1 ~]# kubectl apply -f job.yaml
job "pi" created

查看job状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[root@node1 ~]# kubectl describe jobs/pi
Name: pi
Namespace: default
Selector: controller-uid=b1db589a-2c8d-11e6-b324-0209dc45a495
Labels: controller-uid=b1db589a-2c8d-11e6-b324-0209dc45a495
job-name=pi
Annotations: <none>
Parallelism: 1
Completions: 1
Start Time: Tue, 07 Jun 2016 10:56:16 +0200
Pods Statuses: 0 Running / 1 Succeeded / 0 Failed
Pod Template:
Labels: controller-uid=b1db589a-2c8d-11e6-b324-0209dc45a495
job-name=pi
Containers:
pi:
Image: perl
Port:
Command:
perl
-Mbignum=bpi
-wle
print bpi(2000)
Environment: <none>
Mounts: <none>
Volumes: <none>
Events:
FirstSeen LastSeen Count From SubobjectPath Type Reason Message
--------- -------- ----- ---- ------------- -------- ------ -------
1m 1m 1 {job-controller } Normal SuccessfulCreate Created pod: pi-dtn4q

可通过kubectl get pods查看到成功完成Job的Pod。通过kubectl logs对应Pod名,可以获取此Pod的Job执行结果。

并行Jobs

Job有如下三类:

  1. 非并行的任务
  • 通常,只有一个Pod启动,除非Pod失败。
  • 一旦Pod成功终止,任务就完成了。
  1. 指定完成数的并行任务:
  • 为.spec.completions指定非零正值。
  • Job代表整体任务,当1到.spec.completions范围内的每个值都有一个成功的Pod时,它就完成了。
  1. 工作队列类的并行任务:
  • 不要指定.spec.completions,默认为.spec.parallelism。
  • Pod必须在它们之间或外部服务之间进行协调,以确定每个应该工作的内容。
  • 每个Pod能够独立地确定是否完成了所有对等操作,从而完成整个Job任务。
  • 当Job中的任何Pod成功终止时,则不会创建新的Pod。
  • 一旦至少一个Pod成功终止并且所有Pod终止,则任务成功完成。
  • 一旦任何Pod退出成功,其他任何Pod都不会为此任务做任何工作或输出。因为他们都处于退出的过程中。

对于非并行Job,您可以保留.spec.completions和.spec.parallelism。 当两者都未设置时,两者都默认为1

Job终止和清理

Job完成后,不会再创建Pod,但也不会删除Pod,保留Pod是为了完成后仍能查看它的日志。 Job对象在完成后也会保留,以便你可以查看其状态。删除 job可使用kubectl delete jobs(例如kubectl delete jobs pi或kubectl delete -f job.yaml),它创建的所有pod也将被删除。

默认情况下,除非Pod失败(restartPolicy = Never)或Container出错(restartPolicy = OnFailure),否则Job将不间断运行,此时Job一旦达到.spec.backoffLimit值,Job将被标记为失败,任何正在运行的Pod将被终止。

终止Job的另一种方法是设置活跃截止期。 通过将Job的.spec.activeDeadlineSeconds字段设置为秒数来执行此操作。 无论创建多少个Pod,activeDeadlineSeconds都应用于Job的持续时间。 一旦Job达到activeDeadlineSeconds,它的所有正在运行的Pod都将被终止,Job状态将变为type:Failed with reason:DeadlineExceeded。

请注意,Job的.spec.activeDeadlineSeconds优先于其.spec.backoffLimit。 因此,重试一个或多个失败的Pod的Job在达到activeDeadlineSeconds指定的时间限制后将不会部署其他Pod,即使尚未达到backoffLimit值也是如此。

配置示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
apiVersion: batch/v1
kind: Job
metadata:
name: pi-with-timeout
spec:
backoffLimit: 5
activeDeadlineSeconds: 100
template:
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never

系统中通常不再需要完成的Job。 将它们保留在系统中会给API服务器带来压力。 如果Job由更高级别的控制器(如CronJobs)直接管理,CronJobs可以根据指定的基于容量的清理策略清理Job。

可为Job指定成功后的TTL生命周期

1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: batch/v1
kind: Job
metadata:
name: pi-with-ttl
spec:
ttlSecondsAfterFinished: 100
template:
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never

上述配置表示Job pi-with-ttl将在完成后100秒自动删除。如果该字段设置为0,则Job将在完成后立即自动删除。 如果未设置该字段,则TTL控制器完成后将不会清除此Job。

请注意,此TTL机制是alpha功能参数,在Kubernetes v1.12版本中才引入。

你可以使用CronJob创建一个将在指定时间/日期运行的Job,类似于Unix工具crontab,我会在后面篇章详细讲解CronJob。