Deployment 和 DaemonSet 希望 Pod 保持一定数量, 持久运行下去, 除非用户明确删除, 否则一直存在. 这可以针对一直存在的业务需要.
对于非持久性任务, 归档文件, 定时报表等, 在任务结束后需要结束 Pod 的运行, 不需要 Pod 在继续存在. Job 就是用于解决此类需求的资源.
Job 的定义
Yaml 文件格式与 Deployment 基本类似
1 | apiVersion: app/v1 |
需要注意的是 kind: Job
, restartPolicy: Never
, command 是执行命令的数组.
其中 restartPolicy 支持 Never 和 OnFailure, 不支持 Always.
1 | # 启动 |
Job 的失败处理
模拟错误, 将 command 改为一个错误命令.
删除 job 后重新运行, 查看状态
1 | kubectl delete job JOB_NAME |
查看 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 | apiVersion: batch/v1beta |
创建服务, 查看服务状态
1 | kubectl apply -f CRONJOB_NAME.yaml |
删除服务
1 | kubectl delete cronjob CRONJOB_NAME |