126 votes

Est-il possible de réexécuter un job kubernetes ?

J'ai la configuration de job 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: {}

Quand je le fais kubectl create -f dbload-deployment.yml --record le travail et un pod sont créés, le conteneur Docker s'exécute jusqu'à la fin et j'obtiens ce statut :

$ 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 réexécuter avec kubectl create 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 que je peux le faire kubectl delete job dbload et ensuite exécuter kubectl create mais je me demande si je peux réveiller le travail qui existe déjà ?

91voto

Martin Algesten Points 5915

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

  1. Sauvegardez votre travail :
  • kubectl get job "your-job" -o json > your-job.json
  1. Remplacez le travail en place :
  • kubectl get job "your-job" -o json | kubectl replace --force -f -

Si vous obtenez des erreurs dues aux étiquettes ou 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 -

MISE À JOUR avec Jeremy Huiskamp La suggestion de l'auteur

10 votes

Il est fortement recommandé de sauvegarder d'abord une copie du job json dans un fichier. kubectl replace supprime le travail avant de rencontrer des erreurs en le recréant.

2 votes

Sauvegarder le json d'abord et recréer ensuite ! !!

0 votes

Il n'est pas nécessaire de sauvegarder d'abord le json s'il a toujours le fichier de définition de poste original ?

72voto

cohadar Points 714

Non. Il n'y a absolument aucun moyen de réexécuter un job Kubernetes. Vous devez d'abord le supprimer.

10 votes

Pour ceux qui, comme moi, ont besoin de plus de détails, il s'agit d'un processus en deux étapes. D'abord, supprimez votre travail avec kubectl delete job <job_name> et ensuite kubectl apply -f <job_yml>

7 votes

Cela peut se faire en une seule étape avec kubectl replace --force - qui supprimera le travail s'il existe, puis le (re)créera sans condition. Voir ci-dessous.

1 votes

@Caesar Un exemple ? Parce que j'obtiens error: must specify one of -f and -k

48voto

vp124 Points 521

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

  generateName: dbload

au lieu de simplement name

Dans ce cas, chaque tâche que vous soumettez avec ce fichier yaml aura un nom unique qui ressemblera à quelque chose comme dbloada1b2c . Ensuite, vous pourrez décider si vous devez supprimer les anciennes tâches, mais vous ne pourrez pas ont pour le faire.

Voici un exemple de yaml fonctionnel :

apiVersion: batch/v1
kind: Job
metadata:
  generateName: netutils-
spec:
  parallelism: 1
  template:
    spec:
      containers:
      - image: amouat/network-utils 
        name: netutil
      restartPolicy: Never

C'est la sortie de kubectl get job après deux kubectl create -f example.yaml des commandes :

NAME             COMPLETIONS   DURATION   AGE
netutils-5bs2s   0/1           14s        14s
netutils-dsvfk   0/1           10s        10s

0 votes

Je crois que generateName ne s'applique qu'à kind=pod et PAS à job.

5 votes

Non, c'est une partie standard d'ObjectMeta qui s'applique à la fois au pod et au job : référence k8s . Je l'utilise tout le temps, c'est le cœur de ce que je fais.

6 votes

Merci beaucoup pour cette esquive. Juste pour la documentation, cela ne fonctionne qu'avec kubectl create

8voto

Marcelo Points 151

Comme une amélioration de @F. Santiago, vous pouvez simplement utiliser la valeur stockée dans l'annotation "kubectl.kubernetes.io/last-applied-configuration" qui contient la configuration initiale appliquée sans aucun champ généré automatiquement :

kubectl get job <jobname> -o json | \
jq -r '.metadata.annotations."kubectl.kubernetes.io/last-applied-configuration"' | \
kubectl replace --save-config --force -f -

Note : pour kubectl replace N'oubliez pas de passer --save-config afin de mettre à jour le champ d'annotation avec la dernière configuration appliquée.

4voto

Il n'est pas possible d'exécuter un travail qui s'est terminé, mais vous pouvez simuler une réexécution en procédant comme suit

  1. Obtenir le fichier yaml de la tâche existante :

    kubectl get job <job_name> -o yaml > <job_name>.yaml
  2. Supprimez le travail existant :

    kubectl delete job <job_name>
  3. Exécutez à nouveau le travail :

    kubectl apply -f <job_name>.yaml

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X