cronjob是kubernetes中专用于周期性执行容器任务的控制器,本质是“带时间调度的job”,按计划自动创建job再由job启动pod执行一次性任务;其配置核心为schedule(5字段cron表达式)和jobtemplate(含pod规范、restartpolicy必须为onfailure或never),并需关注concurrencypolicy及历史job保留策略。

CronJob 是 Kubernetes 中专用于周期性执行容器任务的控制器,本质是“带时间调度的 Job”。它不直接运行 Pod,而是按计划自动创建 Job,再由 Job 启动 Pod 执行一次性的任务。配置核心在于两部分:时间表达式(schedule)和任务定义(jobTemplate)。
写对 Cron 表达式是前提
Cron 表达式共 5 个字段,顺序为:分钟 小时 日 月 周几,取值范围和含义与 Linux crontab 完全一致:
- */2 * * * * → 每 2 分钟执行一次
- 0 2 * * * → 每天凌晨 2 点执行
- 0 0 * * 0 → 每周日凌晨 0 点(即每周日)执行
- 0 9,14 * * 1-5 → 工作日(周一至周五)上午 9 点和下午 2 点各执行一次
- 支持别名,如 @daily(等价于 0 0 * * *)、@hourly(等价于 0 * * * *)
定义 jobTemplate 明确要做什么
jobTemplate 内部是一个标准的 Job 模板,必须包含 Pod 规范。关键点包括:
- 容器镜像需可拉取(如
busybox、alpine或自建镜像) - 推荐显式设置
restartPolicy: OnFailure(CronJob 要求 Job 的重启策略只能是OnFailure或Never) - 命令用
command+args明确指定,避免依赖镜像默认 entrypoint 的不确定性 - 如需环境变量、挂载卷、资源限制等,按 Pod 规范正常添加
控制并发与历史保留(实用细节)
两个常被忽略但影响稳定性的重要字段:
-
concurrencyPolicy:默认
Allow(允许新旧任务同时运行)。若任务耗时长、不可重入,建议设为Forbid(跳过新任务)或Replace(终止旧任务启动新任务) - successfulJobsHistoryLimit 和 failedJobsHistoryLimit:默认都为 3。建议根据运维需要调大(如设为 5 或 10),避免关键执行记录被自动清理
快速验证配置是否生效
部署后不要只看 CronJob 状态,要分层检查:
-
kubectl get cronjob→ 确认AGE和LAST SCHEDULE字段有更新 -
kubectl get jobs→ 查看是否按时生成了新 Job(名称含时间戳) -
kubectl get pods --selector=job-name=xxx→ 确认 Pod 启动并完成(状态为Completed) -
kubectl logs job/xxx→ 直接查看最近一次 Job 的标准输出(无需找 Pod 名)











