Ist es möglich, kubernetes job erneut auszuführen?

34

Ich habe folgende Kubernetes Job Konfiguration:

---
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: {}

Wenn ich kubectl create -f dbload-deployment.yml --recordden Job erledige und ein Pod erstellt wird, wird der Docker-Container vollständig ausgeführt und ich erhalte den folgenden 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

Dieser Job ist einmalig und ich muss ihn erneut ausführen können. Wenn ich versuche, es mit kubectl createBefehl erneut auszuführen, erhalte ich diesen Fehler

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

Natürlich kann ich es tun kubectl delete job dbloadund dann rennen, kubectl createaber ich frage mich, ob ich den Job, der bereits existiert, irgendwie wieder aufwecken kann?

Bostone
quelle

Antworten:

22

Nein. Es gibt definitiv keine Möglichkeit, einen Kubernetes-Job erneut auszuführen. Sie müssen es zuerst löschen.

cohadar
quelle
23

Sie können eine erneute Ausführung simulieren, indem Sie den Job durch sich selbst ersetzen:

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

Wenn Sie Fehler aufgrund von automatisch generierten Labels oder Selektoren erhalten, können Sie diese mit jq löschen oder bearbeiten:

  • kubectl get job "your-job" -o json | jq 'del(.spec.selector)' | jq 'del(.spec.template.metadata.labels)' | kubectl replace --force -f -
F. Santiago
quelle
1
Es wird dringend empfohlen, zuerst eine Kopie des Jobs json in einer Datei zu speichern. kubectl replacelöscht den Job, bevor die Fehler beim Neuerstellen auftreten.
Jeremy Huiskamp
Speichern Sie den JSON zuerst und erstellen Sie ihn dann neu !!
Deepdive
14

Sie können den erwähnten Fehler auch vermeiden, indem Sie angeben

metadata: generateName: dbload

statt einfach name

In diesem Fall hat jeder Auftrag, den Sie mit dieser yaml-Datei senden, einen eindeutigen Namen, der ungefähr so ​​aussieht dbloada1b2c. Dann können Sie entscheiden, ob Sie die alten Jobs löschen müssen , müssen dies aber nicht .

vp124
quelle
Ich glaube, dass generateName nur für kind = pod und NOT job gilt.
user518066
2
Nein, es ist ein Standardbestandteil von ObjectMeta und gilt sowohl für den Pod als auch für den Job: k8s-Verweis . Ich habe es die ganze Zeit benutzt, es ist der Kern dessen, was ich tue.
vp124
1
Vielen Dank für diesen Trick. Nur zur Dokumentation funktioniert dies nur mitkubectl create
Ohmen