Модуль 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 в режиме DRA

Компоненты модуля

Модуль состоит из следующих компонентов:

  1. 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-проектом.
  2. gpu-node-agent (DaemonSet) — компонент, состоящий из одного контейнера gpu-node-agent, который выполняет следующие действия:

    • сканирует файловую систему /sys хоста и базу идентификаторов PCI;
    • сопоставляет устройства с ConfigMap gpu-supported-vendors;
    • создаёт кастомные ресурсы PhysicalGPU для каждого обнаруженного графического процессора;
    • устанавливает лейблы gpu.deckhouse.io/vendor=<VENDOR> на ресурс Node.

    Компонент работает на всех узлах кластера, исключая узлы control plane.

  3. <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>.

  4. gpu-dcgm (DaemonSet) — компонент, состоящий из одного контейнера dcgm, который запускает Data Center GPU Manager (DCGM). DCGM собирает данные о состоянии и использовании GPU (сведения об ошибках (Error Correction Code, ECC), мощность, утилизация). Работает только с графическими процессорами NVIDIA.

  5. gpu-dcgm-exporter (DaemonSet) — компонент, состоящий из одного контейнера dcgm-exporter, который получает метрики GPU из компонента gpu-dcgm и отдаёт их в Prometheus-формате.

  6. vfio-switch-<NODE_NAME>-<PCI> (Job) — компонент, состоящий из одного контейнера switch, который переключает используемый драйвер с nvidia на vfio-pci и наоборот. Создаётся компонентом nvidia-adapter для контроля процесса переключения.

Взаимодействия модуля

Модуль взаимодействует со следующими компонентами:

  1. Kube-apiserver:

    • авторизация запросов на получение метрик;
    • работа с кастомными ресурсами PhysicalGPU и GPUClass;
    • обновление ресурсов Node;
    • валидация ресурсов Pod, GPUClass, ResourceClaim и DeviceClass;
    • работа с ресурсами DeviceClass, ResourceClaim и ResourceSlice;
    • создание и контроль выполнения Job vfio-switch-<NODE_NAME>-<PCI>.
  2. Kubelet — регистрация в kubelet как DRA-плагин kubelet.

С модулем взаимодействуют следующие внешние компоненты:

  1. Kubelet — вызов gRPC-методов PrepareResourceClaims и UnprepareResourceClaims.

  2. Kube-apiserver — валидация ресурсов Pod, GPUClass, ResourceClaim и DeviceClass.

  3. Prometheus-main — сбор метрик с компонентов gpu-dcgm и <VENDOR>-adapter.

Режим Device Plugin

В режиме Device Plugin модуль состоит из компонентов, работающих только с адаптерами NVIDIA.

Модуль взаимодействует со следующими ресурсами:

  • NodeFeature — хранит фактическую информацию об аппаратных возможностях конкретного узла;
  • NodeFeatureRule — хранит набор правил, на основе которого модуль настраивает лейблы, аннотации и taints для узла кластера.

Архитектура модуля

Архитектура модуля gpu в режиме Device Plugin на уровне 2 модели C4 и его взаимодействия с другими компонентами DKP изображены на следующей диаграмме:

Архитектура модуля gpu в режиме Device Plugin

Компоненты модуля

Модуль состоит из следующих компонентов:

  1. node-feature-discovery-master (Deployment) — компонент, состоящий из одного контейнера master, который собирает информацию об аппаратных возможностях узлов из ресурсов NodeFeature и публикует их как лейблы feature.node.kubernetes.io/* и nvidia.com/* соответствующих узлов. Правила назначения лейблов, taints и аннотаций master получает из ресурсов NodeFeatureRule.

  2. node-feature-discovery-worker (DaemonSet) — компонент, состоящий из одного контейнера worker, который запускается на каждом GPU-узле, обнаруживает подключённые PCI- и USB-устройства и публикует информацию о них в виде ресурсов NodeFeature. В этих же ресурсах публикуется информация, полученная от компонента gpu-feature-discovery-<NG>.

  3. node-feature-discovery-gc (Deployment) — компонент, состоящий из одного контейнера gc, который удаляет устаревшие ресурсы NodeFeature в случае удаления узла.

  4. 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 — сайдкар-контейнер, который отслеживает изменения в конфигурации и перезапускает основной контейнер для применения изменений.
  5. 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 — сайдкар-контейнер, который отслеживает изменения в конфигурации и перезапускает основной контейнер для применения изменений.
  6. 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 — основной контейнер.
  7. nvidia-dcgm (DaemonSet) — компонент, состоящий из одного контейнера nvidia-dcgm, который запускает Data Center GPU Manager (DCGM). DCGM собирает данные о состоянии и использовании GPU (сведения об ошибках (Error Correction Code, ECC), мощность, утилизация).

  8. nvidia-dcgm-exporter (DaemonSet) — компонент, состоящий из одного контейнера exporter, который получает метрики GPU из компонента nvidia-dcgm и отдаёт их в Prometheus-формате.

Взаимодействия модуля

Модуль взаимодействует со следующими компонентами:

  1. Kube-apiserver:

    • авторизация запросов на получение метрик;
    • работа с ресурсами NodeFeature и NodeFeatureRule;
    • отслеживание и обновление ресурсов Node;
    • завершение подов, использующих GPU-ресурсы, при изменении MIG-профиля.
  2. Kubelet — регистрация через Device Plugin API.

С модулем взаимодействуют следующие внешние компоненты:

  1. Kubelet — вызов gRPC-методов ListAndWatch, Allocate и GetPreferredAllocation.

  2. Prometheus-main — сбор метрик nvidia-dcgm.

Дополнительные ресурсы