Как управлять расписанием модулей в aws EKS?

#amazon-web-services #kubernetes #kubernetes-pod #amazon-eks

#amazon-веб-сервисы #kubernetes #kubernetes-pod #amazon-eks

Вопрос:

У меня есть кластер на EKS с включенным автоскалером кластера. Предположим, что есть 3 узла node-1, node-2, node3. На узлах может быть не более 10 модулей каждый. Теперь, когда появится 31-й модуль, центр сертификации запустит новый узел и запланирует модуль на нем. Теперь, возможно, допустим, что 4 модуля из узла 2 не требуются, и они выходят из строя. Теперь в соответствии с требованием, если запускается новый модуль, планировщик помещает новый модуль на 4-й узел (запущенный центром сертификации), а не на второй узел. Также я хочу, чтобы это продолжалось, если модули удаляются из узлов, тогда новые модули должны поступать в уже существующий узел, а не в новый узел, созданный CA. Я попытался обновить конфигурационный файл планировщика EKS по умолчанию с помощью плагина планировщика, но не смог этого сделать.

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

Это команда: «kube-scheduler —config custom.config», и это ошибка «попытка получить leader lease kube-system / kube-scheduler …»

Это мой пользовательский файл.config

 apiVersion: kubescheduler.config.k8s.io/v1beta1
clientConnection:
   kubeconfig: /etc/kubernetes/scheduler.conf
kind: KubeSchedulerConfiguration
percentageOfNodesToScore: 100
profiles:
- schedulerName: kube-scheduler-new
  plugins:
   score:
  disabled:
    - name: '*'
  enabled:
    - name: NodeResourcesMostAllocated
 

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

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

2. да, если узлы уже существуют, новые модули должны работать как можно чаще на существующих узлах.

3. Итак, если узлы 1 и 2 загружены на 100%, 3 — на 60%, а 4 — на 20%, а минимальный размер кластера составляет 3 узла, вы хотите принудительно подключить новый модуль к узлу 3 вместо 4? (Автоматическое масштабирование кластера завершит работу узла , если его загрузка ниже 50%, и все его модули могут быть перемещены в другое место; поэтому в моем примере узел 4 может быть завершен, даже если там будет размещен новый модуль, но если бы все четыре узла использовали 70%, этого бы не было.)

4. Хорошо, это выглядит хорошо. Я думаю, что я пропустил это. Спасибо за эту ссылку. В любом случае, если нам нужно настроить поведение планировщика по умолчанию в eks, можем ли мы это сделать? Или мы можем добавить второй планировщик в eks? В последнее время я много изучал этот вопрос, но не смог найти ни одного примера или решения по этому вопросу. Было бы весьма полезно, если бы вы также могли предоставить какую-либо информацию об этом.

5. Я согласен с @DavidMaze. Вместо замены планировщика Kubernetes я рекомендую другой подход. Спросите, хочу ли я запланировать разные реплики на отдельные узлы или разные зоны доступности? Или вы хотите, чтобы они были на одном узле / AZ? Рассмотрите возможность добавления конфигурации привязки к узлу или анти-привязки к развертываниям. В зависимости от ваших потребностей могут существовать другие встроенные параметры конфигурации для примитивов Kubernetes, которые будут делать то, что вы хотите. Надеюсь, это поможет!

Ответ №1:

Как управлять расписанием модулей?

Пользовательский планировщик — это, конечно, один из способов, если у вас есть какой-то конкретный вариант использования, но если вы просто хотите иметь какой-то конкретный узел, на который вы хотите запланировать модуль, Kubernetes предоставляет для этого варианты.

Выбор алгоритма планирования можно разбить на две части:

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

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

  • Для удаления некоторых модулей с узла можно использовать искажения и допуски. Это очень полезно, если вы хотите разделить свой кластер и разрешить некоторым определенным людям планировать некоторые определенные узлы. Может также использоваться, когда у вас есть несколько аппаратных узлов, и некоторые модули требуют этого (например, в вашем вопросе, где вы хотите, чтобы модуль был запланирован на узле 2). Они имеют 3 эффекта:
  1. NoSchedule это означает, что планирования не будет
  2. PreferNoSchedule это означает, что планировщик попытается избежать планирования
  3. NoExecute также влияет на планирование и влияет на модули, уже запущенные на узле. ЕСЛИ вы добавите это заражение в узел, модули, запущенные на узле и не допускающие этого, будут удалены.
  • Привязка к узлу на другой стороне может использоваться для привлечения определенных модулей к определенным узлам. Аналогично привязке к узлу tains, это дает мне несколько вариантов для точной настройки ваших настроек планирования:
    1. requiredDuringSchedulingIgnoredDuringExecution который можно использовать в качестве жесткого требования и сообщать планировщику, что для планирования pod на узле должны соблюдаться правила.
    2. preferredDuringSchedulingIgnoredDuringExecution которое можно использовать в качестве мягкого требования и указать планировщику попытаться обеспечить его соблюдение, но это не обязательно должно быть гарантировано
  • PodAffinity можно использовать, если вы, например, хотите, чтобы ваши интерфейсные модули запускались на том же узле, что и ваш модуль базы данных. Это может быть аналогичным образом описано как жесткое или мягкое требование соответственно.
  • podAntiAffinity можно использовать, если вы не хотите, чтобы некоторые определенные модули работали друг с другом.

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

1. Спасибо за такой подробный ответ!! В моем случае существует проблема с nodeselector и концепцией affinity. У меня будет, скажем, 4-5 запасных узлов, и эти узлы увеличатся, если трафик увеличится. Теперь мне нужно будет найти способ автоматизировать процесс прикрепления различных меток узлов, поскольку файл развертывания будет размещать метки узлов одного и того же типа на всех узлах. В дальнейшем в этом будет задействовано много ручного процесса. Это может быть проблемой для меня, если мы рассмотрим это в процессе производства. Верна ли моя точка зрения? Второй планировщик автоматизирует для меня многое.