等待kubernetes作业完成的最好方法是什么?我注意到很多建议可以用途:
kubectl wait --for=condition=complete job/myjob
不过,我认为只有在工作成功的情况下,才可以这样做;如果工作失败,我便要这样做:
kubectl wait --for=condition=failed job/myjob
是否有一种方法可以使用wait同时等待这两种情况?如果没有,等待作业成功或失败的最佳方法是什么?
等待kubernetes作业完成的最好方法是什么?我注意到很多建议可以用途:
kubectl wait --for=condition=complete job/myjob
不过,我认为只有在工作成功的情况下,才可以这样做;如果工作失败,我便要这样做:
kubectl wait --for=condition=failed job/myjob
是否有一种方法可以使用wait同时等待这两种情况?如果没有,等待作业成功或失败的最佳方法是什么?
5条答案
按热度按时间e5nszbig1#
将第一个等待条件作为子进程运行并捕获其PID。如果满足该条件,则此进程将退出,退出代码为0。
对失败等待条件执行同样的操作。这里的技巧是添加
&& exit 1
,以便当作业失败时,子进程返回一个非零的退出代码。然后使用内置的Bash
wait -n $PID1 $PID2
等待其中一个条件成功。该命令将捕获第一个要退出的进程的退出代码:Mac用户!请注意
wait -n [...PID]
需要Bash 4.3或更高版本。由于许可证问题,MacOS永远停留在3.2版本。请参阅此Stackoverflow Post以了解如何安装最新版本。最后,您可以检查
wait -n
的实际退出代码,以查看作业是否失败:完整示例:
w6mmgewl2#
当
--timeout=0
时,您可以利用该行为。在这种情况下,命令行会立即返回结果代码0或1。下面是一个示例:
因此,当
condition=failed
或condition=complete
为真时,执行将退出while循环(retval_complete
或retval_failed
将为0
)。接下来,您只需要检查并根据您希望的条件采取行动。在我的情况下,我希望快速失败,并在作业失败时停止执行。
9w11ddsr3#
wait -n
方法对我不起作用,因为我需要它在Linux和Mac上都能工作。我对克莱顿提供的答案做了一些改进,因为他的脚本在启用
set -e -E
的情况下无法工作。您可能希望添加超时以避免无限循环,这取决于您的情况。
omtl5h9j4#
kubectl wait --for=condition=<condition name
正在等待一个特定的条件,因此afaik此时不能指定多个条件。我的解决方法是使用
oc get --wait
,如果更新了目标资源,--wait
将关闭该命令。我将使用oc get --wait
监视作业的status
部分,直到更新了status
。更新status
部分意味着作业已完成,但存在一些状态条件。如果作业成功完成,则
status.conditions.type
会立即更新为Complete
。但如果作业失败,则无论restartPolicy
是OnFailure
还是Never
,作业Pod都会自动重新启动。但如果在第一次更新后未更新为Complete
,则可以认为作业处于Failed
状态。看我的测试证据如下。
Complete
。Complete
,它将显示Failed
。在删除现有作业资源后测试。我希望这对你有帮助
prdp8dxp5#
您可以使用
kubectl logs --follow
使用下列解决方法:它将在作业终止时终止,无论状态如何。