Est-il possible de relancer le travail kubernetes?

35

J'ai la configuration de travail Kubernetes suivante:

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

Lorsque je fais kubectl create -f dbload-deployment.yml --recordle travail et qu'un pod est créé, le conteneur Docker s'exécute jusqu'à la fin et j'obtiens cet état:

$ 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

Ce travail est unique et je dois pouvoir le relancer. Si j'essaie de le relancer avec la kubectl createcommande, j'obtiens cette erreur

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

Bien sûr, je peux faire kubectl delete job dbloadpuis courir kubectl createmais je me demande si je peux en quelque sorte réveiller le travail qui existe déjà?

Bostone
la source

Réponses:

22

Non. Il n'y a certainement aucun moyen de réexécuter un travail kubernetes. Vous devez d'abord le supprimer.

cohadar
la source
23

Vous pouvez simuler une réexécution en remplaçant le travail par lui-même:

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

Si vous obtenez des erreurs en raison d'étiquettes ou de sélecteurs générés automatiquement, vous pouvez les supprimer ou les modifier avec jq:

  • kubectl get job "your-job" -o json | jq 'del(.spec.selector)' | jq 'del(.spec.template.metadata.labels)' | kubectl replace --force -f -
F. Santiago
la source
1
Je recommande fortement d'enregistrer d'abord une copie du travail json dans un fichier. kubectl replacesupprime le travail avant de rencontrer les erreurs de recréation.
Jeremy Huiskamp
Enregistrez d'abord le json puis recréez !!
deepdive
14

Vous pouvez également éviter l'erreur que vous avez mentionnée en spécifiant

metadata: generateName: dbload

au lieu de simplement name

Dans ce cas, chaque travail que vous soumettez avec ce fichier yaml aura un nom unique qui ressemblera à quelque chose dbloada1b2c. Ensuite , vous pouvez décider si vous devez supprimer les anciens emplois, mais vous ne serez pas avoir à le faire.

vp124
la source
Je crois que generateName ne s'applique qu'à kind = pod et NON à un travail.
user518066
2
Non, c'est une partie standard d'ObjectMeta et s'applique à la fois au pod et à la référence job: k8s . Je l'utilise tout le temps, c'est au cœur de ce que je fais.
vp124
1
Merci beaucoup pour cette esquive. Juste pour la documentation, cela ne fonctionne qu'aveckubectl create
Ohmen