k8s 提供了Job资源,Job可以控制pod只启动一次,等pod中内部进程结束后,容器不在重启,pod完成状态。Job控制的pod资源适合做一次任务。
当Job控制的Pod发生故障时,可以选择restartPolicy的重启策略进行重启,OnFailure失败时才会重启,或者不重启,不运行设置Always,因为Job适合只做一次就结束的任务。
1、Job管理创建单个pod
下面以job.yaml为例
apiVersion: batch/v1
kind: Job
metadata:
name: myjob
spec:
template:
metadata:
name: mypod
spec:
containers:
- name: my-busybox
image: busybox
imagePullPolicy: IfNotPresent
command: ["/bin/sh", "-c", "sleep 60"]
restartPolicy: OnFailure
下面创建并查看Job以及创建的pod
#创建Job
[root@k8s-master01 job_work]# kubectl create -f job.yaml
job.batch/myjob created
#查看创建的Job,COMPLETIONS显示创建了一个Pod,0个pod处于完成状态;DURATION显示Job任务持续了6s
[root@k8s-master01 job_work]# kubectl get job
NAME COMPLETIONS DURATION AGE
myjob 0/1 6s 6s
#查看Job创建的pod
[root@k8s-master01 job_work]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myjob-6rlwx 1/1 Running 0 11s
#过一段时间再查看,pod已经完成状态,并且没有再重启
[root@k8s-master01 job_work]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myjob-6rlwx 0/1 Completed 0 103s
#创建的Job也显示已经完成
[root@k8s-master01 job_work]# kubectl get job
NAME COMPLETIONS DURATION AGE
myjob 1/1 62s 109s
2、Job创建多个Pod
上述时一个作业任务创建一个pod进行工作,另外也可以创建多个Pod实例,并以并行或串行的方式运行。
下面以job1.yaml为例
apiVersion: batch/v1
kind: Job
metadata:
name: myjob
spec:
completions: 3 #完成myjob任务,创建3个pod
parallelism: 2 #同时有2个pod会并行执行,当结束一个后,会立即启动下一个
template:
metadata:
name: mypod
spec:
restartPolicy: Never
containers:
- name: busybox
image: busybox
imagePullPolicy: IfNotPresent
command: ["/bin/sh", "-c", "sleep 60"]
下面创建job
#创建job1
[root@k8s-master01 job_work]# kubectl create -f job1.yaml
job.batch/myjob created
#查询创建的job,有3个pod尚未执行完成
[root@k8s-master01 job_work]# kubectl get job
NAME COMPLETIONS DURATION AGE
myjob 0/3 5s 5s
#查询创建的pod,2个正在执行
[root@k8s-master01 job_work]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myjob-fnsr7 1/1 Running 0 12s 10.244.2.101 k8s-node02 <none> <none>
myjob-mt8gl 1/1 Running 0 12s 10.244.1.99 k8s-node01 <none> <none>
#60s后查询pod,有2个pod已经完成状态,一个正在创建中
[root@k8s-master01 job_work]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myjob-9dbgf 0/1 ContainerCreating 0 0s <none> k8s-node01 <none> <none>
myjob-fnsr7 1/1 Running 0 62s 10.244.2.101 k8s-node02 <none> <none>
myjob-mt8gl 0/1 Completed 0 62s 10.244.1.99 k8s-node01 <none> <none>
#过一段时间再查询,2个pod已经完成状态,1个正在运行中,运行结束后job就完成了。
[root@k8s-master01 job_work]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myjob-9dbgf 1/1 Running 0 3s 10.244.1.100 k8s-node01 <none> <none>
myjob-fnsr7 0/1 Completed 0 65s 10.244.2.101 k8s-node02 <none> <none>
myjob-mt8gl 0/1 Completed 0 65s 10.244.1.99 k8s-node01 <none> <none>
上述示例是pod并行执行任务,也可设置pod穿行执行任务,再上述基础上只需要配置completions: 3 ,3个pod会串行执行,此时parallelism为1,也可以显示的指定parallelism: 1 , 也会让3个pod串行执行。
另外也可以在job运行时,修改parallelism以达到修改job运行pod并行的个数
kubectl scale job myjob --replicas 3
3、设置job运行时间
apiVersion: batch/v1
kind: Job
metadata:
name: myjob
spec:
activeDeadlineSeconds: 40 #如果pod在40s内没有运行完成,pod标记失败
backoffLimit: 3 #pod重启次数
completions: 3
parallelism: 2
template:
metadata:
name: mypod
spec:
restartPolicy: Never
containers:
- name: busybox
image: busybox
imagePullPolicy: IfNotPresent
command: ["/bin/sh", "-c", "sleep 60"]
参考《kubenetes in action》