Уборка вакансий Кубернетеса

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

Все были созданы с использованием API рабочих мест.

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

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

Ответ 1

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

successfulJobsHistoryLimit: X
failedJobsHistoryLimit: Y

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

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

Недавно я построил оператор кубернетов для выполнения этой задачи.

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

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

Ответ 5

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

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