Docker K8s 08 使用 Job 执行任务, Cronjob 执行定时任务

Deployment 和 DaemonSet 希望 Pod 保持一定数量, 持久运行下去, 除非用户明确删除, 否则一直存在. 这可以针对一直存在的业务需要.

对于非持久性任务, 归档文件, 定时报表等, 在任务结束后需要结束 Pod 的运行, 不需要 Pod 在继续存在. Job 就是用于解决此类需求的资源.

Job 的定义

Yaml 文件格式与 Deployment 基本类似

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
apiVersion: app/v1
kind: Job
metadata:
name: JOB_NAME
spec:
template:
metadata:
name: JOB_NAME
spec:
restartPolicy: Never
containers:
- image: busybox
name: ...
command:
- '/bin/sh'
- '... command'

需要注意的是 kind: Job, restartPolicy: Never, command 是执行命令的数组.

其中 restartPolicy 支持 Never 和 OnFailure, 不支持 Always.

1
2
3
4
5
6
7
# 启动
kubectl apply -f JOB_NAME.yaml
# 查看
kubectl get jobs
kubectl get pods --show-all
# 查看日志
kubectl logs POD_NAME

Job 的失败处理

模拟错误, 将 command 改为一个错误命令.

删除 job 后重新运行, 查看状态

1
2
3
4
kubectl delete job JOB_NAME
kubectl apply -f JOB_NAME.yaml
kubectl get jobs
kubectl get pods --show-all

查看 Job 状态发现 Desired 数为 1, Successful 数为 0.
查看 Pod 发现存在非常多 Status 为 ContainerConnotRun 的 Job. 并且一直在创建. 查看 log 发现所有 Pod 都报错结束.

此时即使 restartPolicy 为 Never, 还是会无线创建 Pod. 因为容器失败不会重启, 但是 Pod 副本数预期为 1, 却始终为 0, 所以一直在新建 Pod 服务.

使用 delete 终止服务

1
kubectl delete -f JOB_NAME.yaml

Job 的并行任务

这里并非是定义多个任务, 并行执行, 而是相同任务一起开启多个进程执行的概念, 基本用途是消费某一组数据而用.

默认 Job 为非并行任务, 指定 .spec.parallelism 值, 可以实现任务并行执行多少次的需求.

Job 的定时执行

使用 CronJob 替代 Job 实现定时任务.

需要 batch/v1beta 支持.

1
2
3
4
5
apiVersion: batch/v1beta
kind: CronJob
spec:
schedule: '*/1 * * * *'
...

创建服务, 查看服务状态

1
2
kubectl apply -f CRONJOB_NAME.yaml
kubectl get cronjobs --watch

删除服务

1
kubectl delete cronjob CRONJOB_NAME
Donate - Support to make this site better.
捐助 - 支持我让我做得更好.