Skip to content

控制器-CronJob(cj)

CronJob 核心概念与架构设计

Kubernetes CronJob 是集群中用于管理周期性任务的 API 对象,它基于标准的 cron 表达式定义调度时间,自动创建 Job 对象执行任务,相当于在 Job 控制器基础上增加了时间调度层。与传统的 Linux crontab 相比,CronJob 具有与容器编排系统深度集成的优势,能够更好地管理分布式环境下的定时任务。

核心工作原理

  1. 定义对象:用户创建 CronJob 资源,指定 Pod 模板和调度配置
  2. 监控调度:Kubernetes 控制器监控 CronJob 对象状态
  3. 生成 Job:根据预设时间表,控制器创建关联的 Job 对象
  4. 执行任务:Job 控制器创建 Pod 运行实际任务
  5. 状态跟踪:系统记录任务执行历史并根据策略清理资源

关键组件

  • schedule:必填字段,定义任务执行周期的 cron 表达式
  • jobTemplate:定义实际执行的 Job 模板
  • concurrencyPolicy:控制并发执行的策略
  • successfulJobsHistoryLimit/failedJobsHistoryLimit:控制历史记录保留数量

CronJob 资源配置

YAML 资源清单

以下是一个整合了并发控制、历史记录管理、启动截止时间、自动清理、资源限制和时区处理等所有高级特性的完整 CronJob YAML 示例:

yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: production-backup
  labels:
    app: database-backup
    environment: production
spec:
  # 基础调度配置
  schedule: "0 2 * * *" # 每天UTC时间2点执行(北京时间10点)
  timeZone: "Asia/Shanghai" # Kubernetes 1.25+ 支持直接指定时区

  # 并发控制策略
  concurrencyPolicy: Forbid # 禁止并发执行

  # 任务历史记录管理
  successfulJobsHistoryLimit: 5 # 保留5次成功记录
  failedJobsHistoryLimit: 3 # 保留3次失败记录

  # 启动截止时间
  startingDeadlineSeconds: 600 # 允许最多延迟10分钟

  # Job模板配置
  jobTemplate:
    metadata:
      annotations:
        backup-type: "full"
    spec:
      # 任务自动清理
      ttlSecondsAfterFinished: 86400 # 任务完成后24小时自动删除

      # 任务重试策略
      backoffLimit: 3 # 失败后最多重试3次
      completions: 1 # 需要1个Pod成功完成
      parallelism: 1 # 同时运行1个Pod

      template:
        metadata:
          labels:
            job-task: "db-backup"
        spec:
          # 容器配置
          containers:
            - name: backup-container
              image: my-registry/backup-tool:1.5.0
              imagePullPolicy: IfNotPresent
              command: ["/bin/sh", "-c"]
              args:
                - >
                  /scripts/backup.sh --db-host=${DB_HOST}
                  --output=/backups/$(date +%Y%m%d).sql

              # 资源限制与请求
              resources:
                requests:
                  cpu: "500m"
                  memory: "512Mi"
                limits:
                  cpu: "1"
                  memory: "1Gi"

              # 时区处理(兼容Kubernetes <1.25的方案)
              env:
                - name: TZ
                  value: "Asia/Shanghai"

              # 挂载卷配置
              volumeMounts:
                - name: backup-volume
                  mountPath: /backups
                - name: config
                  mountPath: /scripts
                  readOnly: true

          # 卷定义
          volumes:
            - name: backup-volume
              persistentVolumeClaim:
                claimName: backup-pvc
            - name: config
              configMap:
                name: backup-scripts

          # Pod级配置
          restartPolicy: OnFailure
          affinity:
            nodeAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
                nodeSelectorTerms:
                  - matchExpressions:
                      - key: node-role
                        operator: In
                        values:
                          - backup

          # 安全上下文
          securityContext:
            runAsUser: 1000
            runAsGroup: 1000
            fsGroup: 1000

          # 镜像拉取密钥(如有私有仓库)
          imagePullSecrets:
            - name: regcred

并发控制策略

yaml
concurrencyPolicy: Forbid # 可选值:Allow(默认)|Forbid|Replace
  • Allow:允许并发执行(适合独立任务)
  • Forbid:禁止并发(适合需要独占资源的任务)
  • Replace:取消当前任务,启动新任务(适合优先级高的新任务)

任务历史管理

yaml
successfulJobsHistoryLimit: 5
failedJobsHistoryLimit: 3
  • 根据存储空间和调试需求调整保留数量
  • 生产环境建议保留更多失败记录以便排查问题

启动截止时间

yaml
startingDeadlineSeconds: 600
  • 设置合理的宽限时间(考虑集群负载波动)
  • 设为0表示立即失败,不等待

自动清理机制

yaml
ttlSecondsAfterFinished: 86400
  • 结合集群规模调整清理周期
  • 重要任务可设置更长保留时间或禁用自动清理

资源限制

yaml
resources:
  requests:
    cpu: "500m"
    memory: "512Mi"
  limits:
    cpu: "1"
    memory: "1Gi"
  • 必须设置requests/limits避免资源争抢
  • 根据实际任务需求调整数值

时区方案

yaml
timeZone: "Asia/Shanghai" # 直接指定(K8s 1.25+)
env:
  - name: TZ
    value: "Asia/Shanghai" # 容器内时区设置
  • 优先使用timeZone字段(需K8s版本支持)
  • 旧版本使用容器环境变量方案

创建与管理命令

创建 CronJob

bash
kubectl apply -f cronjob.yaml
# 或使用命令行直接创建
kubectl create cronjob my-job --schedule="*/1 * * * *" --image=busybox -- /bin/sh -c "date"

查看状态

bash
kubectl get cronjobs  # 查看所有CronJob
kubectl describe cronjob <name>  # 查看详情(包括最近执行时间、事件等)

查看任务历史

bash
kubectl get jobs  # 查看已触发的Job
kubectl get pods --selector=job-name=<job-name>  # 获取关联Pod
kubectl logs <pod-name>  # 查看任务日志

删除 CronJob

bash
kubectl delete cronjob <name>
# 或通过配置文件删除
kubectl delete -f cronjob.yaml

常见Cron表达式示例

表达式说明
*/5 * * * *每5分钟执行一次
0 * * * *每小时执行一次
0 2 * * *每天凌晨2点执行
0 0 * * 1每周一午夜执行
0 0 1 * *每月1日午夜执行
@daily每天午夜执行(等同于0 0 * * *)
@hourly每小时执行一次(等同于0 * * * *)

可以使用 crontab.guru 工具验证和解释cron表达式。