告知作业何时完成

Tell when Job is Complete

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

执行此操作的好方法是什么?最好的方法是 运行 kubectl describe job <job_name> 和 grep 1 Succeeded 或类似的东西吗?

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

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

从 1.11 版本开始,您可以:

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

您还可以设置超时:

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

可以使用官方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 以及您的作业命名空间的有效值 -> '<YOUR-JOB-NAMESPACE>'

我会使用 -w--watch:

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

这些查询之一 kubectl

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

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

添加最佳答案,来自@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