Стадия жизненного цикла модуля: General Availability
У модуля есть требования для установки

Модуль работает в двух режимах в зависимости от значения параметра dra.enabled конфигурации модуля: режим Device Plugin (основной) и DRA-режим (экспериментальный).

Режим Device Plugin

В этом режиме параметр dra.enabled установлен в false (значение по умолчанию).

В режиме Device Plugin, в неймспейсе d8-nvidia-gpu разворачивается следующий набор компонентов:

Компонент Тип Назначение
node-feature-discovery-master Deployment Собирает лейблы аппаратных возможностей от воркеров и публикует их как лейблы узла (feature.node.kubernetes.io/*, nvidia.com/*).
node-feature-discovery-gc Deployment Удаляет устаревшие NFD-лейблы с удалённых узлов.
node-feature-discovery-worker DaemonSet Запускается на каждом GPU-узле, обнаруживает PCI/USB-устройства и записывает feature-файлы для NFD master.
gpu-feature-discovery-<ng> DaemonSet Per-NodeGroup GFD: опрашивает GPU-драйвер через NVML, записывает подробные feature-файлы, которые NFD master публикует как nvidia.com/gpu.count, nvidia.com/mig.capable и т.д.
nvidia-device-plugin-<ng> DaemonSet Per-NodeGroup device plugin: публикует ресурсы nvidia.com/gpu (Exclusive/TimeSlicing) или nvidia.com/mig-<profile> (MIG) для планировщика Kubernetes.
nvidia-mig-manager DaemonSet Управляет переконфигурацией MIG на узлах с A100/H100: выполняет drain узла, применяет MIG-профиль, при необходимости перезагружает, возвращает узел в работу.
nvidia-dcgm DaemonSet Демон NVIDIA DCGM: собирает сырую телеметрию GPU (здоровье, ECC, мощность, утилизация).
nvidia-dcgm-exporter DaemonSet Преобразует метрики DCGM в формат Prometheus; метрики собирает кластерный Prometheus.

DRA-режим

В этом режиме параметр dra.enabled установлен в true.

DRA-режим является экспериментальным. Не включайте его в production-кластерах.

В режиме DRA, в неймспейсе d8-nvidia-gpu разворачивается следующий набор компонентов:

Компонент Тип Назначение
gpu-controller Deployment Центральный DRA-контроллер: реализует Kubernetes API ResourceClaim / ResourceSlice, управляет аллокацией GPU в кластере, запускает admission-вебхуки для DRA-объектов. Работает с поддержкой HA (до 3 реплик).
gpu-node-agent DaemonSet Запускается на каждом управляемом узле с обнаруженными поддерживаемыми GPU.
nvidia-adapter DaemonSet Запускается на каждом управляемом узле с обнаруженными поддерживаемыми GPU.
gpu-dcgm DaemonSet Демон DCGM (та же роль, что и в режиме Device Plugin, интегрирован в DRA-стек).
gpu-dcgm-exporter DaemonSet Prometheus-экспортёр метрик DCGM (та же роль, что и в режиме Device Plugin).

Общая инфраструктура (для обоих режимов)

Компонент Namespace Назначение
NodeGroupConfiguration-скрипты (режим Device Plugin) узел gpu-check.sh проверяет драйвер; gpu-runtime.sh настраивает containerd с default_runtime=nvidia; gpu-sysctl.sh применяет параметры ядра и выставляет node.deckhouse.io/gpu-setup-complete по готовности.
NodeGroupConfiguration-скрипты (DRA) узел gpu-setup.sh проверяет драйвер и VFIO-готовность, выставляет node.deckhouse.io/gpu-setup-complete; gpu-dra-feature-gates.sh патчит манифесты static подов control plane для включения feature gate DynamicResourceAllocation; gpu-vfio.sh загружает VFIO-модули ядра и выставляет node.deckhouse.io/gpu-vfio-ready; gpu-vfio-iommu.yaml настраивает параметры ядра для IOMMU.
CRD physicalgpus.gpu.deckhouse.io кластер DRA-режим: представляет физический GPU, обнаруженный gpu-node-agent; используется gpu-controller для принятия решений о распределении GPU.

Как это работает

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

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

  • 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 (режим Device Plugin) или gpu-setup.sh (DRA) после локальных проверок/настроек; пока лейбла нет, компоненты стека на узел не планируются (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 во время переконфигурации.
  • node.deckhouse.io/gpu-vfio-ready="" — выставляет gpu-vfio.sh (DRA-режим), когда VFIO-модули ядра загружены и доступны IOMMU-группы; служит гейтом готовности для рабочих нагрузок с GPU passthrough через VFIO.
  • 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.

Общий поток (для режима nvidia-operator)

  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 (для режима nvidia-operator)

Включение

  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 (для режима nvidia-operator)

Включение

  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 (для режима nvidia-operator)

Включение

  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, делает uncordon, снимает update.node.deckhouse.io/drained/update.node.deckhouse.io/disruption-approved, возвращает nvidia.com/gpu.deploy.* в true и возвращает узел в работу.
  5. После применения профиля в кластере появляются ресурсы вида nvidia.com/mig-<profile> (например, nvidia.com/mig-1g.5gb).
  6. Если Pod nvidia-mig-manager перезапускается/удаляется, срабатывает preStop: он ждёт окончания активной операции (файла /processing), затем делает 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.

DRA-режим: feature gates control plane

При включении dra.enabled: true NodeGroupConfiguration-скрипт gpu-dra-feature-gates.sh запускается на всех узлах и патчит манифесты static подов kube-scheduler и kube-apiserver, добавляя --feature-gates=DynamicResourceAllocation=true. Операция идемпотентна и учитывает версию Kubernetes (скрипт читает kubernetesVersion из конфигурации кластера и включает только те feature gates, которые требуются для данной версии).

Скрипт изменяет /etc/kubernetes/manifests/kube-scheduler.yaml и аналогичные манифесты control plane непосредственно на узле. После изменения манифестов kubelet автоматически перезапускает kube-scheduler и kube-apiserver. Это происходит один раз при первом включении DRA-режима.

DRA-режим: поддержка VFIO

В DRA-режиме два дополнительных NodeGroupConfiguration-скрипта подготавливают узлы для GPU passthrough через VFIO:

  • gpu-vfio.sh — загружает модули ядра vfio и vfio_iommu_type1, выставляет лейбл node.deckhouse.io/gpu-vfio-ready="" при наличии IOMMU-групп.
  • gpu-vfio-iommu.yaml — настраивает параметры ядра для IOMMU.

Полноценный GPU passthrough требует включения IOMMU в BIOS и в параметрах командной строки ядра (например, intel_iommu=on или amd_iommu=on). Это изменение требует перезагрузки узла. Без IOMMU модули VFIO загружаются, но лейбл gpu-vfio-ready не выставляется и passthrough-нагрузки не допускаются.

DRA-режим: pre-delete hook

При отключении или удалении модуля при активном dra.enabled: true Helm запускает Job через хук pre-delete в неймспейсе d8-nvidia-gpu. Job удаляет все кастомные ресурсы physicalgpus.gpu.deckhouse.io в кластере и ждёт их полного удаления до 600 с. Это гарантирует, что финализаторы gpu-controller будут сняты до удаления самого CRD.

Если Job зависает по таймауту (например, завис финализатор), проверьте оставшиеся объекты PhysicalGPU:

d8 k get physicalgpus -A