Learn
Kubernetes/22-job-cronjob

Job 与 CronJob 批处理任务

Deployment/StatefulSet 跑的是「永远在线」的服务,而数据迁移、报表生成、备份这类一次性或周期性任务需要保证「跑完即止、失败可重试」。Kubernetes 用 Job 和 CronJob 来承载。

1. Job:运行到完成

Job 会启动 Pod 并反复重试,直到指定数量的 Pod 成功退出(completionMode:Indexed 支持并行分片)。

apiVersion: batch/v1
kind: Job
metadata:
  name: data-migrate
spec:
  completions: 1
  backoffLimit: 3          # 失败最多重试 3 次
  activeDeadlineSeconds: 600   # 整体超时 10 分钟
  template:
    spec:
      restartPolicy: Never     # Job 只能用 Never 或 OnFailure
      containers:
        - name: migrate
          image: myapp:migrate
          command: ["python", "migrate.py"]

2. CronJob:定时调度

CronJob 按类 Linux crontab 的语法周期触发 Job。

apiVersion: batch/v1
kind: CronJob
metadata:
  name: nightly-report
spec:
  schedule: "0 2 * * *"    # 每天凌晨 2 点
  concurrencyPolicy: Forbid   # 上一次没跑完则跳过本次
  successfulJobsHistoryLimit: 3
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: OnFailure
          containers:
            - name: report
              image: myapp:report
              command: ["python", "report.py"]
💡时区问题常被忽略

CronJob 的 schedule 默认按 kube-controller-manager 所在时区(通常是 UTC)。需要本地时区时设置 .spec.timeZone: "Asia/Shanghai"(1.27+)。

3. 查看与排错

kubectl get jobs
kubectl get cronjob
kubectl logs job/data-migrate
⚠️失败 Job 的 Pod 默认保留

Job 完成后成功/失败的 Pod 会留着便于排查,长期堆积占资源。用 ttlSecondsAfterFinished 让 Job 自动清理(需特性门控开启)。

小结

  • Job 保证任务跑完,支持重试、超时、并行完成
  • CronJob 用 crontab 语法周期触发,注意时区与并发策略
  • Job 的 restartPolicy 只能是 Never/OnFailure
  • 下一章学习 RBAC 如何控制「谁能做什么」 →