如何使用 Kubernetes(k8s) 中的 Job 和 CronJob 执行定时任务?
eceagle33:从技术支持工程师的角度,使用 Kubernetes 的 Job 和 CronJob 执行定时任务的常用解决方案如下:
Job 管理一次性任务
场景:执行单次任务(如数据处理、数据库迁移)。
配置示例:
apiVersion: batch/v1
kind: Job
metadata:
name: example-job
spec:
template:
spec:
containers:
- name: task
image: busybox
command: ["sh", "-c", "echo Hello Kubernetes Job && sleep 30"]
restartPolicy: Never
backoffLimit: 3 # 失败重试次数
操作命令:
kubectl apply -f job.yaml # 创建Job
kubectl get jobs # 查看状态
kubectl logs job/example-job # 查看日志
CronJob 定时任务
场景:周期性任务(如每日备份、定时清理)。
配置示例:
apiVersion: batch/v1
kind: CronJob
metadata:
name: example-cronjob
spec:
schedule: "*/5 * * * *" # Cron表达式(每5分钟)
jobTemplate:
spec:
template:
spec:
containers:
- name: cron-task
image: busybox
command: ["sh", "-c", "date && echo CronJob executed"]
restartPolicy: OnFailure
concurrencyPolicy: Forbid # 禁止并发执行
successfulJobsHistoryLimit: 3 # 保留成功记录数
failedJobsHistoryLimit: 1 # 保留失败记录数
timeZone: "Asia/Shanghai" # 时区(K8s 1.25+)
操作命令:
kubectl apply -f cronjob.yaml
kubectl get cronjobs # 查看调度状态
kubectl get pods --watch # 观察定时触发的Pod
关键注意事项
Cron表达式:遵循标准格式(分 时 日 月 周),需测试验证。
资源限制:在容器配置中添加 resources.requests/limits 防止资源耗尽。
错误排查:
若任务未触发,检查 kubectl describe cronjob <name> 的 Events 日志。
若Pod异常,检查 kubectl describe pod <pod-name> 及容器日志。
历史记录:通过 successfulJobsHistoryLimit 控制存储的已完成Job数量,避免资源浪费。
515
2025-02-19 12:57:00