Kubectl 等待多个作业完成(失败或成功)

Kuebctl wait for multiple jobs completion (fail or success)

我想等待多个可能失败或成功的作业。我根据来自 Sebastian N 的 编写了一个简单的脚本。它的目的是等待工作的成功或失败。该脚本适用于 one 作业(显然只能失败或成功)。

现在问题来了...我需要等待 多个 由同一标签识别的作业。当所有作业都失败或所有作业都成功时,脚本工作正常。但是当一些工作失败时,一些工作成功 kubectl wait 会超时。

对于我接下来打算做的事情,没有必要知道哪些作业失败或成功,我只想知道它们何时结束。这是我写的脚本的“等待部分”(LABEL 是标识我要等待的作业的标签):

kubectl wait --for=condition=complete -l LABEL --timeout 14400s && exit 0 &
completion_pid=$!

kubectl wait --for=condition=failed -l LABEL --timeout 14400s && exit 1 &
failure_pid=$!

wait -n $completion_pid $failure_pid
exit_code=$?

if (( exit_code == 0 )); then
  echo "Job succeeded"
  pkill -P $failure_pid
else
  echo "Job failed"
  pkill -P $completion_pid
fi

如果有人好奇我为什么要杀死另一个 kubectl wait 命令,那是因为我设置了超时。当作业成功时,进程结束,但另一个等待直到达到超时。要在后台停止 运行 它,我只需将其杀死。

我找到了适合我目的的解决方法。我发现 kubectl logs 带有 --follow-f 标志指向 /dev/null 实际上是“等待”直到所有作业都完成。

进一步说明:

--follow 标志意味着日志是连续打印的——不查看作业的完成状态。此外,将日志指向 /dev/null 不会留下任何不需要的文本。我需要通过 Python 打印日志输出,所以我在最后添加了另一个 kubectl logs(我认为这并不理想,但它可以达到目的)。我使用 sleep 是因为我假设在所有作业完成后会有一些程序 - 没有它不会打印日志。最后我使用 --tail=-1 标志,因为我的日志预计会有大量输出。

这是我更新的脚本(这部分替换了有问题的指定脚本中的所有内容):

#wait until all jobs are completed, doesn't matter if failed or succeeded
kubectl logs -f -l LABEL > /dev/null

#sleep for some time && print final logs
sleep 2 && kubectl logs -l LABEL --tail=-1