Модуль gpu обеспечивает управление графическими процессорами (Graphics Processing Units, GPU) в Deckhouse Kubernetes Platform (DKP).
Модуль работает в двух взаимоисключающих режимах, которые переключаются параметром dra.enabled:
- режим Dynamic Resource Allocation (DRA) — механизм Kubernetes для запроса и совместного использования устройств, который обеспечивает динамическое и декларативное выделение вычислительных ресурсов GPU;
- режим Device Plugin (по умолчанию) — классическая модель работы с вычислительными ресурсами узла в Kubernetes. В этом режиме модуль публикует ресурсы
nvidia.com/gpuилиnvidia.com/mig-*, которые использует kube-scheduler для планирования размещения подов, использующих эти ресурсы.
Подробнее с описанием модуля можно ознакомиться в соответствующем разделе документации.
Архитектура модуля зависит от режима работы.
Режим DRA
В режиме DRA модуль построен вокруг не зависящего от поставщика оборудования (вендора) ядра и адаптеров для вендоров NVIDIA и MetaX.
Модуль работает со следующими ресурсами:
- DeviceClass — DRA-ресурс, хранящий описание классов устройств, которые могут быть использованы для динамического назначения ресурсов;
- GPUClass — кастомный ресурс, который хранит требования к группе GPU (объём памяти, аппаратные возможности) и политику их использования и совместимости;
- PhysicalGPU — кастомный ресурс, который хранит описание физического GPU, включая характеристики устройства;
- ResourceClaim — DRA-ресурс, который содержит запрос на выделение ресурса для пода и описывает требуемые характеристики и параметры использования;
- ResourceSlice — DRA-ресурс, представляющий выделенную долю или часть ресурса, которая назначается в рамках ResourceClaim.
Архитектура модуля
Для упрощения схемы приняты следующие допущения:
- На схеме показано, что контейнеры разных подов взаимодействуют друг с другом напрямую. Фактически они взаимодействуют через соответствующие сервисы Kubernetes (внутренние балансировщики). Названия сервисов не указываются, если они очевидны из контекста. В остальных случаях название сервиса указано над стрелкой.
- Поды могут быть запущены в нескольких репликах, однако на схеме все поды изображены в одной реплике.
Архитектура модуля gpu в режиме DRA на уровне 2 модели C4 и его взаимодействия с другими компонентами DKP изображены на следующей диаграмме:
Компоненты модуля
Модуль состоит из следующих компонентов:
-
gpu-controller (Deployment) — контроллер, который реализует обработку запросов на GPU-ресурсы и реализует admission-вебхуки для DRA-объектов через механизм Validating/Mutating Admission Controllers. Контроллер работает на master-узлах.
Контроллер gpu-controller выполняет следующие действия:
- создаёт и обновляет DRA-ресурсы DeviceClass на основе кастомных ресурсов PhysicalGPU и GPUClass;
- выполняет валидацию и мутацию запросов на создание и обновление ресурсов Pod, создавая при необходимости ресурсы ResourceClaim;
- отслеживает изменения ресурсов ResourceClaim и на основе этих данных поддерживает состояние и занятость ресурсов PhysicalGPU;
- валидирует ресурсы Pod, GPUClass, ResourceClaim и DeviceClass;
- управляет состоянием PhysicalGPU.
Состоит из следующих контейнеров:
- gpu-controller — основной контейнер;
- kube-rbac-proxy — сайдкар-контейнер с авторизующим прокси на основе Kubernetes RBAC для организации защищённого доступа к основному контейнеру. Kube-rbac-proxy является Open Source-проектом.
-
gpu-node-agent (DaemonSet) — компонент, состоящий из одного контейнера gpu-node-agent, который выполняет следующие действия:
- сканирует файловую систему
/sysхоста и базу идентификаторов PCI; - сопоставляет устройства с ConfigMap
gpu-supported-vendors; - создаёт кастомные ресурсы PhysicalGPU для каждого обнаруженного графического процессора;
- устанавливает лейблы
gpu.deckhouse.io/vendor=<VENDOR>на ресурс Node.
Компонент работает на всех узлах кластера, исключая узлы control plane.
- сканирует файловую систему
-
<VENDOR>-adapter (DaemonSet) — компонент, обеспечивающий работу с оборудованием по подготовке, выделению и освобождению ресурсов GPU. На данный момент поддерживаются два вендора: NVIDIA и MetaX.
Компонент выполняет следующие действия:
- регистрируется в kubelet как DRA-плагин kubelet;
- подготавливает и освобождает выделенные ресурсы для подов через операции
PrepareResourceClaimsиUnprepareResourceClaims; - публикует список доступных устройств через ресурсы ResourceSlice;
- получает аппаратные возможности оборудования;
- разделяет ресурсы GPU и предоставляет их подам;
- обогащает информацией статус в ресурсах PhysicalGPU.
Состоит из следующих контейнеров:
- dra-plugin — сайдкар-контейнер, реализующий DRA-плагин kubelet и обеспечивающий взаимодействие с адаптером вендора;
- <VENDOR>-adapter — сайдкар-контейнер, зависящий от вендора и выполняющий взаимодействие с оборудованием на узле;
- kube-rbac-proxy — сайдкар-контейнер с авторизующим прокси на основе Kubernetes RBAC для организации защищённого доступа к контейнеру dra-plugin.
Компонент запускается на всех узлах кластера, у которых есть лейбл
gpu.deckhouse.io/vendor=<VENDOR>. -
gpu-dcgm (DaemonSet) — компонент, состоящий из одного контейнера dcgm, который запускает Data Center GPU Manager (DCGM). DCGM собирает данные о состоянии и использовании GPU (сведения об ошибках (Error Correction Code, ECC), мощность, утилизация). Работает только с графическими процессорами NVIDIA.
-
gpu-dcgm-exporter (DaemonSet) — компонент, состоящий из одного контейнера dcgm-exporter, который получает метрики GPU из компонента gpu-dcgm и отдаёт их в Prometheus-формате.
-
vfio-switch-<NODE_NAME>-<PCI> (Job) — компонент, состоящий из одного контейнера switch, который переключает используемый драйвер с
nvidiaнаvfio-pciи наоборот. Создаётся компонентом nvidia-adapter для контроля процесса переключения.
Взаимодействия модуля
Модуль взаимодействует со следующими компонентами:
-
Kube-apiserver:
- авторизация запросов на получение метрик;
- работа с кастомными ресурсами PhysicalGPU и GPUClass;
- обновление ресурсов Node;
- валидация ресурсов Pod, GPUClass, ResourceClaim и DeviceClass;
- работа с ресурсами DeviceClass, ResourceClaim и ResourceSlice;
- создание и контроль выполнения Job
vfio-switch-<NODE_NAME>-<PCI>.
-
Kubelet — регистрация в kubelet как DRA-плагин kubelet.
С модулем взаимодействуют следующие внешние компоненты:
-
Kubelet — вызов gRPC-методов
PrepareResourceClaimsиUnprepareResourceClaims. -
Kube-apiserver — валидация ресурсов Pod, GPUClass, ResourceClaim и DeviceClass.
-
Prometheus-main — сбор метрик с компонентов gpu-dcgm и <VENDOR>-adapter.
Режим Device Plugin
В режиме Device Plugin модуль состоит из компонентов, работающих только с адаптерами NVIDIA.
Модуль взаимодействует со следующими ресурсами:
- NodeFeature — хранит фактическую информацию об аппаратных возможностях конкретного узла;
- NodeFeatureRule — хранит набор правил, на основе которого модуль настраивает лейблы, аннотации и taints для узла кластера.
Архитектура модуля
Архитектура модуля gpu в режиме Device Plugin на уровне 2 модели C4 и его взаимодействия с другими компонентами DKP изображены на следующей диаграмме:
Компоненты модуля
Модуль состоит из следующих компонентов:
-
node-feature-discovery-master (Deployment) — компонент, состоящий из одного контейнера master, который собирает информацию об аппаратных возможностях узлов из ресурсов NodeFeature и публикует их как лейблы
feature.node.kubernetes.io/*иnvidia.com/*соответствующих узлов. Правила назначения лейблов, taints и аннотаций master получает из ресурсов NodeFeatureRule. -
node-feature-discovery-worker (DaemonSet) — компонент, состоящий из одного контейнера worker, который запускается на каждом GPU-узле, обнаруживает подключённые PCI- и USB-устройства и публикует информацию о них в виде ресурсов NodeFeature. В этих же ресурсах публикуется информация, полученная от компонента gpu-feature-discovery-<NG>.
-
node-feature-discovery-gc (Deployment) — компонент, состоящий из одного контейнера gc, который удаляет устаревшие ресурсы NodeFeature в случае удаления узла.
-
gpu-feature-discovery-<NG> (DaemonSet) — компонент опрашивает GPU-драйвер через NVIDIA Management Library (NVML) и записывает информацию об аппаратных возможностях GPU в файл
/etc/kubernetes/node-feature-discovery/features.d/gfd. Node-feature-discovery-worker публикует информацию в виде ресурсов NodeFeature, из которых node-feature-discovery-master обновляет соответствующие лейблыnvidia.com/*для узлов кластера.Компонент создаётся Deckhouse-контроллером модуля
deckhouseдля каждой NodeGroup (NG), в конфигурации которой указан параметр.spec.gpu.Состоит из следующих контейнеров:
- gpu-feature-discovery-init — init-контейнер, подготавливающий конфигурацию для основного контейнера gpu-feature-discovery-ctr;
- gpu-feature-discovery-ctr — основной контейнер;
- gpu-feature-discovery-sidecar — сайдкар-контейнер, который отслеживает изменения в конфигурации и перезапускает основной контейнер для применения изменений.
-
nvidia-device-plugin-<NG> (DaemonSet) — компонент регистрируется в kubelet через Kubernetes Device Plugin API и публикует GPU-ресурсы для kube-scheduler.
Для работы с ресурсами kubelet вызывает gRPC-методы
ListAndWatch,AllocateиGetPreferredAllocationу nvidia-device-plugin-ctr. После этого компонент обновляет количество доступных ресурсов на узле и отдаёт эту информацию через kubelet.Состоит из следующих контейнеров:
- nvidia-device-plugin-init — init-контейнер, подготавливающий конфигурацию для основного контейнера nvidia-device-plugin-ctr;
- nvidia-device-plugin-ctr — основной контейнер;
- nvidia-device-plugin-sidecar — сайдкар-контейнер, который отслеживает изменения в конфигурации и перезапускает основной контейнер для применения изменений.
-
nvidia-mig-manager (DaemonSet) — опциональный компонент, который управляет изменением профиля Multi-Instance GPU (MIG) на узлах с графическими процессорами A100 и H100.
Компонент выполняет следующие действия:
- получает желаемый MIG-профиль (лейбл
nvidia.com/mig.config) и текущее состояние; - переводит узел в режим обслуживания (выставляет taint, cordon или drain) при необходимости;
- останавливает поды, использующие GPU на узле;
- применяет MIG-профиль;
- инициирует перезагрузку узла при необходимости;
- возвращает узел в работу.
Состоит из следующих контейнеров:
- nvidia-mig-manager-init — init-контейнер, подготавливающий исполняемые файлы и библиотеки;
- nvidia-mig-manager — основной контейнер.
- получает желаемый MIG-профиль (лейбл
-
nvidia-dcgm (DaemonSet) — компонент, состоящий из одного контейнера nvidia-dcgm, который запускает Data Center GPU Manager (DCGM). DCGM собирает данные о состоянии и использовании GPU (сведения об ошибках (Error Correction Code, ECC), мощность, утилизация).
-
nvidia-dcgm-exporter (DaemonSet) — компонент, состоящий из одного контейнера exporter, который получает метрики GPU из компонента nvidia-dcgm и отдаёт их в Prometheus-формате.
Взаимодействия модуля
Модуль взаимодействует со следующими компонентами:
-
Kube-apiserver:
- авторизация запросов на получение метрик;
- работа с ресурсами NodeFeature и NodeFeatureRule;
- отслеживание и обновление ресурсов Node;
- завершение подов, использующих GPU-ресурсы, при изменении MIG-профиля.
-
Kubelet — регистрация через Device Plugin API.
С модулем взаимодействуют следующие внешние компоненты:
-
Kubelet — вызов gRPC-методов
ListAndWatch,AllocateиGetPreferredAllocation. -
Prometheus-main — сбор метрик nvidia-dcgm.