Работа по уборке Кубернетеса

Из того, что я понимаю, объект Job должен собирать стручки через определенное время. Но в моем кластере GKE (Kubernetes 1.1.8) кажется, что "kubectl get pods -a" может выводить список модулей за несколько дней до этого.

Все были созданы с использованием Jobs API.

Я заметил, что после удаления работы с помощью kubectl delete jobs стручки также были удалены.

Моя главная проблема заключается в том, что я собираюсь запускать тысячи и десятки тысяч модулей в кластере в пакетных заданиях и не хочу перегружать внутреннюю систему невыполненных работ.

4 ответа

Похоже, начиная с Kubernetes 1.6 (и версии API v2alpha1), если вы используете cronjobs для создания заданий (которые, в свою очередь, создают ваши модули), вы сможете ограничить количество сохраняемых старых заданий. Просто добавьте в свою работу следующее:

successfulJobsHistoryLimit: X
failedJobsHistoryLimit: Y

Где X и Y - это ограничения на количество ранее выполненных заданий, которые должна поддерживать система (по умолчанию она хранится неопределенно долго [по крайней мере, в версии 1.5.])

Изменить 2018-09-29:

Для более новых версий K8S обновленные ссылки с документацией для этого находятся здесь:

Это правда, что раньше вам приходилось удалять задания вручную. Ответ @ Пуджи был правильным на момент написания статьи.

Kubernetes 1.12.0 выпустил функцию TTL (в альфа-версии), где вы можете настроить ее на автоматическую очистку заданий через указанное количество секунд после завершения ( журнал изменений). Вы можете установить его на ноль для немедленной очистки. Смотрите документацию Джобса.

Пример из документа:

apiVersion: batch/v1
kind: Job
metadata:
  name: pi-with-ttl
spec:
  ttlSecondsAfterFinished: 100
  template:
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never

Я недавно построил kubernetes-оператор для выполнения этой задачи.

После развертывания он будет отслеживать выбранное пространство имен и удалять завершенные задания / модули, если они завершены без ошибок / перезапусков.

https://github.com/lwolf/kube-cleanup-operator

Это предполагаемое поведение Джобса даже в Кубернетесе 1.3. И задание, и его модули остаются в системе до тех пор, пока вы не удалите их вручную. Это делается для того, чтобы вы могли видеть результаты работы модулей (например, через журналы), которые не были уже перенесены каким-либо механизмом наружу, или проверять ошибки, предупреждения или другие диагностические результаты.

Рекомендуемый / официальный способ избавиться от контейнеров - удалить задание, как вы упоминали выше. Использование сборщика мусора приведет только к удалению модулей, но само задание все равно будет в системе.

Если вы не хотите удалять задание вручную, вы можете написать небольшой скрипт, который выполняется в вашем кластере, проверяет выполненные задания и удаляет их. К сожалению, запланированные задания появятся только в версии 1.4, но вместо этого вы можете запустить скрипт в обычном модуле.

В kubernetes v1.2 есть сборщик мусора для сбора завершенных модулей с глобальным порогом --terminated-pod-gc-threshold=12500 (см. флаги в диспетчере контроллеров. Я не знаю ни одного механизма GC для завершенных модулей в v1.1.8. Возможно, вы захотите запустить скрипт / модуль для периодической очистки модулей / заданий, чтобы предотвратить перегрузку главных компонентов. Кстати, есть открытая проблема для автоматической настройки порога ГХ.

Другие вопросы по тегам