从技术支持工程师的角度,使用 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数量,避免资源浪费。