kubernetes 告知作业何时完成

yks3o0rb  于 2023-02-03  发布在  Kubernetes
关注(0)|答案(7)|浏览(180)

我正在寻找一种方法来告诉(从脚本中)Kubernetes作业何时完成,然后从容器中取出日志并执行清理。
做这件事的好方法是什么?最好的方法是运行kubectl describe job <job_name>和grep for 1 Succeeded或类似的东西吗?

egdjgwm8

egdjgwm81#

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

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

您还可以设置超时:

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

mutmk8jj2#

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

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
xzabzqsa

xzabzqsa3#

您可以使用官方的Python kubernetes-client
https://github.com/kubernetes-client/python
创建新的Python虚拟环境:
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>'

w1jd8yoj

w1jd8yoj4#

我会使用-w--watch

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

vngu2lb85#

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

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

据我所知,这种方法的一个缺点是没有超时选项。
另一个缺点是当pod在Pending中时(当container正在启动时),logs调用可能会失败。

# 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
zsbz8rwp

zsbz8rwp6#

使用kubectl执行以下任一查询

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

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

sz81bmfz7#

虽然kubectl wait --for=condition=complete job/myjobkubectl wait --for=condition=complete job/myjob允许我们检查作业是否完成,但是无法检查作业是否刚刚执行完(无论成功还是失败)。如果这就是您正在寻找的,那么使用kubectl status check简单地bash while loop就可以达到目的。

#!/bin/bash
while true; do
status=$(kubectl get job jobname -o jsonpath='{.status.conditions[0].type}')
echo "$status" | grep -qi 'Complete' && echo "0" && exit 0
echo "$status" | grep -qi 'Failed' && echo "1" && exit 1
done

相关问题