The Kubernetes documentation mentions that a CronJob
supports the use case of:
Once at a specified point in time
But, I don't see any examples of how this would be possible. Specifically, I'm looking to kick off a job to run once in N hours.
To manually run a CronJob as a Job you run the kubectl create job command. You then specify the CronJob to base the job off of using the --from flag. Lastly, you specify a unique name for the job.
A CronJob creates Jobs on a repeating schedule. One CronJob object is like one line of a crontab (cron table) file. It runs a job periodically on a given schedule, written in Cron format. Caution: All CronJob schedule: times are based on the timezone of the kube-controller-manager.
According to documentation, CronJob uses the common Cron format of schedule:
Here are some examples:
schedule: "1 2-14 * * 0-1,5-6" (first minute of every hour from 2am to 2pm UTC on Sun,Mon,Fri,Sat)
schedule: "*/1 * * * *" (every minute)
CronJobs also have some limitations:
A cron job creates a job object about once per execution time of its schedule. We say “about” because there are certain circumstances where two jobs might be created, or no job might be created. We attempt to make these rare, but do not completely prevent them. Therefore, jobs should be idempotent.
If
startingDeadlineSeconds
is set to a large value or left unset (the default) and ifconcurrencyPolicy
is set toAllow
, the jobs will always run at least once.Jobs may fail to run if the CronJob controller is not running or broken for a span of time from before the start time of the CronJob to start time plus
startingDeadlineSeconds
, or if the span covers multiple start times andconcurrencyPolicy
does not allow concurrency. For example, suppose a cron job is set to start at exactly08:30:00
and itsstartingDeadlineSeconds
is set to10
, if the CronJob controller happens to be down from08:29:00
to08:42:00
, the job will not start. Set a longerstartingDeadlineSeconds
if starting later is better than not starting at all.The Cronjob is only responsible for creating Jobs that match its schedule, and the Job in turn is responsible for the management of the Pods it represents.
The other important thing is that Kubernetes uses UTC exclusively. Make sure you take that into account when you’re creating your schedule.
To run a job just once, you can use kubectl create -f job.yaml
started by at command on the admin machine or on the master node.
echo "kubectl create -f job.yaml" | at midnight
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With