В модуле virtualization используются компоненты, реализующие следующие вспомогательные функции:

  • аудит событий безопасности;
  • проброс USB-устройств в виртуальные машины;
  • обновление сетевых маршрутов;
  • удаление ресурсов перед деактивацией модуля virtualization.

Аудит событий безопасности

С инструкцией по активации аудита событий безопасности модуля virtualization можно ознакомиться в документации модуля.

Архитектура

Для упрощения схемы приняты следующие допущения:

  • На схеме контейнеры разных подов показаны как взаимодействующие напрямую. Фактически обмен выполняется через соответствующие сервисы Kubernetes (внутренние балансировщики). Названия сервисов не указываются, если они очевидны из контекста. В остальных случаях название сервиса приводится над стрелкой.
  • Поды могут быть запущены в нескольких репликах, однако на схеме каждый под показан в единственном экземпляре.

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

Архитектура компонента virtualization-audit модуля virtualization

Компоненты

Virtualization-audit — компонент, состоящий из одного контейнера и принимающий поток событий безопасности модуля virtualization. Отправка событий реализована с использованием модуля log-shipper. Агент логирования vector согласно настройкам в кастомных ресурсах ClusterLoggingConfig отбирает из аудит-лога кластера события, связанные с кастомными ресурсами модуля virtualization, и отправляет их на эндпоинт сервиса virtualization-audit. Virtualization-audit обрабатывает полученные audit-события, обогащает их данными из Kubernetes API и сохраняет обработанные события в собственный лог.

Можно перенаправить события безопасности в систему логирования кластера (например, Loki). В этом случае аналогичным образом используются ресурсы ClusterLoggingConfig и агент vector модуля log-shipper.

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

Virtualization-audit взаимодействует со следующими компонентами:

  1. Kube-apiserver — следит за изменениями кастомных ресурсов модуля virtualization.

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

  1. Log-shipper-agent:

    • отправляет события безопасности модуля virtualization;
    • собирает обработанные аудит-логи.

Virtualization-dra и прочие компоненты

Архитектура

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

Архитектура прочих вспомогательных компонентов модуля virtualization

Компоненты

  1. Virtualization-dra (DaemonSet) — драйвер DRA, с помощью которого реализуется проброс USB-устройств в виртуальные машины. Для проброса USB-устройств используется технология DRA (Dynamic Resource Allocation). DRA — это механизм Kubernetes API, scheduler и kubelet для описания, планирования и подготовки динамически выделяемых ресурсов через внешние драйверы. Драйвер DRA выполняет следующие операции:

    • автоматически обнаруживает USB-устройства на узлах кластера и публикует их как ресурс ResourceSlice. virtualization-controller синхронизирует эти данные в кастомные ресурсы NodeUSBDevice, которые дальше используются для настройки проброса USB-устройств. Подробнее с настройкой проброса USB-устройств можно ознакомиться в документации модуля;

    • регистрируется в kubelet как DRA kubelet plugin. DRA kubelet plugin подготавливает и освобождает выделенные ресурсы для подов через операции PrepareResourceClaims и UnprepareResourceClaims. Метод PrepareResourceClaims возвращает ID устройств CDI (Container Device Interface), которые kubelet передаёт в containerd. Данные о доступных USB-устройствах публикуются через ResourceSlice, а выбор устройств выполняется механизмом Kubernetes DRA на основе ResourceClaim/ResourceClaimTemplate и DeviceClass.

      DRA-драйвер взаимодействует с kubelet по протоколу gRPC через Unix-сокеты.

    • реализует USBIP-сервер, благодаря чему USB-устройство автоматически по сети пробрасывается на узел, где запущена виртуальная машина. Нет необходимости вручную размещать ВМ на том же узле, где находится устройство.

    Состоит из следующих контейнеров:

    • init-load — init-контейнер, загружающий модули ядра Linux, необходимые для работы DRA-драйвера;
    • virtualization-dra — основной контейнер.
  2. Vm-route-forge — контроллер, следящий за кастомными ресурсами VirtualMachine API-группы virtualization.deckhouse.io и обновляющий сетевые маршруты на узле через Linux netlink/eBPF в таблицах маршрутизации, используемых CNI Cilium для маршрутизации трафика между ВМ.

  3. Pre-delete-hook (Job) — задача, запускаемая контроллером Deckhouse перед удалением модуля virtualization. Она удаляет кастомные ресурсы InternalVirtualizationKubeVirt и InternalVirtualizationCDI с именем config.

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

Virtualization-dra взаимодействует со следующими компонентами:

  1. Kubelet — регистрируется в kubelet как DRA kubelet plugin.

Vm-route-forge взаимодействует со следующими компонентами:

  1. Kube-apiserver — получает события по ресурсам VirtualMachine, CiliumNode и Node.
  2. Сеть хоста/ядро Linux — обновляет маршруты и правила маршрутизации на узле.
  3. Cilium data plane — использует данные CiliumNode и таблиц маршрутизации Cilium для маршрутизации трафика ВМ.

Pre-delete-hook взаимодействует со следующими компонентами:

  1. Kube-apiserver — удаляет ресурсы InternalVirtualizationKubeVirt и InternalVirtualizationCDI с именем config.

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

  1. Kubelet — вызывает gRPC-методы PrepareResourceClaims и UnprepareResourceClaims для подготовки и освобождения ресурсов, связанных с USB-устройствами.

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