告知作业何时完成
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
我正在寻找一种方法来告知(从脚本中)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