16.3.7 Job与CronJob批处理任务

Job与CronJob批处理任务#

导语与适用场景#

  • Job:一次性/有限次数执行的批处理任务,保证成功完成指定次数。
  • CronJob:按时间计划周期性触发 Job,适合定时备份、日志清理、账单汇总等。

原理草图(控制器关系)#

文章图片

环境准备与安装检查#

以已安装 Kubernetes 集群为前提,确认控制器组件工作正常。

# 1) 检查集群与API可用性
kubectl cluster-info

# 2) 检查 batch API 版本
kubectl api-resources | grep -E 'jobs|cronjobs'

# 3) 检查控制器是否正常(核心控制器在 kube-controller-manager)
kubectl get pods -n kube-system | grep controller

命令解释:
- kubectl api-resources:确认 Job/CronJob 资源存在。
- kubectl get pods -n kube-system:确认控制器组件运行。

Job 核心字段与执行语义(含示例)#

关键字段:
- spec.completions:成功完成次数。
- spec.parallelism:并行执行数量。
- spec.backoffLimit:失败重试次数。
- spec.activeDeadlineSeconds:超时终止。
- spec.ttlSecondsAfterFinished:完成后自动清理。
- restartPolicy:建议 Never/OnFailure

示例:数据初始化 Job

文件:/root/k8s/job-init-db.yaml

apiVersion: batch/v1
kind: Job
metadata:
  name: init-db
spec:
  completions: 1
  parallelism: 1
  backoffLimit: 3
  activeDeadlineSeconds: 60
  ttlSecondsAfterFinished: 120
  template:
    spec:
      containers:
      - name: init
        image: busybox:1.36
        command: ["sh","-c","echo init && sleep 2"]
      restartPolicy: OnFailure

执行与预期结果:

kubectl apply -f /root/k8s/job-init-db.yaml

# 查看状态:COMPLETIONS 变为 1/1
kubectl get jobs init-db

# 查看Pod与日志
kubectl get pods -l job-name=init-db
kubectl logs -l job-name=init-db

CronJob 核心字段与调度规则(含示例)#

关键字段:
- spec.schedule:Cron 表达式(分 时 日 月 周)。
- spec.concurrencyPolicy:并发策略 Allow/Forbid/Replace
- spec.startingDeadlineSeconds:错过执行的容忍时间。
- successfulJobsHistoryLimit / failedJobsHistoryLimit:保留历史数量。

示例:定时备份 CronJob

文件:/root/k8s/cronjob-backup.yaml

apiVersion: batch/v1
kind: CronJob
metadata:
  name: backup
spec:
  schedule: "*/2 * * * *"
  concurrencyPolicy: Forbid
  startingDeadlineSeconds: 60
  successfulJobsHistoryLimit: 3
  failedJobsHistoryLimit: 1
  jobTemplate:
    spec:
      backoffLimit: 2
      template:
        spec:
          containers:
          - name: backup
            image: busybox:1.36
            command: ["sh","-c","echo backup $(date) && sleep 5"]
          restartPolicy: OnFailure

执行与预期结果:

kubectl apply -f /root/k8s/cronjob-backup.yaml

# 观察最近调度时间
kubectl get cronjobs backup

# 观察生成的 Job 与 Pod
kubectl get jobs --sort-by=.metadata.creationTimestamp | tail -n 3
kubectl get pods -l job-name=backup-$(date +%Y%m%d%H%M) 2>/dev/null

命令解释:
- kubectl get cronjobs:查看 LAST SCHEDULE 是否更新。
- kubectl get jobs:确认 CronJob 生成的 Job 数量与状态。

排错与诊断(含命令与解释)#

1) Job 一直失败

# 查看 Job 事件与失败原因
kubectl describe job init-db

# 查看 Pod 事件与日志
kubectl describe pod -l job-name=init-db
kubectl logs -l job-name=init-db

常见原因: 镜像拉取失败、命令返回非 0、权限不足、资源不足。

2) CronJob 不执行

# 查看 CronJob 事件
kubectl describe cronjob backup

# 检查控制器日志(需要集群权限)
kubectl -n kube-system logs deploy/kube-controller-manager | grep cron

常见原因: Cron 表达式时区误差、startingDeadlineSeconds 太短、控制器异常。

3) 任务执行过多或重叠

# 查看并发策略与历史保留
kubectl get cronjob backup -o yaml | grep -E 'concurrencyPolicy|History'

生产实践建议#

  • Job 设置 activeDeadlineSecondsbackoffLimit,避免长时间挂起。
  • 使用 ttlSecondsAfterFinished 自动清理历史 Job。
  • CronJob 建议 concurrencyPolicy: Forbid 避免重叠。
  • 与 ConfigMap/Secret 配合管理配置与凭据。

练习#

  1. 编写一个 Job,完成 3 次成功执行,parallelism=2,验证 COMPLETIONS 的变化。
  2. 编写一个 CronJob 每分钟执行,设置 concurrencyPolicy=Replace,观察历史 Job 的变化。
  3. 人为设置一个错误镜像,使用 kubectl describe 定位失败原因并修复。