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
我想等待多个可能失败或成功的作业。我根据来自 Sebastian N 的
现在问题来了...我需要等待 多个 由同一标签识别的作业。当所有作业都失败或所有作业都成功时,脚本工作正常。但是当一些工作失败时,一些工作成功 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