Kubernetes - Скажите, когда работа завершена
Я ищу способ сообщить (из сценария), когда работа в Kubernetes завершена. Я хочу затем извлечь журналы из контейнеров и выполнить очистку.
Что было бы хорошим способом сделать это? Будет ли лучший способ бежать kubectl describe job <job_name>
и grep для 1 Succeeded
или что-то в этом роде?
7 ответов
Вы можете визуально просматривать статус задания с помощью этой команды:
kubectl get jobs myjob -w
-w
Вариант следит за изменениями. Вы ищете SUCCESSFUL
столбец для отображения 1
,
Для ожидания в сценарии оболочки я бы использовал эту команду:
until kubectl get jobs myjob -o jsonpath='{.status.conditions[?
(@.type=="Complete")].status}' | grep True ; do sleep 1 ; done
Теперь вы можете сделать:
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)
Не забудьте настроить свой конкретный kubeconfig
в ~/.kube/config
и допустимое значение для вашего пространства имен работы -> '<YOUR-JOB-NAMESPACE>'
Я хотел бы использовать -w
или --watch
:
$ kubectl get jobs.batch --watch
NAME COMPLETIONS DURATION AGE
python 0/1 3m4s 3m4s
Хотя иkubectl wait --for=condition=complete job/myjob
позволяют нам проверить, завершено ли задание, но нет способа проверить, завершилось ли выполнение задания (независимо от успеха или неудачи). Если это то, что вы ищете, простой ударwhile loop
сkubectl status check
сделал трюк для меня.
#!/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
Добавление лучшего ответа из комментария @Coo. Если вы добавите
-f
или же
--follow
вариант при получении журналов, он будет продолжать следить за журналом и завершаться, когда задание завершается или завершается сбоем .
$#
код состояния даже не равен нулю, когда задание завершается сбоем.
kubectl logs -l job-name=myjob --follow
Один недостаток этого подхода, о котором я знаю, заключается в том, что нет опции тайм-аута.
Другим недостатком является то, что вызов журналов может завершиться ошибкой, пока модуль находится в активном состоянии.
Pending
(пока контейнеры запускаются). Вы можете исправить это, дождавшись модуля:
# 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
Это любой из этих запросов с
kubectl
kubectl get job test-job -o jsonpath='{.status.succeeded}'
или
kubectl get job test-job -o jsonpath='{.status.conditions[?(@.type=="Complete")].status}'