控制器-CronJob(cj)
CronJob 核心概念与架构设计
Kubernetes CronJob 是集群中用于管理周期性任务的 API 对象,它基于标准的 cron 表达式定义调度时间,自动创建 Job 对象执行任务,相当于在 Job 控制器基础上增加了时间调度层。与传统的 Linux crontab 相比,CronJob 具有与容器编排系统深度集成的优势,能够更好地管理分布式环境下的定时任务。
核心工作原理:
- 定义对象:用户创建 CronJob 资源,指定 Pod 模板和调度配置
- 监控调度:Kubernetes 控制器监控 CronJob 对象状态
- 生成 Job:根据预设时间表,控制器创建关联的 Job 对象
- 执行任务:Job 控制器创建 Pod 运行实际任务
- 状态跟踪:系统记录任务执行历史并根据策略清理资源
关键组件:
- 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表达式。
