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 的配置和调试更加轻松。