【问题标题】:Tell when Job is Complete告诉作业何时完成
【发布时间】:2017-11-24 23:25:05
【问题描述】:

我正在寻找一种方法来告诉(从脚本中)Kubernetes 作业何时完成。然后我想从容器中取出日志并执行清理。

有什么好的方法可以做到这一点?最好的方法是运行 kubectl describe job <job_name> 和 grep for 1 Succeeded 或类似的东西吗?

【问题讨论】:

标签: kubernetes kubectl kubernetes-jobs


【解决方案1】:

从 1.11 版本开始,您可以:

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

你也可以设置一个超时时间:

kubectl wait --for=condition=complete --timeout=30s job/myjob

【讨论】:

  • 是否可以无限期超时(永远等待)?
  • @JoãoMatos 默认--timeout 为 30 秒。为--timeout 指定负值意味着“等待一周”(实际上,这几乎是无限期的)。看看kubectl wait 参考。
  • 我在我的 YAML 配置文件中搜索可以轻松实现的东西,groundnuty/k8s-wait-for 的一个小型 docker 映像符合我的期望。
  • 只关注工作日志有什么问题吗?如果只有一个 pod,则执行 kubectl logs job/myjob --follow 将有效地等待作业完成,无论其成功与否(condition=complete 会在作业失败时触发)
  • 如果作业的 pod 失败,该命令将超时,因为作业没有事件。
【解决方案2】:

您可以使用此命令直观地查看作业的状态:

kubectl get jobs myjob -w

-w 选项监视更改。您正在寻找 SUCCESSFUL 列以显示 1

为了在 shell 脚本中等待,我会使用这个命令:

until kubectl get jobs myjob -o jsonpath='{.status.conditions[? 
    (@.type=="Complete")].status}' | grep True ; do sleep 1 ; done

【讨论】:

  • 你对等待status.succeeded = 1有什么看法?
  • @GuidoGarcía 如果你使用 status.succeeded = 1 那么当一个 Job 有多个完成时你就会遇到问题 status.succeeded 在第一个完成时设置为 1,并不是所有的都喜欢with conditions.type = Complete
  • shell 脚本回答这将永远等待“失败”的作业,因为失败的作业不会返回任何内容
  • .status.conditions[?后面的空格是不是有点编辑错误?
【解决方案3】:

您可以使用官方Python kubernetes-client

https://github.com/kubernetes-client/python

创建新的 Python virtualenv:

virtualenv -p python3 kubernetes_venv

激活它

source kubernetes_venv/bin/activate

并安装 kubernetes 客户端:

pip install kubernetes

创建新的 Python 脚本并运行:

from kubernetes import client, config

config.load_kube_config()

v1 = client.BatchV1Api()
ret = v1.list_namespaced_job(namespace='<YOUR-JOB-NAMESPACE>', watch=False)
for i in ret.items:
    print(i.status.succeeded)

记得在~/.kube/config 中设置您的特定kubeconfig 并为您的工作命名空间设置有效值 -> '&lt;YOUR-JOB-NAMESPACE&gt;'

【讨论】:

  • 不确定这是一个详尽的答案,因为还有 job.status.failed 字段。我现在观察到,如果工作成功,那么job.status.failed 就是None。我想知道job.status.failed 是否为1,job.status.succeeded 是否可以为None
【解决方案4】:

我会使用-w--watch

$ kubectl get jobs.batch --watch
NAME     COMPLETIONS   DURATION   AGE
python   0/1           3m4s       3m4s

【讨论】:

    【解决方案5】:

    kubectl 是这些查询之一

    kubectl get job test-job -o jsonpath='{.status.succeeded}'
    

    kubectl get job test-job -o jsonpath='{.status.conditions[?(@.type=="Complete")].status}'
    

    【讨论】:

      【解决方案6】:

      添加最佳答案,来自@Coo 的评论,如果您在获取日志时添加-f--follow 选项,它将继续跟踪日志并在作业完成或失败时终止。当作业失败时,$# 状态码甚至不为零。

      kubectl logs -l job-name=myjob --follow
      

      据我所知,这种方法的一个缺点是没有超时选项。

      另一个缺点是当 pod 位于 Pending 时(容器正在启动时),日志调用可能会失败。您可以通过等待 pod 来解决此问题:

      # Wait for pod to be available; logs will fail if the pod is "Pending"
      while [[ "$(kubectl get pod -l job-name=myjob -o json | jq -rc '.items | .[].status.phase')" == 'Pending' ]]; do
          # Avoid flooding k8s with polls (seconds)
          sleep 0.25
      done
      
      # Tail logs
      kubectl logs -l job-name=myjob --tail=400 -f
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-15
        • 2020-07-11
        • 2015-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-25
        • 2016-10-10
        相关资源
        最近更新 更多