Стадия жизненного цикла модуля: 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)
- Вы задаёте/меняете
spec.gpuв целевой NodeGroup. - Helm разворачивает (или удаляет) компоненты в
d8-nvidia-gpu:- GFD и device plugin — отдельными DaemonSet’ами на каждую GPU NodeGroup;
- NFD master/gc — на master-узлах; NFD worker/DCGM/Exporter — на GPU-узлах.
- Хук модуля обновляет лейблы на узлах:
- добавляет/обновляет
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.
- добавляет/обновляет
- На узле выполняются NodeGroupConfiguration-скрипты (по весам):
gpu-check.sh→gpu-runtime.sh→gpu-sysctl.sh.- при успехе появляется
node.deckhouse.io/gpu-setup-complete=""; - при проблемах/выключении лейбл снимается, runtime drop-in удаляется, sysctl откатывается.
- при успехе появляется
- Дальше стек «самособирается» на узле:
- NFD публикует PCI-лейблы
feature.node.kubernetes.io/pci-*и обслуживает пользовательские feature-файлы; - GFD пишет GPU-фичи в
/etc/kubernetes/node-feature-discovery/features.d, а NFD публикует их какnvidia.com/*; - device plugin публикует ресурсы (в зависимости от режима), DCGM/Exporter начинают отдавать метрики.
- NFD публикует PCI-лейблы
Режим Exclusive (для режима nvidia-operator)
Включение
- Выставляете
spec.gpu.sharing: Exclusive. - Модуль ставит
node.deckhouse.io/device-gpu.config=Exclusiveи (послеnode.deckhouse.io/gpu-setup-complete) поднимает GFD + device plugin. - На узле появляется ресурс
nvidia.com/gpu; каждый Pod получает целый GPU.
Выключение
- Удаляете
spec.gpuиз NodeGroup (или переводите узлы в другую NodeGroup без GPU). - Модуль снимает
node.deckhouse.io/gpuиnode.deckhouse.io/device-gpu.configс узла; NodeGroupConfiguration снимаетnode.deckhouse.io/gpu-setup-completeи откатывает runtime/sysctl. - DaemonSet’ы стека перестают планироваться на узел; NFD GC со временем очищает
nvidia.com/*лейблы.
Режим TimeSlicing (для режима nvidia-operator)
Включение
- Выставляете
spec.gpu.sharing: TimeSlicingи, при необходимости,spec.gpu.timeSlicing.partitionCount(по умолчанию 4). - Модуль ставит
node.deckhouse.io/device-gpu.config=TimeSlicing, а device plugin применяет конфиг с time-slicing. - На узле остаётся ресурс
nvidia.com/gpu, но становится доступно больше «виртуальных» слотов (поpartitionCount).
Выключение
- Переводите режим на
Exclusiveили удаляетеspec.gpuиз NodeGroup. - При переключении режима меняется
node.deckhouse.io/device-gpu.config, и GFD/device plugin подхватывают новый конфиг; при полном выключении GPU действует последовательность как в Exclusive → Выключение.
Режим MIG (для режима nvidia-operator)
Включение
- Выставляете:
spec.gpu.sharing: MIGspec.gpu.mig.partedConfig: <имя профиля>(например,all-1g.5gb)
- Модуль ставит
node.deckhouse.io/device-gpu.config=MIGиnvidia.com/mig.config=<profile>. - После того как GFD/NFD выставят
nvidia.com/mig.capable=true(GPU поддерживает MIG), на узле запускаетсяnvidia-mig-manager(DaemonSet): в штатном режиме он ожидает изменения лейблаnvidia.com/mig.configи запускает переконфигурацию при изменении. - При необходимости изменения конфигурации MIG менеджер:
- выставляет
nvidia.com/mig.config.state=pending; - «паузит» GPU-клиентов, выставляя управляющие лейблы в
paused-for-mig-change:nvidia.com/gpu.deploy.device-pluginnvidia.com/gpu.deploy.gpu-feature-discoverynvidia.com/gpu.deploy.dcgm-exporternvidia.com/gpu.deploy.dcgmnvidia.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), снимает taintmig-reconfigure, делаетuncordon, снимаетupdate.node.deckhouse.io/drained/update.node.deckhouse.io/disruption-approved, возвращаетnvidia.com/gpu.deploy.*вtrueи возвращает узел в работу.
- выставляет
- После применения профиля в кластере появляются ресурсы вида
nvidia.com/mig-<profile>(например,nvidia.com/mig-1g.5gb). - Если Pod
nvidia-mig-managerперезапускается/удаляется, срабатываетpreStop: он ждёт окончания активной операции (файла/processing), затем делаетuncordon, снимает taintmig-reconfigure=true:NoScheduleи аннотацииupdate.node.deckhouse.io/drained/update.node.deckhouse.io/disruption-approved(best-effort, может не успеть при принудительном завершении Pod).
Выключение (MIG → не-MIG или полное выключение GPU)
- Если вы уходите с MIG (в
Exclusive/TimeSlicing) или удаляетеspec.gpu, модуль выставляетnvidia.com/mig.config=all-disabled, чтобы гарантированно откатить MIG на узле. nvidia-mig-managerприменяетall-disabledаналогично включению (taint + drain + операция). Еслиnvidia.com/mig.capableуже отсутствует (например, при выключении GPU/NFD), менеджер всё равно запускается на узле, пока естьnvidia.com/mig.config=all-disabled, чтобы успеть откатить настройки и снять taint.- После успешного отключения MIG (
nvidia.com/mig.config.state=success) скрипт очищаетnvidia.com/mig.configиnvidia.com/mig.config.state, если узел больше не в режиме MIG или GPU на нём выключен — чтобы менеджер не «висел» на узле в ожидании смены лейбла. - Менеджер не запускается на 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