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à ?

2voto

Issa Fram Points 675

En me basant sur l'idée de @Marcelo, je l'ai fait fonctionner avec ce qui suit, sans aucun traitement du modèle :

kubectl get job <job-name> -o custom-columns=:metadata.annotations.kubectl\.kubernetes\.io/last-applied-configuration > job.json
kubectl delete -f job.json
kubectl apply -f job.json

Veuillez noter les points échappés ( \. ) dans le nom de l'annotation : kubectl\.kubernetes\.io/last-applied-configuration . Sans elle, elle renvoie <none> .

0voto

Eddie Parker Points 551

J'ai implémenté la méthode de F. Santiago en utilisant un plugin kubectl. J'ai placé ces deux fichiers dans mon PATH [1] pour que kubectl les récupère.

L'émission actuelle kubectl replacejob [job name] ressemble à ça :

[w] eddie@eddie ~ $ kubectl replacejob my_job_name
Writing out backup file: my_job_name.bak.json
job.batch "my_job_name" deleted
job.batch/my_job_name replaced

[1] Fichiers pour faire fonctionner le plugin :

kubectl-replacejob.cmd : Un simple wrapper pour appeler Python avec les mêmes arguments.

@echo off

pushd . 
cd %~dp0
python kubectl-replacejob.py %*
popd 

kubectl-replacejob.py : Effectue le travail " difficile " de remplacement.

import sys
import subprocess
import json
import io

if len( sys.argv ) < 2:
    print("Error: please specify the job you wish to replace.")
    sys.exit(-1)

job_name = sys.argv[1]

# Fetch the job as json
job_as_json_text = subprocess.check_output(f'kubectl get job {job_name} -o json', shell=True).decode()
job_as_json = json.loads(job_as_json_text)

# Save out a backup
backup_file = f'{job_name}.bak.json'
print(f"Writing out backup file: {backup_file}")
with open(backup_file, 'w') as f:
    f.write(job_as_json_text)

# Remove references to controller uid that borks replace
def remove_key_if_present(obj, *keys):
    for i in range(len(keys)):
        key = keys[i]
        if key in obj:
            if i == len(keys)-1:
                del obj[key]
            else:
                obj = obj[key]
        else:
            print(f"WARNING: Failed to remove {'.'.join(keys)}: failed finding key at {key}!")
            return 

remove_key_if_present(job_as_json, 'spec', 'selector', 'matchLabels', 'controller-uid')
remove_key_if_present(job_as_json, 'spec', 'template', 'metadata', 'labels', 'controller-uid')
job_as_json_text = json.dumps(job_as_json)

# Pretty print for testing
#print(json.dumps(job_as_json, indent=4, sort_keys=True))

# Issue the replace
subprocess.run(f'kubectl replace --force -f -', shell=True, input=job_as_json_text.encode())

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