Поиск по сайту:

Как очистить старые задания Kubernetes


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

Регулярное использование Jobs и CronJobs обычно приводит к тому, что в вашем кластере остается большое количество объектов. Задания и их поды намеренно сохраняются на неопределенный срок после их завершения. Это сделано для того, чтобы в будущем вы могли проверить статус задания и получить его журналы. Однако слишком большое количество выполненных заданий загрязняет вывод Kubectl, когда вы запускаете такие команды, как kubectl get pods или kubectl get jobs. Это может затруднить сосредоточение внимания на соответствующей деятельности.

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

Пределы хранения истории CronJob

Автоматическая очистка поддерживается для заданий, созданных CronJob, начиная с версии Kubernetes 1.6. Этот метод позволяет настроить отдельные пороги удаления для завершенных и невыполненных заданий.

Включите стратегию очистки, установив поля spec.successfulJobsHistoryLimit и spec.failedJobsHistoryLimit в объекте CronJob:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: demo-cron
spec:
  schedule: "* * * * *"
  successfulJobsHistoryLimit: 5
  failedJobsHistoryLimit: 10
  jobTemplate:
    spec:
      template:
        spec:
          containers:
            - name: demo-cron
              image: busybox:latest
              command: ["/bin/sh", "-c", "Job complete!"]

CronJob, показанный выше, сохранит объекты Job из 10 последних неудачных запусков, а также из пяти последних успешных.

В любой момент времени в вашем кластере может быть не более 15 старых заданий. Эти 15 будут сохранены на неопределенный срок. Они будут удалены только тогда, когда их заменит более новая работа, которая завершается с тем же статусом.

Ограничения истории CronJob по умолчанию применяются, когда вы пропускаете пользовательские значения в своем манифесте. Kubernetes обычно сохраняет три успешных задания и одно неудачное. Значение 0 поддерживается для удаления заданий сразу после их завершения, без сохранения каких-либо.

TTL завершенных работ

Job TTL — это новое дополнение Kubernetes, ставшее стабильным в версии 1.23. TTL задаются непосредственно для ваших объектов Job, поэтому вам не нужно использовать CronJobs. TTL предписывает Kubernetes удалить задание и его поды по истечении фиксированного времени, независимо от состояния завершения задания.

Вы можете включить этот механизм, установив поле spec.ttlSecondsAfterFinished в объектах Job:

apiVersion: batch/v1
kind: Job
metadata:
  name: demo-job
spec:
  ttlSecondsAfterFinished: 300
  template:
    spec:
      containers:
        - name: demo-cron
          image: busybox:latest
          command: ["/bin/sh", "-c", "Job complete!"]

Если ваша работа определена как часть CronJob, убедитесь, что вы вложили поле в jobTemplate:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: demo-cron
spec:
  schedule: "* * * * *"
  jobTemplate:
    spec:
      ttlSecondsAfterFinished: 300
      template:
        spec:
          containers:
            - name: demo-cron
              image: busybox:latest
              command: ["/bin/sh", "-c", "Job complete!"]

В приведенных выше примерах задания будут отмечены как подлежащие удалению через пять минут (300 секунд) после их завершения. Это происходит независимо от того, находится ли задание в состоянии Complete или Failed.

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

Установка TTL задания на 0 позволит удалить его сразу после завершения. Вы должны подумать, подходит ли это для каждой из ваших задач. Отсутствие сохранения истории может затруднить отладку проблем, поскольку вы не сможете получить журналы контейнеров.

Поле ttlSecondsAfterFinished является изменяемым. Вы можете изменить его в существующих заданиях в любое время. Однако не гарантируется, что модификации повлияют на уже созданные исполнения. Расширение TTL задания может по-прежнему удалять запуски, которые были запланированы, пока применялось предыдущее значение.

Удаление заданий вручную

Вы всегда можете вручную удалить задание с помощью Kubectl. Сначала получите список вакансий:

$ kubectl get jobs
NAME                 COMPLETIONS   DURATION   AGE
demo-cron-27549499   1/1           2s         36s

Затем введите команду удалить задание с именем выбранного задания:

$ kubectl delete job demo-cron-27549499
job.batch "demo-cron-27549499" deleted

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

Пакетное удаление по требованию

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

$ kubectl delete jobs --field-selector status.successful=1
job.batch "demo-cron-27549501" deleted
job.batch "demo-cron-27549502" deleted
job.batch "demo-cron-27549503" deleted

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

Чтобы удалить все задания, связанные с конкретным заданием CronJob, лучше всего установить для этих заданий метку, которая идентифицирует родительское задание CronJob. Определите метку, используя поле spec.jobTemplate.metadata.labels вашего CronJob:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: demo-cron
spec:
  schedule: "* * * * *"
  jobTemplate:
    metadata:
      labels:
        cron-job: demo-cron
    spec:
      template:
        spec:
          containers:
            - name: demo-cron
              image: busybox:latest
              command: ["/bin/sh", "-c", "Job complete!"]

Вы можете удалить задания, созданные этой версией demo-cron CronJob, с помощью следующей команды:

$ kubectl delete jobs -l cron-job=demo-cron
job.batch "demo-cron-27549501" deleted
job.batch "demo-cron-27549502" deleted
job.batch "demo-cron-27549503" deleted

Комбинация этого примера с селектором полей позволяет удалить запуски demo-cron, находящиеся в определенном состоянии:

$ kubectl delete jobs -l cron-job=demo-cron --field-selector status.successful=0
job.batch "demo-cron-27549501" deleted
job.batch "demo-cron-27549502" deleted
job.batch "demo-cron-27549503" deleted

Эта команда удаляет невыполненные задания, запланированные demo-cron CronJob.

Краткое содержание

Задания Kubernetes обычно остаются в вашем кластере после завершения. Такое поведение позволяет вам получать их журналы в произвольное время в будущем, но быстро приводит к чрезмерному накоплению объектов.

Задания CronJob поставляются с ограничениями хранения, включенными по умолчанию, и поддерживают раздельную настройку для успешных и неудачных запусков. Это должен быть ваш предпочтительный механизм для управления запланированными заданиями. Другие виды заданий лучше всего настроить с TTL, который будет автоматически очищать ресурсы по истечении фиксированного периода времени.

Хотя Kubernetes исторически хранил старые задания на неопределенный срок, теперь рекомендуется использовать механизм TTL везде, где это возможно. Наличие слишком большого количества старых заданий в вашем кластере может привести к снижению производительности, поскольку плоскость управления должна отслеживать объекты и созданные ими поды.




Все права защищены. © Linux-Console.net • 2019-2024