Job

Job 负责批量处理短暂的一次性任务 (short lived one-off tasks),即仅执行一次的任务,它保证批处理任务的一个或多个 Pod 成功结束。

Job Controller

Job Controller 负责根据 Job Spec 创建 Pod,并持续监控 Pod 的状态,直至其成功结束。如果失败,则根据 restartPolicy(只支持 OnFailure 和 Never,不支持 Always)决
定是否创建新的 Pod 再次重试任务。

Job Spec 格式

spec.template 格式和 Pod 是一样的:

  • RestartPolicy 仅支持 NeverOnFailure
  • 单个 Pod 时,默认 Pod 成功运行后 Job 即结束
  • .spec.completions 标志 Job 结束需要成功运行的 Pod 个数,默认为 1
  • .spec.parallelism 标志并行运行的 Pod 的个数,默认为 1,可以陪配合 .spec.completions 指定固定结束次数的并行 Job 。
  • spec.activeDeadlineSeconds 标志失败 Pod 的重试最大时间,超过这个时间不会继续重试
  • .spec.backoffLimit: 指定 Job 失败后进行重试的次数。默认是 6 次,每次失败后重试会有延迟时间,该时间是指数级增长,最长时间是 6min

已知问题 Issue #54870, .spec.template.spec.restartPolicy
设置为 Onfailure 时,会与 .spec.backoffLimit 冲突,可以暂时将 restartPolicy 设置为 Never 进行规避。

job.yml

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

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 创建 Job
$ kubectl create -f ./job.yaml
job "pi" created
# 查看 Job 的状态
$ kubectl describe job pi
Name: pi
Namespace: default
Selector: controller-uid=cd37a621-5b02-11e7-b56e-76933ddd7f55
Labels: controller-uid=cd37a621-5b02-11e7-b56e-76933ddd7f55
job-name=pi
Annotations: <none>
Parallelism: 1
Completions: 1
Start Time: Tue, 27 Jun 2017 14:35:24 +0800
Pods Statuses: 0 Running / 1 Succeeded / 0 Failed
Pod Template:
Labels: controller-uid=cd37a621-5b02-11e7-b56e-76933ddd7f55
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
--------- -------- ----- ---- ------------- -------- ------ -------
2m 2m 1 job-controller Normal SuccessfulCreate Created pod: pi-nltxv

# 使用'job-name=pi'标签查询属于该 Job 的 Pod
# 注意不要忘记'--show-all'选项显示已经成功(或失败)的 Pod
$ kubectl get pod --show-all -l job-name=pi
NAME READY STATUS RESTARTS AGE
pi-nltxv 0/1 Completed 0 3m

# 使用 jsonpath 获取 pod ID 并查看 Pod 的日志
$ pods=$(kubectl get pods --selector=job-name=pi --output=jsonpath={.items..metadata.name})
$ kubectl logs $pods
3.141592653589793238462643383279502...

Bare Pods

所谓 Bare Pods 是指直接用 PodSpec 来创建的 Pod(即不在 ReplicaSets 或者 ReplicationController 的管理之下的 Pods)。这些 Pod 在 Node 重启后不会自
动重启,但 Job 则会创建新的 Pod 继续任务。所以,推荐使用 Job 来替代 Bare Pods,即便是应用只需要一个 Pod。