Run a Kubernetes CronJob on the first day of every month
The Kubernetes expression for “First day of the month” is 0 0 1 * *. Below: config you can paste, the next run times, and what to watch out for. A Kubernetes CronJob reads five-field cron in spec.schedule and starts a Job for each run.
0 0 1 * *Open in tool“At 00:00, on day 1 of the month”
CronJob manifest
first-day-of-month.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: first-day-of-month
spec:
schedule: "0 0 1 * *"
timeZone: "Etc/UTC"
concurrencyPolicy: Forbid
startingDeadlineSeconds: 300
jobTemplate:
spec:
template:
spec:
restartPolicy: OnFailure
containers:
- name: job
image: busybox:1.37
command: ["sh", "-c", "echo running first-day-of-month"]Kubernetes gotchas
Day of week is 0-6The schedule parser stops at 6. Write 0 for Sunday; 7 is an error.
Too many missed startsIf a CronJob misses more than 100 starts, the controller stops starting it. Set startingDeadlineSeconds so old misses stop counting.
Overlapping runsconcurrencyPolicy defaults to Allow, so a slow Job can overlap the next one. Use Forbid or Replace.
*/n in a day field counts as setOnly * or ? leave a day field open. 0 0 */2 * 1 runs on odd days or on Mondays, while Vixie cron reads it as odd days that are Mondays.
FAQ
What is the Kubernetes cron expression for “First day of the month”?
0 0 1 * *. It reads: At 00:00, on day 1 of the month
Which time zone does a Kubernetes schedule use?
Without spec.timeZone, in the local zone of kube-controller-manager, which is usually UTC. Set spec.timeZone (stable since Kubernetes 1.27) to an IANA name. CRON_TZ or TZ inside schedule is rejected.
Does a CronJob support @daily?
Yes. @yearly, @monthly, @weekly, @daily and @hourly work in spec.schedule.
Why did my CronJob run twice, or not at all?
A CronJob creates about one Job per scheduled time, not exactly one. Make the Job safe to repeat, and check startingDeadlineSeconds and concurrencyPolicy.