我正在寻找一种方法来告诉(从脚本中)Kubernetes 作业何时完成。然后我想从容器中取出日志并执行清理。
什么是这样做的好方法?最好的方法是运行kubectl describe job <job_name>
和 grep for1 Succeeded
或类似的东西吗?
我正在寻找一种方法来告诉(从脚本中)Kubernetes 作业何时完成。然后我想从容器中取出日志并执行清理。
什么是这样做的好方法?最好的方法是运行kubectl describe job <job_name>
和 grep for1 Succeeded
或类似的东西吗?
从 1.11 版开始,您可以执行以下操作:
kubectl wait --for=condition=complete job/myjob
您还可以设置超时:
kubectl wait --for=condition=complete --timeout=30s job/myjob
您可以使用以下命令直观地查看作业的状态:
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
你可以用官方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>'
我会使用-w
or --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
or--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