Модуль подключает стек 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.
Общий поток (для всех режимов)
- Вы задаёте/меняете
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
Включение
- Выставляете
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
Включение
- Выставляете
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
Включение
- Выставляете:
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-exporter
nvidia.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, делаетkubectl 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), затем делаетkubectl 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.
Мониторинг
DCGM Exporter публикует метрики; в Grafana доступны дашборды с загрузкой GPU и состоянием MIG.