3 min read | by Jordi Prats
The cronjob object haven't been GA until Kubernetes v1.21, even though the Job object have been GA for a long time. Let's take a look how it works:
$ kubectl create job demo --image nginx --dry-run=client -o yaml | head -n1
apiVersion: batch/v1
$ kubectl create cronjob demo --image nginx --schedule="*/1 * * * *" -o yaml --dry-run=client | head -n1
apiVersion: batch/v1beta1
Using the kubectl we get how a cronjob yaml will look like. It is quite similar a what a deployment is since it has a spec.template that is also used for creating the actual pods that will actually execute the job:
$ kubectl create cronjob my-cronjob --image=busybox --schedule="*/1 * * * *" -o yaml --dry-run=client -- echo test
apiVersion: batch/v1beta1
kind: CronJob
metadata:
creationTimestamp: null
name: my-cronjob
spec:
jobTemplate:
metadata:
creationTimestamp: null
name: my-cronjob
spec:
template:
metadata:
creationTimestamp: null
spec:
containers:
- command:
- echo
- test
image: busybox
name: my-cronjob
resources: {}
restartPolicy: OnFailure
schedule: '*/1 * * * *'
status: {}
Let's create an simple cronjob to check how it executes the job:
$ kubectl create cronjob demo-cronjob --image=busybox --schedule="* * * * *" -- echo test
cronjob.batch/demo-cronjob created
After waiting for a while we will be able to see the executions on the events section of a kubectl describe:
$ kubectl describe cronjob demo-cronjob
Name: demo-cronjob
Namespace: default
Labels: <none>
Annotations: <none>
Schedule: * * * * *
Concurrency Policy: Allow
Suspend: False
Successful Job History Limit: 3
Failed Job History Limit: 1
Starting Deadline Seconds: <unset>
Selector: <unset>
Parallelism: <unset>
Completions: <unset>
Pod Template:
Labels: <none>
Containers:
demo-cronjob:
Image: busybox
Port: <none>
Host Port: <none>
Command:
echo
test
Environment: <none>
Mounts: <none>
Volumes: <none>
Last Schedule Time: Tue, 05 Jan 2021 21:07:00 +0100
Active Jobs: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 3m19s cronjob-controller Created job demo-cronjob-1609866240
Normal SawCompletedJob 2m58s cronjob-controller Saw completed job: demo-cronjob-1609866240, status: Complete
Normal SuccessfulCreate 2m18s cronjob-controller Created job demo-cronjob-1609866300
Normal SawCompletedJob 2m7s cronjob-controller Saw completed job: demo-cronjob-1609866300, status: Complete
Normal SuccessfulCreate 77s cronjob-controller Created job demo-cronjob-1609866360
Normal SawCompletedJob 67s cronjob-controller Saw completed job: demo-cronjob-1609866360, status: Complete
Normal SuccessfulCreate 16s cronjob-controller Created job demo-cronjob-1609866420
Normal SawCompletedJob 5s cronjob-controller Saw completed job: demo-cronjob-1609866420, status: Complete
Normal SuccessfulDelete 5s cronjob-controller Deleted job demo-cronjob-1609866240
To be able to get the execution log we will have to first describe the job that gets created:
$ kubectl describe job demo-cronjob-1609866420
Name: demo-cronjob-1609866420
Namespace: default
Selector: controller-uid=81e2745e-0a73-49fa-8f01-890f9dafebda
Labels: controller-uid=81e2745e-0a73-49fa-8f01-890f9dafebda
job-name=demo-cronjob-1609866420
Annotations: <none>
Controlled By: CronJob/demo-cronjob
Parallelism: 1
Completions: 1
Start Time: Tue, 05 Jan 2021 21:07:06 +0100
Completed At: Tue, 05 Jan 2021 21:07:13 +0100
Duration: 7s
Pods Statuses: 0 Running / 1 Succeeded / 0 Failed
Pod Template:
Labels: controller-uid=81e2745e-0a73-49fa-8f01-890f9dafebda
job-name=demo-cronjob-1609866420
Containers:
demo-cronjob:
Image: busybox
Port: <none>
Host Port: <none>
Command:
echo
test
Environment: <none>
Mounts: <none>
Volumes: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 2m20s job-controller Created pod: demo-cronjob-1609866420-f4dv7
Normal Completed 2m14s job-controller Job completed
Then we can use kubectl logs to get the output of the pod that this cronjob creates, again we can see it on the events section:
$ kubectl logs demo-cronjob-1609866420-f4dv7
test
Posted on 20/01/2021