Как установить ограничение по времени для задания Kubernetes?

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

Существует ли что-то подобное? (Сначала я думал, что activeDeadlineSeconds спецификации задания охватывает этот вариант использования, но теперь я вижу, что activeDeadlineSeconds устанавливает ограничение только на повторную попытку задания; оно не убивает медленное/неуправляемое задание.)


person Bosh    schedule 06.07.2017    source источник
comment
Как насчет использования живого зонда? Вы можете создать зонд, который возвращает успех в течение необходимого вам времени, а по истечении крайнего срока он вернет ошибку (1) и уничтожит контейнер. Дополнительная информация о проверке живучести: kubernetes.io/docs /tasks/configure-pod-container/   -  person Ottovsky    schedule 06.07.2017
comment
Я думаю, что это на самом деле очень хороший запрос функции. Это где-то отслеживается в Kubernetes Github?   -  person Alex    schedule 21.07.2020


Ответы (2)


Вы можете самостоятельно устанавливать тайм-ауты для команды точки входа контейнера с помощью утилиты GNU timeout.

Например, следующее задание, которое вычисляет первые 4000 цифр числа пи, истечет через 10 секунд:

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    metadata:
      name: pi
    spec:
      containers:
      - name: pi
        image: perl
        command: ["/usr/bin/timeout", "10", "perl", "-Mbignum=bpi", "-wle", "print bpi(4000)"]
      restartPolicy: Never

(Манифест взят из https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/#running-an-example-job)

Вы можете поиграть с цифрами и увидеть, истекло время ожидания или нет. Обычно вычисление 4000 цифр числа пи занимает на моей рабочей станции ~ 23 секунды, поэтому, если вы установите его на 5 секунд, он, вероятно, всегда будет терпеть неудачу, а если вы установите его на 120 секунд, он всегда будет работать.

person Ahmet Alp Balkan    schedule 06.07.2017
comment
Спасибо! Мне это очень нравится, хотя это заставляет шаблон модуля знать о команде изображения по умолчанию, а не просто запускать изображение. Это немного прискорбно, но это определенно рабочее решение. - person Bosh; 13.07.2017
comment
Просто к сведению, вы всегда можете создавать переменные для аргументов, например. $TIMEOUT, и его значение исходит из монтирования ConfigMap, поэтому вам не нужно жестко кодировать. Таким образом, вы можете изменить его в ConfigMap, и новые задания будут использовать новое значение. - person Ahmet Alp Balkan; 13.07.2017
comment
Это хороший момент, хотя спецификация по-прежнему должна знать команду по умолчанию для изображения. - person Bosh; 16.07.2017
comment
использование timeout cli - довольно хороший способ справиться с этим, я полностью переделал его (blog.random.io/k8s-cronjob-with-execution-timeout) - person anapsix; 22.04.2021
comment
Я обычно заканчиваю часть command: yaml на bash -c, а затем помещаю нужную команду в раздел args:. Таким образом, command никогда не меняется, и проще написать естественную командную строку в args, потому что она не требует неуклюжих кавычек. - person David Parks; 08.05.2021

Насколько я понимаю, документация раздела activeDeadlineSeconds заключается в том, что он относится к активному времени задания, и после этого времени задание считается Failed.

Официальное заявление о документе:

ActiveDeadlineSeconds применяется к продолжительности задания, независимо от того, сколько подов создано. Как только задание достигает activeDeadlineSeconds, все его запущенные поды прекращаются, а статус задания становится следующим: «Ошибка по причине: DeadlineExceeded».

https://kubernetes.io/docs/concepts/workloads/controllers/job/#job-termination-and-cleanup

person tmetodie    schedule 08.12.2020