Модуль подключает стек NVIDIA для выполнения GPU-нагрузок в Deckhouse Kubernetes Platform: NFD/GFD, device plugin (Exclusive/TimeSlicing/MIG), менеджер MIG и мониторинг DCGM/Exporter с дашбордами Grafana.

Требования

  • На целевых узлах установлены драйвер NVIDIA и NVIDIA Container Toolkit (containerd/runtime настраивает этот модуль через NodeGroupConfiguration).
  • В NodeGroup заданы параметры spec.gpu (режимы: Exclusive, TimeSlicing или MIG).

Что разворачивает модуль

  • Node Feature Discovery (NFD) и GPU Feature Discovery (GFD) для меток GPU.
  • NVIDIA device plugin с режимами Exclusive/TimeSlicing/MIG.
  • Менеджер MIG и конфигурации для GPU с поддержкой MIG.
  • DCGM Exporter и готовые дашборды Grafana по состоянию GPU.

Как включить

Опишите параметры GPU в нужной NodeGroup — модуль проставит метки и развернёт компоненты в d8-nvidia-gpu:

apiVersion: deckhouse.io/v1
kind: NodeGroup
metadata:
  name: gpu
spec:
  cri: Containerd
  gpu:
    sharing: MIG # или Exclusive / TimeSlicing
    mig:
      partedConfig: all-1g.5gb

Как это работает (пошагово)

Ниже — последовательность действий и ключевые метки/taint’ы, которые участвуют в работе модуля.

