Kubernetes Job 与 CronJob
Deployment 适合长期运行的服务。Job 和 CronJob 适合一次性任务和定时任务。
常见场景:
- 数据迁移。
- 批处理脚本。
- 定时清理。
- 定时报表。
- 离线计算。
Job
Job 会创建 Pod 执行任务,并确保任务成功完成。
yaml
apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
restartPolicy: Never
containers:
- name: pi
image: perl:5.34
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
backoffLimit: 4创建:
shell
kubectl apply -f job.yaml查看:
shell
kubectl get job
kubectl get pod
kubectl logs job/pirestartPolicy
Job 的 Pod 通常使用:
yaml
restartPolicy: Never也可以使用:
yaml
restartPolicy: OnFailure不能使用 Always,因为 Job 需要判断任务是否完成。
重试与超时
yaml
spec:
backoffLimit: 4
activeDeadlineSeconds: 600backoffLimit:失败后最多重试次数。activeDeadlineSeconds:任务最长运行时间。
并行 Job
yaml
apiVersion: batch/v1
kind: Job
metadata:
name: parallel-job
spec:
completions: 10
parallelism: 3
template:
spec:
restartPolicy: Never
containers:
- name: worker
image: busybox
command: ["sh", "-c", "echo processing && sleep 5"]completions:需要成功完成的 Pod 数量。parallelism:允许同时运行的 Pod 数量。
自动清理完成的 Job
yaml
spec:
ttlSecondsAfterFinished: 3600任务完成 1 小时后,Job 和相关 Pod 会自动清理。
CronJob
CronJob 按时间计划创建 Job。
yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/5 * * * *"
jobTemplate:
spec:
template:
spec:
restartPolicy: OnFailure
containers:
- name: hello
image: busybox
command:
- /bin/sh
- -c
- date; echo hello from kubernetes查看:
shell
kubectl get cronjob
kubectl get jobCron 表达式
格式:
text
分钟 小时 日 月 星期示例:
| 表达式 | 说明 |
|---|---|
*/5 * * * * | 每 5 分钟 |
0 * * * * | 每小时 |
0 2 * * * | 每天 2 点 |
0 2 * * 1 | 每周一 2 点 |
并发策略
yaml
spec:
concurrencyPolicy: Forbid可选值:
| 策略 | 说明 |
|---|---|
Allow | 允许并发运行 |
Forbid | 上一次未完成时跳过本次 |
Replace | 新任务替换旧任务 |
对于备份、迁移、同步类任务,通常使用 Forbid。
历史记录保留
yaml
spec:
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 1避免 CronJob 长期运行后积累太多历史 Job。
常用命令
shell
# 查看 Job
kubectl get job
# 查看日志
kubectl logs job/pi
# 删除 Job
kubectl delete job pi
# 查看 CronJob
kubectl get cronjob
# 暂停 CronJob
kubectl patch cronjob hello -p '{"spec":{"suspend":true}}'
# 恢复 CronJob
kubectl patch cronjob hello -p '{"spec":{"suspend":false}}'