Kubernetes有两类业务,一种是长时间运行的在线业务,比如Redis、MySQL、nginx;一种是短时间运行的离线业务,比如一段有限的代码的执行,比如数据分析计算、视频转码等,这种必然会退出。
这些任务跟Pod不是完全的绑定关系,不应该由Pod实现。
Job和CronJob组合Pod,实现了对离线业务的处理,这类任务还要考虑失败处理、获取结果、状态检查等管理事项。
离线任务中,只需要跑一次的临时任务就是API对象Job,按时间定时调用的定时任务就是API对象CronJob。
apiVersion是batch/v1
kind是Job
metadata没区别
创建时需要使用kubectl create
下面是最简单的一个Hello World的Job:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
apiVersion: batch/v1
kind: Job
metadata:
creationTimestamp: null
name: hello-job
spec:
template:
metadata:
creationTimestamp: null
spec:
containers:
- image: nginx:alpine
name: hello-job
resources: {}
command: ["/bin/echo"]
args: ["hello", "world"]
restartPolicy: Never
status: {}
|
activeDeadlineSeconds:Pod运行的超时时间
backoffLimit:Pod的失败重试次数
completions:Job完成需要多少Pod
parallelism:允许并发的Pod数量
1
|
$ kubectl apply -f hello-job.yaml
|
k8s会从yaml中提取Pod并运行
1
2
3
|
$ kubectl get jobs
NAME COMPLETIONS DURATION AGE
hello-job 1/1 4s 3m59s
|
1
2
3
|
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
hello-job-gvxvz 0/1 Completed 0 4m8s
|
通过logs查看Pod的输出结果
1
2
|
$ kubectl logs hello-job-gvxvz
hello world
|
行的时间较长的job,通过sleep模拟
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
apiVersion: batch/v1
kind: Job
metadata:
name: sleep-job
spec:
# 15秒还没完成则认为超时
activeDeadlineSeconds: 15
# Pod的失败重试次数是2
backoffLimit: 2
# Job完成需要运行四个Pod
completions: 4
# 允许并发的Pod数是2
parallelism: 2
template:
spec:
restartPolicy: OnFailure
containers:
- image: nginx:alpine
name: echo-job
imagePullPolicy: IfNotPresent
command:
- sh
- -c
- sleep $(($RANDOM % 10 + 1)) && echo done
|
1
2
3
4
5
6
|
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
sleep-time-job-7g4qc 0/1 Completed 0 3m15s
sleep-time-job-86tqh 0/1 Completed 0 3m10s
sleep-time-job-kccn8 0/1 Completed 0 3m11s
sleep-time-job-rz27d 0/1 Completed 0 3m15s
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello-cj
spec:
schedule: '*/1 * * * *'
jobTemplate:
spec:
template:
spec:
restartPolicy: OnFailure
containers:
- image: nginx:alpine
name: echo-cj
imagePullPolicy: IfNotPresent
command: ["/bin/echo"]
args: ["hello", "world"]
|
1
2
3
|
$ kubectl get cj
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
hello-cj */1 * * * * False 0 35s 8m22s
|
第一个 spec 是 CronJob 自己的对象规格声明
第二个 spec 从属于“jobTemplate”,它定义了一个 Job 对象。
第三个 spec 从属于“template”,它定义了 Job 里运行的 Pod。
CronJob 使用定时规则控制 Job,Job 使用并发数量控制 Pod,Pod 再定义参数控制容器,容器再隔离控制进程,进程最终实现业务功能
Job 的关键字段是 spec.template,里面定义了用来运行业务的 Pod 模板,其他的重要字段有 completions、parallelism 等
CronJob 的关键字段是 spec.jobTemplate 和 spec.schedule,分别定义了 Job 模板和定时运行的规则。