Skip to content

Job & CronJob 批处理任务

Job

Job 管理一次性批处理任务,确保指定数量的 Pod 成功完成。

yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: data-migration
spec:
  completions: 1          # 需要成功完成的 Pod 数
  parallelism: 1          # 并行运行的 Pod 数
  backoffLimit: 3         # 失败重试次数
  activeDeadlineSeconds: 3600  # 超时时间(秒)
  ttlSecondsAfterFinished: 86400  # 完成后自动清理时间

  template:
    spec:
      restartPolicy: OnFailure  # Job 必须是 OnFailure 或 Never
      containers:
      - name: migration
        image: my-app:v2.0
        command: ["python", "migrate.py"]
        env:
        - name: DB_URL
          valueFrom:
            secretKeyRef:
              name: db-secret
              key: url

并行 Job 模式

yaml
# 固定完成数(completions=10,parallelism=3)
spec:
  completions: 10   # 总共需要 10 个 Pod 成功
  parallelism: 3    # 同时运行 3 个

# 工作队列模式(completions 不设置)
spec:
  parallelism: 5    # 5 个 Worker 并行消费队列
  # 当某个 Pod 成功退出时,Job 认为队列已空,停止创建新 Pod

CronJob

yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: daily-report
spec:
  schedule: "0 2 * * *"          # 每天凌晨 2 点(标准 cron 语法)
  timeZone: "Asia/Shanghai"       # 时区(K8s 1.27+)
  concurrencyPolicy: Forbid       # Allow | Forbid | Replace
  successfulJobsHistoryLimit: 3   # 保留成功 Job 数量
  failedJobsHistoryLimit: 1       # 保留失败 Job 数量
  startingDeadlineSeconds: 300    # 错过调度后的补偿窗口

  jobTemplate:
    spec:
      backoffLimit: 2
      template:
        spec:
          restartPolicy: OnFailure
          containers:
          - name: report
            image: report-generator:v1.0
            command: ["python", "generate_report.py"]

Cron 表达式速查

┌─────────── 分钟 (0-59)
│ ┌───────── 小时 (0-23)
│ │ ┌─────── 日 (1-31)
│ │ │ ┌───── 月 (1-12)
│ │ │ │ ┌─── 星期 (0-7, 0和7都是周日)
│ │ │ │ │
* * * * *

"*/5 * * * *"    每 5 分钟
"0 * * * *"      每小时整点
"0 0 * * *"      每天午夜
"0 0 * * 1"      每周一午夜
"0 0 1 * *"      每月 1 日午夜
"0 9-18 * * 1-5" 工作日 9-18 点每小时

常用操作

bash
# 手动触发 CronJob(测试用)
kubectl create job --from=cronjob/daily-report manual-run-$(date +%s)

# 查看 Job 状态
kubectl get jobs
kubectl describe job data-migration

# 查看 Job 的 Pod 日志
kubectl logs -l job-name=data-migration

# 暂停 CronJob
kubectl patch cronjob daily-report -p '{"spec":{"suspend":true}}'

本站内容由 褚成志 整理编写,仅供学习参考