Kubernetes CronJob 速查手册:核心语法与实战示例

14 阅读1分钟

Kubernetes CronJob 速查手册:核心语法与实战示例

你是否曾经因为 Kubernetes CronJob 的复杂配置而感到头疼?本文提供详尽的语法和示例,帮你快速解决实际问题。

核心语法

基本结构

apiVersion: batch/v1
kind: CronJob
metadata:
  name: example
spec:
  schedule: "*/5 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: job
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure
  • apiVersion: batch/v1:指定 API 版本
  • kind: CronJob:指定资源类型
  • metadata.name:CronJob 的名称
  • spec.schedule:Cron 表达式,定义任务的执行时间
  • spec.jobTemplate:Job 的模板,定义实际执行的任务

Cron 表达式

表达式描述
* * * * *每分钟执行一次
0 * * * *每小时的第 0 分钟执行一次
0 0 * * *每天的午夜执行一次
0 0 * * 0每周的周日午夜执行一次
0 0 1 * *每月的 1 号午夜执行一次

资源限制

resources:
  limits:
    cpu: "1"
    memory: 2Gi
  requests:
    cpu: "0.5"
    memory: 1Gi
  • limits:资源上限
  • requests:资源请求

并发策略

策略描述
Allow允许并行执行
Forbid禁止并行执行
Replace新任务替换旧任务

失败与成功策略

spec:
  successfulJobsHistoryLimit: 3
  failedJobsHistoryLimit: 2
  backoffLimit: 4
  • successfulJobsHistoryLimit:保留成功的任务数量
  • failedJobsHistoryLimit:保留失败的任务数量
  • backoffLimit:任务失败重试次数

超时设置

spec:
  template:
    spec:
      activeDeadlineSeconds: 100
  • activeDeadlineSeconds:任务的最大运行时间(秒)

挂载卷

volumes:
- name: task-pv-storage
  persistentVolumeClaim:
    claimName: task-pv-claim
containers:
- name: job
  image: busybox
  volumeMounts:
  - mountPath: "/mnt/data"
    name: task-pv-storage
  • volumes:定义卷
  • volumeMounts:挂载卷到容器

任务调度

concurrencyPolicy: Forbid
startingDeadlineSeconds: 100
  • concurrencyPolicy:并发策略
  • startingDeadlineSeconds:任务必须在指定时间内启动,否则被放弃

任务启动配置

spec:
  schedule: "*/5 * * * *"
  startingDeadlineSeconds: 100
  concurrencyPolicy: Forbid
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: job
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure
  • schedule:Cron 表达式
  • startingDeadlineSeconds:任务启动的截止时间
  • concurrencyPolicy:并发策略

环境变量

env:
- name: MESSAGE
  value: "Hello, Kubernetes!"
  • env:环境变量

ConfigMap 和 Secret 挂载

envFrom:
- configMapRef:
    name: example-configmap
- secretRef:
    name: example-secret
  • envFrom:从 ConfigMap 或 Secret 中挂载环境变量

定时任务示例

每 5 分钟执行一次
apiVersion: batch/v1
kind: CronJob
metadata:
  name: every-5-minutes
spec:
  schedule: "*/5 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: job
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure
每天午夜执行一次
apiVersion: batch/v1
kind: CronJob
metadata:
  name: daily-midnight
spec:
  schedule: "0 0 * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: job
            image: busybox
            args:
            - /bin/sh
            - -c
            - echo "Running daily task at midnight"
          restartPolicy: OnFailure
每周周日午夜执行一次
apiVersion: batch/v1
kind: CronJob
metadata:
  name: weekly-sunday-midnight
spec:
  schedule: "0 0 * * 0"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: job
            image: busybox
            args:
            - /bin/sh
            - -c
            - echo "Running weekly task at midnight on Sunday"
          restartPolicy: OnFailure
每月 1 号午夜执行一次
apiVersion: batch/v1
kind: CronJob
metadata:
  name: monthly-first-day
spec:
  schedule: "0 0 1 * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: job
            image: busybox
            args:
            - /bin/sh
            - -c
            - echo "Running monthly task at midnight on the 1st day"
          restartPolicy: OnFailure

高级用法

挂载持久卷
apiVersion: batch/v1
kind: CronJob
metadata:
  name: mount-pv
spec:
  schedule: "*/5 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          volumes:
          - name: task-pv-storage
            persistentVolumeClaim:
              claimName: task-pv-claim
          containers:
          - name: job
            image: busybox
            args:
            - /bin/sh
            - -c
            - echo "Task started at $(date)"; cat /mnt/data/example.txt
            volumeMounts:
            - mountPath: "/mnt/data"
              name: task-pv-storage
          restartPolicy: OnFailure
传递环境变量
apiVersion: batch/v1
kind: CronJob
metadata:
  name: env-vars
spec:
  schedule: "*/5 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: job
            image: busybox
            args:
            - /bin/sh
            - -c
            - echo "Message: $MESSAGE"
            env:
            - name: MESSAGE
              value: "Hello, Kubernetes!"
          restartPolicy: OnFailure
指定资源限制
apiVersion: batch/v1
kind: CronJob
metadata:
  name: resource-limits
spec:
  schedule: "*/5 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: job
            image: busybox
            args:
            - /bin/sh
            - -c
            - echo "Task with resource limits"
            resources:
              limits:
                cpu: "1"
                memory: 2Gi
              requests:
                cpu: "0.5"
                memory: 1Gi
          restartPolicy: OnFailure
设置超时
apiVersion: batch/v1
kind: CronJob
metadata:
  name: timeout-example
spec:
  schedule: "*/5 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: job
            image: busybox
            args:
            - /bin/sh
            - -c
            - sleep 120; echo "Task completed"
          activeDeadlineSeconds: 100
          restartPolicy: OnFailure
限制并行任务
apiVersion: batch/v1
kind: CronJob
metadata:
  name: no-parallel
spec:
  schedule: "*/5 * * * *"
  concurrencyPolicy: Forbid
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: job
            image: busybox
            args:
            - /bin/sh
            - -c
            - echo "No parallel tasks allowed"
          restartPolicy: OnFailure

常见问题与解决

任务未按计划执行
  • 检查 schedule 配置是否正确
  • 检查 startingDeadlineSeconds 是否过期
  • 检查集群资源是否充足
任务执行失败
  • 检查 backoffLimit 是否设置得当
  • 检查容器日志,查看具体错误信息
  • 检查任务依赖的资源是否可用
任务执行时间不一致
  • 检查节点的时钟是否同步
  • 检查 spec.startingDeadlineSeconds 是否设置得当

优化技巧

减少资源浪费

  • 设置适当的 resources 限制和请求
  • 使用 activeDeadlineSeconds 防止任务无限运行

管理历史任务

  • 调整 successfulJobsHistoryLimitfailedJobsHistoryLimit,保留必要的历史记录

调试任务

  • 使用 kubectl logs 查看容器日志
  • 使用 kubectl describe 查看任务详细信息

工具推荐

Cron 表达式生成器:通过中文描述快速生成 Cron 表达式,简化配置过程。 正则表达式生成器:帮助你快速生成和测试正则表达式。 中英互译:在线翻译工具,支持中文和英文互译。 JSON 格式化:在线 JSON 格式化和验证工具,方便阅读和调试。 Base64 编码解码:在线 Base64 编码和解码工具,适用于各种场景。 时间戳转换:在线时间戳转换工具,支持多种时间格式。 JWT 解析:在线解析 JWT,方便调试和验证。

收藏这些工具,让 Kubernetes CronJob 的配置和调试更加轻松。