Is it possible to rerun kubernetes job?
I have the following Kubernetes Job configuration:
---
apiVersion: batch/v1
kind: Job
metadata:
name: dbload
creationTimestamp:
spec:
template:
metadata:
name: dbload
spec:
containers:
- name: dbload
image: sdvl3prox001:7001/pbench/tdload
command: ["/opt/pbench/loadTpcdsData.sh", "qas0063", "dbc", "dbc", "1"]
restartPolicy: Never
imagePullSecrets:
- name: pbenchregkey
status: {}
When I do kubectl create -f dbload-deployment.yml --record
the job and a pod are created, Docker container runs to completion and I get this status:
$ kubectl get job dbload
NAME DESIRED SUCCESSFUL AGE
dbload 1 1 1h
$ kubectl get pods -a
NAME READY STATUS RESTARTS AGE
dbload-0mk0d 0/1 Completed 0 1h
This job is one time deal and I need to be able to rerun it. If I attempt to rerun it with kubectl create
command I get this error
$ kubectl create -f dbload-deployment.yml --record
Error from server: error when creating "dbload-deployment.yml": jobs.batch "dbload" already exists
Of course I can do kubectl delete job dbload
and then run kubectl create
but I'm wondering if I can somehow re-awaken the job that already exists?
No. There is definitely no way to rerun a kubernetes job. You need to delete it first.
Simulate a rerun by replacing the job with itself:
- Backup your job:
kubectl get job "your-job" -o json > your-job.json
- Replace the job in place:
kubectl get job "your-job" -o json | kubectl replace --force -f -
If you get errors due to auto-generated labels or selectors, you can delete or edit them with jq:
kubectl get job "your-job" -o json | jq 'del(.spec.selector)' | jq 'del(.spec.template.metadata.labels)' | kubectl replace --force -f -
UPDATED with Jeremy Huiskamp's suggestion
You can also avoid the error you mentioned by specifying
generateName: dbload
instead of simply name
In that case, each job you submit with this yaml file will have a unique name that will look something like dbloada1b2c
. Then you can decide whether you need to delete the old jobs, but you won't have to do it.
Here is a working yaml example:
apiVersion: batch/v1
kind: Job
metadata:
generateName: netutils-
spec:
parallelism: 1
template:
spec:
containers:
- image: amouat/network-utils
name: netutil
restartPolicy: Never
This is the output from kubectl get job
after two kubectl create -f example.yaml
commands:
NAME COMPLETIONS DURATION AGE
netutils-5bs2s 0/1 14s 14s
netutils-dsvfk 0/1 10s 10s