98 votes

Signaler l'achèvement du travail

Je cherche un moyen de savoir (à partir d'un script) quand un Job Kubernetes s'est terminé. Je veux ensuite sortir les journaux des conteneurs et effectuer le nettoyage.

Quelle serait la meilleure façon de procéder ? La meilleure façon serait-elle d'exécuter kubectl describe job <job_name> et grep pour 1 Succeeded ou quelque chose de ce genre ?

0 votes

Pour attendre que le pod soit en cours d'exécution, utilisez "condition=ready". Il est également possible d'attendre l'état d'avancement du déploiement. Voir : stackoverflow.com/a/60810347/658497

157voto

abagshaw Points 2081

Depuis la version 1.11, vous pouvez le faire :

kubectl wait --for=condition=complete job/myjob

et vous pouvez également définir un délai d'attente :

kubectl wait --for=condition=complete --timeout=30s job/myjob

2 votes

Est-il possible d'avoir un délai d'attente indéfini ?

4 votes

@JoãoMatos Le défaut --timeout est de 30 secondes. La spécification de valeurs négatives pour --timeout signifie "attendre une semaine" (ce qui, dans la pratique, est presque indéfini). Regardez l'article kubectl wait référence.

0 votes

Je cherche quelque chose que je peux facilement mettre en œuvre dans mes fichiers de configuration YAML et une petite image docker de groundnuty/k8s-wait-for a répondu à mes attentes.

28voto

Eric Tune Points 2253

Cette commande vous permet de suivre visuellement l'état d'un travail :

kubectl get jobs myjob -w

En -w surveille les changements. Vous recherchez l'option SUCCESSFUL colonne pour afficher 1 .

Pour attendre dans un shell script, j'utiliserais cette commande :

until kubectl get jobs myjob -o jsonpath='{.status.conditions[? 
    (@.type=="Complete")].status}' | grep True ; do sleep 1 ; done

0 votes

Que pensez-vous de l'attente des status.succeeded = 1 ?

0 votes

@GuidoGarcía Si vous utilisez status.succeeded = 1, vous avez un problème lorsqu'un travail a plusieurs achèvements status.succeeded est fixé à 1 lorsque le premier est terminé, pas tous comme avec conditions.type = Complete.

5 votes

Le script shell script qui répond à cette question attendra indéfiniment un travail "échoué", car un travail échoué ne renvoie rien.

6voto

Vous pouvez utiliser les documents officiels Python kubernetes-client .

https://github.com/kubernetes-client/python

Créer une nouvelle virtualenv Python :

virtualenv -p python3 kubernetes_venv l'activer avec

source kubernetes_venv/bin/activate

et installer le client kubernetes avec :

pip install kubernetes

Créez un nouveau script et exécutez-le :

from kubernetes import client, config

config.load_kube_config()

v1 = client.BatchV1Api()
ret = v1.list_namespaced_job(namespace='<YOUR-JOB-NAMESPACE>', watch=False)
for i in ret.items:
    print(i.status.succeeded)

N'oubliez pas de configurer votre kubeconfig en ~/.kube/config et une valeur valide pour votre espace de noms -> '<YOUR-JOB-NAMESPACE>'

1voto

J'utiliserais -w o --watch :

$ kubectl get jobs.batch --watch
NAME     COMPLETIONS   DURATION   AGE
python   0/1           3m4s       3m4s

0voto

Most Wanted Points 897

L'une ou l'autre de ces requêtes avec kubectl

kubectl get job test-job -o jsonpath='{.status.succeeded}'

o

kubectl get job test-job -o jsonpath='{.status.conditions[?(@.type=="Complete")].status}'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X