È possibile rieseguire il lavoro di kubernetes?


35

Ho la seguente configurazione di Kubernetes Job:

---
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 eseguo kubectl create -f dbload-deployment.yml --recordil lavoro e viene creato un pod, il contenitore Docker viene eseguito fino al completamento e ottengo questo stato:

$ 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

Questo lavoro è una tantum e devo poterlo rieseguire. Se provo a rieseguirlo con il kubectl createcomando ottengo questo errore

$ kubectl create -f dbload-deployment.yml --record
Error from server: error when creating "dbload-deployment.yml": jobs.batch "dbload" already exists

Certo che posso fare kubectl delete job dbloade poi eseguire kubectl createma mi chiedo se posso in qualche modo risvegliare il lavoro che già esiste?

Risposte:


22

No. Non c'è assolutamente modo di rieseguire un lavoro su kubernetes. Devi prima eliminarlo.


23

È possibile simulare una riesecuzione sostituendo il lavoro con se stesso:

  • kubectl get job "your-job" -o json | kubectl replace --force -f -

Se ricevi errori dovuti a etichette o selettori generati automaticamente, puoi eliminarli o modificarli con jq:

  • kubectl get job "your-job" -o json | jq 'del(.spec.selector)' | jq 'del(.spec.template.metadata.labels)' | kubectl replace --force -f -

1
Consiglio vivamente di salvare prima una copia del lavoro json in un file. kubectl replaceelimina il lavoro prima di imbattersi negli errori ricreandolo.
Jeremy Huiskamp,

Salva prima il json e poi ricrealo !!
deepdive

14

Puoi anche evitare l'errore menzionato specificando

metadata: generateName: dbload

anziché semplicemente name

In tal caso, ogni lavoro inviato con questo file yaml avrà un nome univoco che avrà un aspetto simile dbloada1b2c . Quindi puoi decidere se devi eliminare i vecchi lavori, ma non dovrai farlo.


Credo che generateName si applichi solo a kind = pod e NOT job.
user518066,

2
No, è una parte standard di ObjectMeta e si applica sia al pod che al lavoro: riferimento k8s . L'ho usato tutto il tempo, è fondamentale per quello che sto facendo.
vp124,

1
Grazie mille per questa schivata. Solo per documentazione funziona solo conkubectl create
Ohmen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.