Ключевые метки (кто ставит и зачем)

  • node.deckhouse.io/gpu="" — ставит хук модуля на узлах GPU NodeGroup; вместе с node.deckhouse.io/gpu-setup-complete="" участвует в планировании «общих» DaemonSet’ов стека (NFD worker, DCGM/Exporter и т.п.).
  • node.deckhouse.io/device-gpu.config=<Exclusive|TimeSlicing|MIG> — ставит хук; по ней config-manager в GFD и device plugin выбирает нужную конфигурацию.
  • node.deckhouse.io/gpu-setup-complete="" — выставляет gpu-sysctl.sh (NodeGroupConfiguration) после локальных проверок/настроек; пока метки нет, компоненты стека на узел не планируются (NFD worker, GFD, device plugin, DCGM/Exporter).
  • feature.node.kubernetes.io/pci-*.present=true — публикует NFD; по ним (и по принадлежности к NodeGroup) планируется GFD на узлы с NVIDIA PCI-устройствами.
  • nvidia.com/* (например, nvidia.com/gpu.count, nvidia.com/mig.capable=true|false) — публикует NFD из feature-файлов, которые генерирует GFD (NFD master разрешён писать в nvidia.com). Лейбл nvidia.com/gpu.count>0 участвует в планировании device plugin.
  • nvidia.com/mig.config=<profile|all-disabled> — ставит хук: желаемый MIG-профиль (например, all-1g.5gb) или all-disabled для отката/выключения MIG.
  • nvidia.com/mig.config.state=<pending|rebooting|success|failed> — ставит nvidia-mig-manager во время переконфигурации.
  • taint mig-reconfigure=true:NoSchedule — ставит/снимает nvidia-mig-manager на время операции.
  • аннотации update.node.deckhouse.io/disruption-approved, update.node.deckhouse.io/draining, update.node.deckhouse.io/drained — используются для согласованного drain узла во время MIG.

Общий поток (для всех режимов)

  1. Вы задаёте/меняете spec.gpu в целевой NodeGroup.
  2. Helm разворачивает (или удаляет) компоненты в d8-nvidia-gpu:
    • GFD и device plugin — отдельными DaemonSet’ами на каждую GPU NodeGroup;
    • NFD master/gc — на master-узлах; NFD worker/DCGM/Exporter — на GPU-узлах.
  3. Хук модуля обновляет метки на узлах:
    • добавляет/обновляет node.deckhouse.io/gpu="" и node.deckhouse.io/device-gpu.config=...;
    • для режима MIG добавляет/обновляет nvidia.com/mig.config=...;
    • при выключении GPU снимает node.deckhouse.io/gpu и node.deckhouse.io/device-gpu.config; если на узле был nvidia.com/mig.config, переводит его в all-disabled, чтобы инициировать откат MIG.
  4. На узле выполняются NodeGroupConfiguration-скрипты (по весам): gpu-check.shgpu-runtime.shgpu-sysctl.sh.
    • при успехе появляется node.deckhouse.io/gpu-setup-complete="";
    • при проблемах/выключении метка снимается, runtime drop-in удаляется, sysctl откатывается.
  5. Дальше стек «самособирается» на узле:
    • NFD публикует PCI-лейблы feature.node.kubernetes.io/pci-* и обслуживает пользовательские feature-файлы;
    • GFD пишет GPU-фичи в /etc/kubernetes/node-feature-discovery/features.d, а NFD публикует их как nvidia.com/*;
    • device plugin публикует ресурсы (в зависимости от режима), DCGM/Exporter начинают отдавать метрики.

Режим Exclusive

Включение

  1. Выставляете spec.gpu.sharing: Exclusive.
  2. Модуль ставит node.deckhouse.io/device-gpu.config=Exclusive и (после node.deckhouse.io/gpu-setup-complete) поднимает GFD + device plugin.
  3. На узле появляется ресурс nvidia.com/gpu; каждый Pod получает целый GPU.

Выключение

  1. Удаляете spec.gpu из NodeGroup (или переводите узлы в другую NodeGroup без GPU).
  2. Модуль снимает node.deckhouse.io/gpu и node.deckhouse.io/device-gpu.config с узла; NodeGroupConfiguration снимает node.deckhouse.io/gpu-setup-complete и откатывает runtime/sysctl.
  3. DaemonSet’ы стека перестают планироваться на узел; NFD GC со временем очищает nvidia.com/* лейблы.

Режим TimeSlicing

Включение

  1. Выставляете spec.gpu.sharing: TimeSlicing и, при необходимости, spec.gpu.timeSlicing.partitionCount (по умолчанию 4).
  2. Модуль ставит node.deckhouse.io/device-gpu.config=TimeSlicing, а device plugin применяет конфиг с time-slicing.
  3. На узле остаётся ресурс nvidia.com/gpu, но становится доступно больше «виртуальных» слотов (по partitionCount).

Выключение

  1. Переводите режим на Exclusive или удаляете spec.gpu из NodeGroup.
  2. При переключении режима меняется node.deckhouse.io/device-gpu.config, и GFD/device plugin подхватывают новый конфиг; при полном выключении GPU действует последовательность как в Exclusive → Выключение.

Режим MIG

Включение

  1. Выставляете:
    • spec.gpu.sharing: MIG
    • spec.gpu.mig.partedConfig: <имя профиля> (например, all-1g.5gb)
  2. Модуль ставит node.deckhouse.io/device-gpu.config=MIG и nvidia.com/mig.config=<profile>.
  3. После того как GFD/NFD выставят nvidia.com/mig.capable=true (GPU поддерживает MIG), на узле запускается nvidia-mig-manager (DaemonSet): в штатном режиме он ожидает изменения лейбла nvidia.com/mig.config и запускает переконфигурацию при изменении.
  4. При необходимости изменения конфигурации MIG менеджер:
    • выставляет nvidia.com/mig.config.state=pending;
    • «паузит» GPU-клиентов, выставляя управляющие лейблы в paused-for-mig-change:
      • nvidia.com/gpu.deploy.device-plugin
      • nvidia.com/gpu.deploy.gpu-feature-discovery
      • nvidia.com/gpu.deploy.dcgm-exporter
    • nvidia.com/gpu.deploy.dcgm
    • nvidia.com/gpu.deploy.nvsm
  • ставит taint mig-reconfigure=true:NoSchedule;
  • ждёт «разрешение на disruptive-операции» через update.node.deckhouse.io/disruption-approved (или уже начатый drain через update.node.deckhouse.io/draining/update.node.deckhouse.io/drained), затем выставляет update.node.deckhouse.io/draining=bashible и ждёт update.node.deckhouse.io/drained;
  • удаляет (и дожидается остановки) поды GPU-клиентов на узле: device plugin, GFD, DCGM Exporter, DCGM, а также валидаторы (cuda/plugin);
  • применяет MIG-профиль и, если нужно, переводит nvidia.com/mig.config.state в rebooting и перезагружает узел;
  • по завершению выставляет nvidia.com/mig.config.state=success (или failed), снимает taint mig-reconfigure, делает kubectl uncordon, снимает update.node.deckhouse.io/drained/update.node.deckhouse.io/disruption-approved, возвращает nvidia.com/gpu.deploy.* в true и возвращает узел в работу.
  1. После применения профиля в кластере появляются ресурсы вида nvidia.com/mig-<profile> (например, nvidia.com/mig-1g.5gb).
  2. Если Pod nvidia-mig-manager перезапускается/удаляется, срабатывает preStop: он ждёт окончания активной операции (файла /processing), затем делает kubectl uncordon, снимает taint mig-reconfigure=true:NoSchedule и аннотации update.node.deckhouse.io/drained/update.node.deckhouse.io/disruption-approved (best-effort, может не успеть при принудительном завершении Pod).

Выключение (MIG → не-MIG или полное выключение GPU)

  1. Если вы уходите с MIG (в Exclusive/TimeSlicing) или удаляете spec.gpu, модуль выставляет nvidia.com/mig.config=all-disabled, чтобы гарантированно откатить MIG на узле.
  2. nvidia-mig-manager применяет all-disabled аналогично включению (taint + drain + операция). Если nvidia.com/mig.capable уже отсутствует (например, при выключении GPU/NFD), менеджер всё равно запускается на узле, пока есть nvidia.com/mig.config=all-disabled, чтобы успеть откатить настройки и снять taint.
  3. После успешного отключения MIG (nvidia.com/mig.config.state=success) скрипт очищает nvidia.com/mig.config и nvidia.com/mig.config.state, если узел больше не в режиме MIG или GPU на нём выключен — чтобы менеджер не «висел» на узле в ожидании смены лейбла.
  4. Менеджер не запускается на GPU без поддержки MIG (nvidia.com/mig.capable=false); для таких узлов используйте Exclusive или TimeSlicing.

Мониторинг

DCGM Exporter публикует метрики; в Grafana доступны дашборды с загрузкой GPU и состоянием MIG.