Skip to content

Kubernetes Job 与 CronJob

Deployment 适合长期运行的服务。Job 和 CronJob 适合一次性任务和定时任务。

常见场景:

  • 数据迁移。
  • 批处理脚本。
  • 定时清理。
  • 定时报表。
  • 离线计算。

Job

Job 会创建 Pod 执行任务,并确保任务成功完成。

yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      restartPolicy: Never
      containers:
        - name: pi
          image: perl:5.34
          command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
  backoffLimit: 4

创建:

shell
kubectl apply -f job.yaml

查看:

shell
kubectl get job
kubectl get pod
kubectl logs job/pi

restartPolicy

Job 的 Pod 通常使用:

yaml
restartPolicy: Never

也可以使用:

yaml
restartPolicy: OnFailure

不能使用 Always,因为 Job 需要判断任务是否完成。

重试与超时

yaml
spec:
  backoffLimit: 4
  activeDeadlineSeconds: 600
  • backoffLimit:失败后最多重试次数。
  • activeDeadlineSeconds:任务最长运行时间。

并行 Job

yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: parallel-job
spec:
  completions: 10
  parallelism: 3
  template:
    spec:
      restartPolicy: Never
      containers:
        - name: worker
          image: busybox
          command: ["sh", "-c", "echo processing && sleep 5"]
  • completions:需要成功完成的 Pod 数量。
  • parallelism:允许同时运行的 Pod 数量。

自动清理完成的 Job

yaml
spec:
  ttlSecondsAfterFinished: 3600

任务完成 1 小时后,Job 和相关 Pod 会自动清理。

CronJob

CronJob 按时间计划创建 Job。

yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/5 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: OnFailure
          containers:
            - name: hello
              image: busybox
              command:
                - /bin/sh
                - -c
                - date; echo hello from kubernetes

查看:

shell
kubectl get cronjob
kubectl get job

Cron 表达式

格式:

text
分钟 小时 日 月 星期

示例:

表达式说明
*/5 * * * *每 5 分钟
0 * * * *每小时
0 2 * * *每天 2 点
0 2 * * 1每周一 2 点

并发策略

yaml
spec:
  concurrencyPolicy: Forbid

可选值:

策略说明
Allow允许并发运行
Forbid上一次未完成时跳过本次
Replace新任务替换旧任务

对于备份、迁移、同步类任务,通常使用 Forbid

历史记录保留

yaml
spec:
  successfulJobsHistoryLimit: 3
  failedJobsHistoryLimit: 1

避免 CronJob 长期运行后积累太多历史 Job。

常用命令

shell
# 查看 Job
kubectl get job

# 查看日志
kubectl logs job/pi

# 删除 Job
kubectl delete job pi

# 查看 CronJob
kubectl get cronjob

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

# 恢复 CronJob
kubectl patch cronjob hello -p '{"spec":{"suspend":false}}'

参考