16.3.7 Job与CronJob批处理任务
Job与CronJob批处理任务#
导语与适用场景#
- Job:一次性/有限次数执行的批处理任务,保证成功完成指定次数。
- CronJob:按时间计划周期性触发 Job,适合定时备份、日志清理、账单汇总等。
原理草图(控制器关系)#
环境准备与安装检查#
以已安装 Kubernetes 集群为前提,确认控制器组件工作正常。
# 1) 检查集群与API可用性
kubectl cluster-info
# 2) 检查 batch API 版本
kubectl api-resources | grep -E 'jobs|cronjobs'
# 3) 检查控制器是否正常(核心控制器在 kube-controller-manager)
kubectl get pods -n kube-system | grep controller
命令解释:
- kubectl api-resources:确认 Job/CronJob 资源存在。
- kubectl get pods -n kube-system:确认控制器组件运行。
Job 核心字段与执行语义(含示例)#
关键字段:
- spec.completions:成功完成次数。
- spec.parallelism:并行执行数量。
- spec.backoffLimit:失败重试次数。
- spec.activeDeadlineSeconds:超时终止。
- spec.ttlSecondsAfterFinished:完成后自动清理。
- restartPolicy:建议 Never/OnFailure。
示例:数据初始化 Job
文件:/root/k8s/job-init-db.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: init-db
spec:
completions: 1
parallelism: 1
backoffLimit: 3
activeDeadlineSeconds: 60
ttlSecondsAfterFinished: 120
template:
spec:
containers:
- name: init
image: busybox:1.36
command: ["sh","-c","echo init && sleep 2"]
restartPolicy: OnFailure
执行与预期结果:
kubectl apply -f /root/k8s/job-init-db.yaml
# 查看状态:COMPLETIONS 变为 1/1
kubectl get jobs init-db
# 查看Pod与日志
kubectl get pods -l job-name=init-db
kubectl logs -l job-name=init-db
CronJob 核心字段与调度规则(含示例)#
关键字段:
- spec.schedule:Cron 表达式(分 时 日 月 周)。
- spec.concurrencyPolicy:并发策略 Allow/Forbid/Replace。
- spec.startingDeadlineSeconds:错过执行的容忍时间。
- successfulJobsHistoryLimit / failedJobsHistoryLimit:保留历史数量。
示例:定时备份 CronJob
文件:/root/k8s/cronjob-backup.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: backup
spec:
schedule: "*/2 * * * *"
concurrencyPolicy: Forbid
startingDeadlineSeconds: 60
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 1
jobTemplate:
spec:
backoffLimit: 2
template:
spec:
containers:
- name: backup
image: busybox:1.36
command: ["sh","-c","echo backup $(date) && sleep 5"]
restartPolicy: OnFailure
执行与预期结果:
kubectl apply -f /root/k8s/cronjob-backup.yaml
# 观察最近调度时间
kubectl get cronjobs backup
# 观察生成的 Job 与 Pod
kubectl get jobs --sort-by=.metadata.creationTimestamp | tail -n 3
kubectl get pods -l job-name=backup-$(date +%Y%m%d%H%M) 2>/dev/null
命令解释:
- kubectl get cronjobs:查看 LAST SCHEDULE 是否更新。
- kubectl get jobs:确认 CronJob 生成的 Job 数量与状态。
排错与诊断(含命令与解释)#
1) Job 一直失败
# 查看 Job 事件与失败原因
kubectl describe job init-db
# 查看 Pod 事件与日志
kubectl describe pod -l job-name=init-db
kubectl logs -l job-name=init-db
常见原因: 镜像拉取失败、命令返回非 0、权限不足、资源不足。
2) CronJob 不执行
# 查看 CronJob 事件
kubectl describe cronjob backup
# 检查控制器日志(需要集群权限)
kubectl -n kube-system logs deploy/kube-controller-manager | grep cron
常见原因: Cron 表达式时区误差、startingDeadlineSeconds 太短、控制器异常。
3) 任务执行过多或重叠
# 查看并发策略与历史保留
kubectl get cronjob backup -o yaml | grep -E 'concurrencyPolicy|History'
生产实践建议#
- Job 设置
activeDeadlineSeconds与backoffLimit,避免长时间挂起。 - 使用
ttlSecondsAfterFinished自动清理历史 Job。 - CronJob 建议
concurrencyPolicy: Forbid避免重叠。 - 与 ConfigMap/Secret 配合管理配置与凭据。
练习#
- 编写一个 Job,完成 3 次成功执行,
parallelism=2,验证COMPLETIONS的变化。 - 编写一个 CronJob 每分钟执行,设置
concurrencyPolicy=Replace,观察历史 Job 的变化。 - 人为设置一个错误镜像,使用
kubectl describe定位失败原因并修复。