Kubernetes之Job

对于ReplicaSet、ReplicationController等类型的控制器而言,它希望pod保持预期数目、持久运行下去,除非用户明确删除,否则这些对象一直存在,它们针对的是耐久性任务,如web服务等。对于非耐久性任务,比如压缩文件,任务完成后,pod需要结束运行,不需要pod继续保持在系统中,这个时候就要用到Job。因此说Job是对ReplicaSet、ReplicationController等持久性控制器的补充。

Job与其它控制器的细微差别:

  • Job定义方法与ReplicaSet等控制器相似,只有细微差别,如下:
    • Job中的restartPolicy必需是”Never”或者”OnFailure”,这个很好理解,因为pod要运行到结束,而不是反复重新启动。
    • Job不需要选择器,其中的pod也不需要标签,系统在创建Job时会自动添加相关内容。当然用户也可以出于资源组织的目的添加标签,但这个与Job本身的实现没有关系。
    • Job新增加两个字段:.spec.completions、.spec.parallelism。
    • backoffLimit字段

Job参数:

.spec.completions标志Job结束需要成功运行的Pod个数,默认为1
.spec.parallelism标志并行运行的Pod的个数,默认为1
.spec.backoffLimit指定在此Job在标记为失败之前重试的次数,默认为6次

根据.spec.completions和.spec.Parallelism的设置,可以将Job划分为以下几种pattern:

job

Job Controller:

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

Job 注意:

1、RestartPolicy仅支持Never或OnFailure
2、单个Pod时,默认Pod成功运行后Job即结束

一个简单的例子:

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

命令:

1
2
3
4
5
$ kubectl create -f ./job.yaml
job "pi" created
$ pods=$(kubectl get pods --selector=job-name=pi --output=jsonpath={.items..metadata.name})
$ kubectl logs $pods
3.141592653589793238462643383279502...

固定结束次数的Job示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
apiVersion: batch/v1
kind: Job
metadata:
name: busybox
spec:
completions: 3
template:
metadata:
name: busybox
spec:
containers:
- name: busybox
image: busybox
command: ["echo", "hello"]
restartPolicy: Never

裸Pods:

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


Kubernetes之Job
https://system51.github.io/2019/08/23/Kubernetes-Job/
作者
Mr.Ye
发布于
2019年8月23日
许可协议