0%

Job

一个Job会创建一个或多个Pod,并保证这些Pod成功终止。

一个简单的场景,创建一个Job以保证一个Pod可靠地执行完成。如果第一个Pod执行失败或者在未执行完成前被删除,Job将会启动一个新的Pod。

一个简单的案例

计算π的小数点后的2000位。该manifest以上传到了Github上,地址是:https://raw.githubusercontent.com/chengqing-su/kubernetes-learning/master/job/pi.yaml

1
2
3
4
5
6
7
8
9
10
11
12
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

在该示例中,指定restartPolicy的值为Never。是否可以不指定呢?不可以,这个字段对Job来说是必须指定的,因为 Job 只支持NeverOnFailure,而restartPolicy的默认值是Always

创建

执行命令:

1
kubectl apply -f https://raw.githubusercontent.com/chengqing-su/kubernetes-learning/master/job/pi.yaml

过程:

create

任务类型

在介绍Job的任务类型之前,会先介绍两个相关的字段:

.spec.completions:指定该Job所期待成功完成的Pod数量。只有成功运行完指定数量的Pod之后,Job才会变成完成状态。默认值为1。

.spec.parallelism:指定Job在任何给定时间应运行的Pod的最大数目。默认值为1。

非并行Job

不需要指定上面的两个字段。

除非Pod发生故障,否则仅启动一个Pod。一旦该Pod成功终止,Job进入完成状态。

上面示例中的Job就是非并行Job。

固定完成计数的并行Job

必须为.spec.completions指定一个非零的正值,比如N。只有1到N这个范围中的每个值都有一个成功的Pod时,Job才会进入完成状态。

.spec.parallelism可以不指定。下面的示例中.spec.completions为6,.spec.parallelism为2. Github地址:https://raw.githubusercontent.com/chengqing-su/kubernetes-learning/master/job/pi-fixed.yaml

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

该示例的执行过程如下:
fixed

每次最多有2个Pod在创建或者运行状态,只有这2个运行完成之后,后续的Pod才能创建。当有6个Pod成功终止后,Job完成。

具有工作队列的并行Job

不能指定.spec.completions的值,同时需要为.spec.parallelism指定一个非负整数N。Job会启动N个Pod, 当其中的一个Pod成功终止,其他的Pod也都终止时,Job进入完成状态。当一个Pod成功退出后,其他的Pod不应该继续为这个Job做任何工作或者任何输出,它们都应该进入退出的过程。

下面的示例中.spec.completions没有指定,.spec.parallelism为2. Github地址:https://raw.githubusercontent.com/chengqing-su/kubernetes-learning/master/job/pi-work.yaml

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

该示例的执行过程如下:
work-queue

清理

Job完成后,不会再创建其他Pod,但是Pod也不会被删除。因此可以查看已完成的容器的日志,检查是否有错误、警告或其他诊断输出。Job也会保留下来,但是通常情况下,系统是不需要这些已经完成了的Job。如果将它们保留在系统中会给API服务器带来压力。如何来清理这些Job?

  • 如果Job是直接被CornJob管理,则可以通过指定CornJob的策略来进行清理。

  • 手动删除。比如,上面的示例都可以通过kubectl delete jobs pi来清理。

  • (该功能还处于alpha状态)使用TTL机制自动删除已完成或者失败了的Job。