web-dev-qa-db-fra.com

Attendez la fin du travail kubernetes en cas d'échec / de réussite à l'aide de la ligne de commande

Quelle est la meilleure façon d'attendre que le travail de kubernetes soit terminé? J'ai remarqué beaucoup de suggestions à utiliser:

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

mais je pense que cela ne fonctionne que si le travail est réussi. en cas d'échec, je dois faire quelque chose comme:

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

existe-t-il un moyen d'attendre les deux conditions en utilisant l'attente? sinon, quelle est la meilleure façon d'attendre qu'un emploi réussisse ou échoue?

14
ruazn2

Exécutez la première condition d'attente en tant que sous-processus et capturez son PID. Si la condition est remplie, ce processus se terminera avec un code de sortie de 0.

kubectl wait --for=condition=complete job/myjob &
completion_pid=$!

Faites de même pour la condition d'attente d'échec. L'astuce consiste à ajouter && exit 1 pour que le sous-processus renvoie un code de sortie différent de zéro lorsque le travail échoue.

kubectl wait --for=condition=failure job/myjob && exit 1 &
failure_pid=$! 

Utilisez ensuite le Bash intégré wait -n $PID1 $PID2 d'attendre qu'une des conditions soit remplie. La commande capturera le code de sortie du premier processus à quitter:

wait -n $completion_pid $failure_pid

Enfin, vous pouvez vérifier le code de sortie réel de wait -n pour voir si le travail a échoué ou non:

exit_code=$?

if (( $exit_code == 0 )); then
  echo "Job completed"
else
  echo "Job failed with exit code ${exit_code}, exiting..."
fi

exit $exit_code

Exemple complet:

# wait for completion as background process - capture PID
kubectl wait --for=condition=complete job/myjob &
completion_pid=$!

# wait for failure as background process - capture PID
kubectl wait --for=condition=failure job/myjob && exit 1 &
failure_pid=$! 

# capture exit code of the first subprocess to exit
wait -n $completion_pid $failure_pid

# store exit code in variable
exit_code=$?

if (( $exit_code == 0 )); then
  echo "Job completed"
else
  echo "Job failed with exit code ${exit_code}, exiting..."
fi

exit $exit_code
1
Sebastian N