Модуль K8s для предотвращения привязки модуля Cronjob к равномерному планированию

#kubernetes #kubernetes-cronjob

#kubernetes #kubernetes-cronjob

Вопрос:

В многопользовательском сценарии с 500 namespaces , каждый с идентичным Cronjob , помеченным app=some-job , и 20 worker nodes , возможно ли заставить планировщик k8s равномерно распределить 500 модулей Cronjob по 20 узлам, чтобы на любом узле было только ~ 25 завершенных и / или запущенных модулей в данный момент времени?

Я заметил, что 500 модулей Cronjob, как правило, запланированы только примерно на 7 из 20 узлов, и KubeletTooManyPods срабатывает аварийный сигнал, хотя большинство модулей находятся в завершенном состоянии.

Я думаю, что решением могло бы быть применение анти-сродства Pod к ярлыку app=some-job с помощью topologyKey=kubernetes.io/hostname , но не уверен, соблюдает ли это Completed Pods, и если бы это делало равномерный разброс, когда на всех 20 узлах было по крайней мере 1 Pod, и в этот момент каждый узел не выполнял бы анти-сродствослучай, но я надеюсь preferredDuringSchedulingIgnoreDuringExecution , позволит продолжить планирование с равномерным распределением.

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

Редактировать: хотел упомянуть, что мы используем EKS 1.17 Редактировать 2: опечатка

Комментарии:

1.Похоже podTopologySpreadConstraints , что он был разработан для этого сценария. Обновление до версии 1.18 сделает это доступным, поэтому я посмотрю, принесет ли это желаемое results:docs.aws.amazon.com/eks/latest/userguide/…kubernetes.io/docs/concepts/workloads/pods /…

2. Наличие завершенных заданий не влияет на логику планирования, поэтому я сомневаюсь podTopologySpreadConstraints , что это поможет. Вам лучше использовать ограничения истории ( kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs /… ).

3. В зависимости от того, что делает cronjob, рассматривали ли вы возможность использования наборов демонов, если хотите, чтобы они были равномерно распределены по узлам? Это объекты с пространством имен

4. @Oliver, отличная идея по ограничению истории! На данный момент у меня есть ограничение в 1, но нет причин сохранять эти ссылки на успешные задания, просто нужно, если произошел сбой. Ведение журнала является незначительной проблемой, если требуется какое-то исследование после выполнения задания, но мы отправляем логи в ES w / fluent-bit, поэтому они могут быть у нас, в зависимости от времени, когда журналы контейнера исчезают с рабочего узла после удаления модуля…

5. @MariuszK. Спасибо за информацию! В этом конкретном сценарии я не думаю, что deamonset может заменить cronjobs

Ответ №1:

Наличие Complete заданий не влияет на логику планирования, поэтому я сомневаюсь podTopologySpreadConstraints , что это поможет. Вам лучше использовать ограничения истории (kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs /…)

В одном из ваших комментариев указано, что вам нужны журналы: загрузите журналы модуля как часть задания, т.Е. В конце скрипта, запускаемого cronjob, нажмите на s3 или fluentbit или где угодно. Тогда вам гарантируется, что после завершения cronjob журналы будут в безопасности. Журналы заданий могут исчезать по разным причинам (их можно очистить, модули могут быть удалены или удалены и т. Д.), Поэтому Не стоит полагаться на наличие Completed заданий для доступа к ним.