观察 Kubernetes 作业输出直到完成

vin*_*uza 6 kubernetes kubectl

有没有办法使用 kubectl 观看作业的输出(STDOUT 和 STDERR)?我们需要等待作业完成并观察其输出,如果作业完成时出错,则应中断整个过程。

我想将作业输出(STDOUT 和 STDERR)重定向到我当前的进程 STDOUT。我想等待工作完成。如果它以错误结束,当前进程(通过 kubectl 触发作业)也应该以错误结束。我知道,kubectl wait但据我所知,它不支持收听作业输出。

vin*_*uza 9

我们最终使用了三个命令来完成任务。首先,我们删除旧作业(它可能之前运行过),创建新作业,等待它完成(超时),并在完成后打印日志:

kubectl delete job my-job || true
kubectl apply -f ./jobs/my-job.yaml
kubectl wait --for=condition=complete job/my-job --timeout=60s
echo "Job output:"
kubectl logs job/my-job
Run Code Online (Sandbox Code Playgroud)

  • 此解决方案存在两个问题: 1. 作业可能不会在 60 秒内完成,在这种情况下打印的日志是部分的 2. 那么您可能认为仅删除超时就可以解决问题...但是事实并非如此,因为作业可能会失败,在这种情况下它永远不会“完成”(条件从未触发且进程卡住) (2认同)

OhH*_*ark 7

您可以尝试以下几种选择:

  1. 实时查看作业日志:
    • kubectl logs --follow $POD

如果您无法找到正确的 Pod,那么第一个kubectl describe job $JOB Pod 名称将显示在“事件”下方

  1. 还有一些 kubectl 命令在这里很有用:
    • kubectl logs -f my-pod - 流式 pod 日志(标准输出)
    • kubectl logs -f my-pod -c my-container - 流式 pod 容器日志(标准输出,多容器情况)
    • kubectl logs -f -l name=myLabel --all-containers - 使用标签 name=myLabel (stdout) 流式传输所有 pod 日志

更多相关信息可以在这里找到

  1. 使用 kubectl wait 重试,但使用适当的标志,如--for=condition=xxxxx 成功的消息将打印到 stdout,指示何时满足指定的条件。