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

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

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

核心语法

基本结构

yaml 复制代码
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 号午夜执行一次

资源限制

yaml 复制代码
resources:
  limits:
    cpu: "1"
    memory: 2Gi
  requests:
    cpu: "0.5"
    memory: 1Gi
  • limits:资源上限
  • requests:资源请求

并发策略

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

失败与成功策略

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

超时设置

yaml 复制代码
spec:
  template:
    spec:
      activeDeadlineSeconds: 100
  • activeDeadlineSeconds:任务的最大运行时间(秒)

挂载卷

yaml 复制代码
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:挂载卷到容器

任务调度

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

任务启动配置

yaml 复制代码
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:并发策略

环境变量

yaml 复制代码
env:
- name: MESSAGE
  value: "Hello, Kubernetes!"
  • env:环境变量

ConfigMap 和 Secret 挂载

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

定时任务示例

每 5 分钟执行一次
yaml 复制代码
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
每天午夜执行一次
yaml 复制代码
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
每周周日午夜执行一次
yaml 复制代码
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 号午夜执行一次
yaml 复制代码
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

高级用法

挂载持久卷
yaml 复制代码
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
传递环境变量
yaml 复制代码
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
指定资源限制
yaml 复制代码
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
设置超时
yaml 复制代码
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
限制并行任务
yaml 复制代码
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 防止任务无限运行

管理历史任务

  • 调整 successfulJobsHistoryLimit 和 failedJobsHistoryLimit,保留必要的历史记录

调试任务

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

工具推荐

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

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

相关推荐
去伪存真2 小时前
AI Agent Harness 深度测评与技术选型实战
前端·agent
FRing035 小时前
vue2干货总结7(自定义指令、插槽、单页应用程序、路由的使用(VueRouter))
开发语言·前端·vue.js·vue2
疯华整猫8 小时前
被杀掉之后:我把 Android 的「唤起 + 常驻」重做了一遍
前端·面试·架构
IT_陈寒10 小时前
Java开发实战:从入门到精通
前端·人工智能·后端
风骏时光牛马10 小时前
生成一个AI转岗经历标题,只需要一个标题,不需要其他的任何文本。
前端
Csvn19 小时前
Monorepo
前端
Csvn19 小时前
流水线
前端
Csvn19 小时前
微前端架构
前端
Linux-lucky21 小时前
45-Linux学习之旅之防火墙与WEB加固
linux·前端·网络·学习·ubuntu
风骏时光牛马1 天前
生成一个移动端标题,只需要一个标题,不需要其他的任何文本。
前端