Сообщите, когда работа будет завершена

Я ищу способ узнать (из сценария), что задание Kubernetes завершено. Затем я хочу вытащить журналы из контейнеров и выполнить очистку.

Что было бы хорошим способом сделать это? Лучше всего было бы запустить kubectl describe job <job_name> и grep для 1 Succeeded или что-то в этом роде?


person russt    schedule 21.06.2017    source источник
comment
Чтобы дождаться запуска модуля, используйте condition = ready. Кроме того, вы можете дождаться статуса развертывания развертывания. См .: stackoverflow.com/a/60810347/658497   -  person Noam Manos    schedule 23.03.2020


Ответы (4)


Начиная с версии 1.11 вы можете:

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

и вы также можете установить тайм-аут:

kubectl wait --for=condition=complete --timeout=30s job/myjob
person abagshaw    schedule 22.06.2018
comment
Можно ли иметь неопределенный тайм-аут (ждать вечно)? - person João Matos; 14.03.2019
comment
@ JoãoMatos По умолчанию --timeout составляет 30 секунд. Указание отрицательных значений для --timeout означает ожидание в течение недели (что на практике почти бесконечно). Взгляните на ссылку kubectl wait. - person Eduardo Baitello; 14.03.2019
comment
Я ищу то, что могу легко реализовать в моих файлах конфигурации YAML и небольшом образе докера из Groundnuty / k8s -wait-for оправдал мои ожидания. - person Egel; 18.09.2020
comment
Что-то плохое в том, чтобы просто следить за журналом работы? Если есть только один модуль, выполнение kubectl logs job/myjob --follow будет эффективно ждать завершения задания, независимо от его успеха (condition=complete запускается при сбое задания) - person Coo; 05.12.2020
comment
Если модули для задания выйдут из строя, эта команда истечет по таймауту, поскольку для задания нет события. - person Hong; 04.03.2021
comment
@Coo Эта команда не сработает до тех пор, пока задание не запустится, поэтому есть состояние гонки. - person Noah; 08.07.2021
comment
Фактически состояние гонки также присутствует с командой wait в ответе. - person Noah; 08.07.2021

Вы можете визуально наблюдать за статусом задания с помощью этой команды:

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
person Eric Tune    schedule 27.06.2017
comment
что ты думаешь об ожидании на status.succeeded = 1? - person Guido; 22.02.2018
comment
@ GuidoGarcía Если вы используете status.succeeded = 1, то проблема возникает, когда задание имеет несколько завершений. Status.succeeded устанавливается в 1, когда первое завершено, а не все из них, как в случае с conditions.type = Complete - person Meiko Watu; 09.05.2018
comment
Ответ сценария оболочки: это будет вечно ждать неудачного задания, так как неудачное задание ничего не вернет. - person bwawok; 12.04.2019
comment
Нет ли незначительной ошибки редактирования с пробелом после .status.conditions[?? - person Philippe Fanaro; 20.08.2019

Можно использовать официальный 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>'

person Community    schedule 11.01.2019
comment
Не уверен, что это исчерпывающий ответ, потому что есть еще поле job.status.failed. Теперь я заметил, что если задание выполнено успешно, то job.status.failed равно None. Интересно, если job.status.failed равно 1, может ли job.status.succeeded быть None. - person Anton Daneyko; 20.05.2021

Я бы использовал -w или --watch:

$ kubectl get jobs.batch --watch
NAME     COMPLETIONS   DURATION   AGE
python   0/1           3m4s       3m4s
person Laith Leo Alobaidy    schedule 07.08.2019