É possível executar novamente o trabalho do kubernetes?

35

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 faço kubectl create -f dbload-deployment.yml --recordo trabalho e um pod é criado, o contêiner do Docker é executado até a conclusão e recebo o seguinte 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

Este trabalho é único e preciso ser capaz de executá-lo novamente. Se eu tentar executá-lo novamente com o kubectl createcomando, 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 dbloade depois executar, kubectl createmas estou me perguntando se posso, de alguma forma, reativar o trabalho que já existe.

Bostone
fonte

Respostas:

22

Não. Definitivamente, não há como executar novamente um trabalho no kubernetes. Você precisa excluí-lo primeiro.

cohadar
fonte
23

Você pode simular uma nova execução substituindo a tarefa por ela mesma:

  • 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 -
F. Santiago
fonte
11
É altamente recomendável salvar uma cópia do job json em um arquivo primeiro. kubectl replaceexclui o trabalho antes de executar os erros de recriação.
Jeremy Huiskamp 04/04
Salve o json primeiro e depois recrie !!
deepdive 14/11
14

Você também pode evitar o erro mencionado especificando

metadata: generateName: dbload

em vez de simplesmente name

Nesse caso, cada tarefa que você enviar com esse arquivo yaml terá um nome exclusivo que será semelhante a isso dbloada1b2c. Depois, você pode decidir se precisa excluir os trabalhos antigos, mas não precisará fazê-lo.

vp124
fonte
Acredito que generateName se aplica apenas a kind = pod e NOT job.
user518066
2
Não, é uma parte padrão do ObjectMeta e aplica-se à referência de pod e job: k8s . Eu tenho usado o tempo todo, é essencial para o que estou fazendo.
vp124
11
Muito obrigado por este rodeio. Apenas para documentação isso só funciona comkubectl create
Ohmen