k8s | 深入理解 Job 和 CronJob
Job 负责批量处理短暂的一次性任务 (short lived one-off tasks),即仅执行一次的任务,它保证批处理任务的一个或多个 Pod 成功结束。
CronJob 即定时任务,就类似于 Linux 系统的 crontab,在指定的时间周期运行指定的任务。例如备份、数据清理等
工作原理
Job
Job Controller 负责根据 Job Spec 创建 Pod,并持续监控 Pod 的状态,直至其成功结束。如果失败,则根据 restartPolicy(只支持 OnFailure 和 Never,不支持 Always)决定是否创建新的 Pod 再次重试任务。
CronJob
- 创建 CronJob 对象。为其分配唯一的名称。
- 接收到任务触发时间。定期检查 时间表以确定下一个任务的触发时间。某个任务的触发时间已到达时,执行下一步操作。
- 创建 Job 对象。CronJob 控制器会根据 CronJob 对象的定义创建一个 Job 模板
- 创建 Pod 对象。在创建 Job 实例期间,CronJob 控制器会根据 Job 模板创建一个或多个 Pod 实例,并将它们调度到集群中的节点上运行。
- 监视 Pod 状态。CronJob 控制器会监视 Pod 的状态,并根据需要更新 Pod 或创建新的 Pod。
- 删除 Job 和 Pod 对象。一旦任务完成,CronJob 控制器会删除 Job 和 Pod 对象。
- 更新 CronJob 对象状态。CronJob 控制器会监视 Job 的状态,并更新 CronJob 对象的状态
Job类型
- 非并行 Job:通常创建一个 Pod 直至其成功结束
- 固定结束次数的 Job:设置
.spec.completions
,创建多个 Pod,直到.spec.completions
个 Pod 成功结束 - 带有工作队列的并行 Job:设置
.spec.Parallelism
但不设置.spec.completions
,当所有 Pod 结束并且至少一个成功时,Job 就认为是成功
使用
Job 使用
创建 job.yaml 文件
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
详细解释
- spec.template 格式同 Pod
- RestartPolicy 仅支持 Never 或 OnFailure
- 单个 Pod 时,默认 Pod 成功运行后 Job 即结束
.spec.completions
标志 Job 结束需要成功运行的 Pod 个数,默认为 1.spec.parallelism
标志并行运行的 Pod 的个数,默认为 1spec.activeDeadlineSeconds
标志失败 Pod 的重试最大时间,超过这个时间不会继续重试
执行 kubectl create -f ./job.yaml
查看 job 运行的详细信息
kubectl get jobs
kubectl describe job pi
kubectl get pod --show-all -l job-name=pi
CronJob使用
apiVersion: batch/v1beta1
kind: CronJob #资源类型
metadata:
name: my-cronjob
spec:
schedule: "0 * * * *"
jobTemplate:
spec:
template:
metadata:
labels:
app: my-cronjob
spec:
containers:
- name: my-container
image: my-image:latest
imagePullPolicy: Always
restartPolicy: OnFailure
- 定义了一个名为"my-cronjob"的CronJob,并设置了其调度计划为每小时运行一次。
- 定义了作业模板,该模板包含一个Pod模板,其中包含一个容器,该容器将运行我们创建的容器镜像。
- 将重启策略设置为"OnFailure",以便在作业失败时自动重新启动。
执行
kubectl apply -f my-cronjob.yaml
查看CronJob的状态
kubectl get cronjobs
评论区