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}'
Другие вопросы по тегам