K8sController-CronJob(定时任务)

基于K8s v1.31

Cron Job支持用于每隔一段时间创建定期运行的批处理任务

CronJob定时表达式

# ┌───────────── 分钟 (0 - 59)
# │ ┌───────────── 小时 (0 - 23)
# │ │ ┌───────────── 月的某天 (1 - 31)
# │ │ │ ┌───────────── 月份 (1 - 12)
# │ │ │ │ ┌───────────── 周的某天 (0 - 6)(周日到周六)
# │ │ │ │ │ 或者是 sun,mon,tue,web,thu,fri,sat
# │ │ │ │ │
# │ │ │ │ │
# * * * * *
Minutes Hours DayofMonth Month DayofWeek
  • Minutes: , - * / 或者0-59的整数

  • Hours: , - * / 或者0-23的整数

  • DayofMonth: , - * / ? L W C或者0-31的整数

  • Month:, - * / 或者1-12的整数 或者 JAN~DEC

  • DayofWeek:, - * / ? L C # 或者0~6 或者SUN~SAT,0代表星期天

  • *:匹配任意

  • /:从起始开始 Minutes=5/20:第一次在5min后面每20min一次(下一次是25min)

配置文件

apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
# 定时表达式
schedule: "* 1 * * *" #
# 设置由于某些原因错过调度,Job最长等待时间
startingDeadlineSeconds: 10
# 设置并发执行数量
# Allow:允许并发,默认配置
# Forbid:禁止并发,当有一个正在执行的Job时,新的Job不会被调度
# Replace:替换并发,当有一个正在执行的Job时,新的Job会替换掉旧的Job
concurrencyPolicy: Allow
# 是否挂起 默认false
suspend: false
# 允许保留的运行失败的Job数量,默认1
successfulJobsHistoryLimit: 1
# 允许保留运行保留的Pod数量
failedJobsHistoryLimit: 1
# 设置时区
# v1.24 引入,v1.27 进入stable
timeZone: Asia/Shanghai
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox:latest
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- date; echo Hello!
restartPolicy: OnFailure

CronJob不足

  • K8s v1.28允许设置时区,但是不支持CRON_TZ=UTC****
  • CronJob Controller 根据定时时间配置,在需要创建新任务时,“大约”回创建一个Job
  • 在创建了CronJob资源后,修改其jobTemplate,只会影响之后的Job
  • 如果设置了startingDeadlineSeconds小于10s,则可能导致CronJob无法完成调度,这是因为CronJob Controller 每10s检查一次
  • CronJob Controller会定时(10s)检查上一次调度的时间点到当前截止时间点错过的调度次数,如果错过超过100s,不再启动Job
  • 如果没有在调度时间内创建CronJob,则会标记为错过