98

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

什么是这样做的好方法?最好的方法是运行kubectl describe job <job_name>和 grep for1 Succeeded或类似的东西吗?

4

6 回答 6

156

从 1.11 版开始,您可以执行以下操作:

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

您还可以设置超时:

kubectl wait --for=condition=complete --timeout=30s job/myjob
于 2018-06-22T00:35:42.350 回答
28

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

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
于 2017-06-27T22:36:57.297 回答
6

你可以用官方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)

请记住为您的工作命名空间设置您的特定kubeconfig输入~/.kube/config和有效值 - >'<YOUR-JOB-NAMESPACE>'

于 2019-01-11T09:24:29.897 回答
1

我会使用-wor --watch

$ kubectl get jobs.batch --watch
NAME     COMPLETIONS   DURATION   AGE
python   0/1           3m4s       3m4s
于 2019-08-07T18:09:05.043 回答
0

它是这些查询之一kubectl

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

或者

kubectl get job test-job -o jsonpath='{.status.conditions[?(@.type=="Complete")].status}'
于 2021-08-04T08:46:46.830 回答
0

从@Coo 的评论中添加最佳答案,如果您在获取日志时添加-for--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
于 2021-11-12T19:20:25.540 回答