Não. Definitivamente, não há como reexecutar um trabalho do kubernetes. Você precisa excluí-lo primeiro.
Eu tenho a seguinte configuração de trabalho do Kubernetes:
---
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: {}
Quando eu faço kubectl create -f dbload-deployment.yml --record
o trabalho e um pod são criados, o contêiner do Docker é executado até a conclusão e eu recebo esse 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
Esse trabalho é uma única vez e eu preciso poder executá-lo novamente. Se eu tentar executar novamente com o comando kubectl create
, recebo este erro
$ kubectl create -f dbload-deployment.yml --record
Error from server: error when creating "dbload-deployment.yml": jobs.batch "dbload" already exists
É claro que posso fazer kubectl delete job dbload
e depois executar kubectl create
, mas estou pensando se posso de alguma forma reativar o trabalho que já existe?
Você também pode evitar o erro mencionado ao especificar
metadata:
generateName: dbload
em vez de simplesmente name
Nesse caso, cada trabalho enviado com esse arquivo yaml terá um nome exclusivo que será parecido com dbloada1b2c
. Então você pode decidir se precisa excluir os trabalhos antigos, mas não terá para fazê-lo.
Você pode simular uma nova execução substituindo o trabalho por si mesmo:
kubectl get job "your-job" -o json | kubectl replace --force -f -
Se você receber erros devido a rótulos ou seletores gerados automaticamente, poderá excluí-los ou editá-los com jq:
kubectl get job "your-job" -o json | jq 'del(.spec.selector)' | jq 'del(.spec.template.metadata.labels)' | kubectl replace --force -f -
Tags docker kubernetes