Как управлять планировщиком стручков для конкретного узла без изменения постоянного тока? - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть несколько узлов openshift, некоторые узлы имеют некоторые Tesla P40 и должны быть выделены для использования ML через плагин устройства nvidia. Но я не хочу позволять пользователям добавлять некоторые пороки или сходство узлов в их исходные DeploymentConfigs, что может привести к путанице. Как я могу достичь этого безоговорочно?

что я хочу достичь:

  1. на этих узлах могут находиться только блоки ML, имеющие графический процессор
  2. Пользователям ML не нужно менять свой постоянный ток, за исключением ограничения ресурса "nvidia.com/gpu".

если планировщик единственный, то как его написать? Спасибо

1 Ответ

0 голосов
/ 25 апреля 2018

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

  1. Правильно распланируйте рабочие нагрузки графического процессора на узлы с доступными графическими процессорами
  2. Убедитесь, что модули не нужны графические процессоры не запланированы на узлы, которые имеют графические процессоры.

Вы делаете (1) с плагином устройства NVidia, который, кажется,правильный путь, поскольку он использует концепцию Расширенные ресурсы .

Для выполнения (2), Taints и Tolerations действительно рекомендуются.Документы даже явно говорят о случае использования графического процессора - Цитирование документации:

Узлы со специальным оборудованием: В кластере, где небольшое подмножество узловЕсли у вас есть специализированное оборудование (например, графические процессоры), желательно, чтобы блоки, которые не нуждаются в специализированном оборудовании, были удалены от этих узлов, таким образом оставляя место для модулей, которые поступают позже и нуждаются в специальном оборудовании.Это можно сделать, портя узлы, которые имеют специализированное оборудование (например, узлы-имена узлов kubectl special = true: NoSchedule или узлы-имена узлов kubectl special = true: PreferNoSchedule) и добавляя соответствующий допуск для модулей, использующих специальное оборудование.Как и в случае использования выделенных узлов, возможно, проще всего применить допуски с помощью настраиваемого контроллера допуска).Например, рекомендуется использовать Расширенные ресурсы для представления специального оборудования, связать узлы специального оборудования с расширенным именем ресурса и запустить контроллер допуска ExtendedResourceToleration.Теперь, поскольку узлы испорчены, на них не запланированы никакие модули без допусков.Но когда вы отправляете модуль, который запрашивает расширенный ресурс, контроллер допуска ExtendedResourceToleration автоматически добавит в него правильный допуск, и этот модуль будет планировать на специальных аппаратных узлах.Это гарантирует, что эти специальные аппаратные узлы предназначены для модулей, запрашивающих такое оборудование, и вам не нужно вручную добавлять допуски к вашим модулям.

Только те пользователи, которым явно нужны Графическим процессорам нужно добавить допуск для этого в своей спецификации pod, и это довольно просто сделать.Это выглядит так (ref: Advanced Scheduling в Kubernetes ):

tolerations:
- key: "gpu"
  operator: "Equal"
  value: "true"
  effect: "NoSchedule"

Так что обычно это приемлемый компромисс.

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

Контроллер доступа - это фрагмент кода, который перехватывает запросы к серверу API Kubernetes до сохранения объекта, но после запросааутентифицирован и авторизован.

В частности, вам нужен специальный контроллер AdmissionController, известный как MutatingAdmissionWebhook.

Ваш пользовательский MutatingAdmissionWebhook может взглянуть на спецификацию модуля, ищите:

resources:
        limits:
          nvidia.com/gpu: 2

, а затем автоматически добавьте требуемый «Допуск» в спецификацию модуля, и все это, не сообщая об этом пользователю.Вы по-прежнему используете Taints и Tolerations, пользователи просто их больше не видят.Вы не должны написать для этого новый планировщик.

Вот пример того, как написать webhook контроллера доступа,доступно в официальном репозитории kubernetes как часть тестов e2e.

...