web-dev-qa-db-ja.com

コマンドラインを使用して、失敗または成功時にkubernetesジョブが完了するのを待ちます

Kubernetesジョブが完了するのを待つ最良の方法は何ですか?私は使用するための多くの提案に気づきました:

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

しかし、私はそれが仕事が成功した場合にのみ機能すると思います。それが失敗した場合、私は次のようなことをしなければなりません:

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

待機を使用して両方の条件を待機する方法はありますか?そうでない場合、ジョブが成功または失敗するのを待つ最良の方法は何ですか?

14
ruazn2

最初の待機条件をサブプロセスとして実行し、そのPIDを取得します。条件が満たされると、このプロセスは終了コード0で終了します。

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

障害待ち状態についても同様にしてください。ここでのトリックは、&& exit 1を追加して、ジョブが失敗したときにサブプロセスがゼロ以外の終了コードを返すようにすることです。

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

次に、Bash組み込み関数wait -n $PID1 $PID2を使用して、条件の1つが成功するのを待ちます。このコマンドは、最初に終了するプロセスの終了コードをキャプチャします。

wait -n $completion_pid $failure_pid

最後に、wait -nの実際の終了コードをチェックして、ジョブが失敗したかどうかを確認できます。

exit_code=$?

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

exit $exit_code

完全な例:

# 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