Модуль sdn предоставляет функции программно-определяемых сетей (SDN, Software Defined Networking) в Deckhouse Platform (DP):

  • настройку сетевых интерфейсов на узлах;
  • дополнительные сети для подов и виртуальных машин;
  • IPAM (IP Address Management) для дополнительных сетей. Механизм IPAM позволяет выделять IPv4-адреса из пулов и назначать их на дополнительные сетевые интерфейсы подов, подключаемых к кластерным сетям (ClusterNetwork) и сетям проекта (Network);
  • underlay-сети для проброса аппаратных сетевых устройств;
  • системные сети для служебного трафика на узлах.

Модуль работает со следующими кастомными ресурсами API-группы network.deckhouse.io:

  • ClusterIPAddress — представляет запрос на IPv4-адрес в масштабе всего кластера, для сетевого интерфейса, подключённого к ClusterNetwork или SystemNetwork;
  • ClusterIPAddressPool — определяет пул IPv4-адресов в масштабе кластера, используемый для IPAM в кластерных сетях;
  • ClusterNetwork — определяет общедоступную сеть в масштабе всего кластера;
  • IPAddress — представляет запрос на IPv4-адрес для дополнительного сетевого интерфейса пода, подключённого к сети проекта;
  • IPAddressLease — запись резервирования выделенного IP-адреса, предотвращающая его повторное присвоение;
  • IPAddressPool — определяет пул IPv4-адресов в рамках пользовательского неймспейса, используемый для IPAM в сети проекта;
  • Network — namespaced-ресурс, создаёт выделенную сеть проекта на основе класса сети, заданного администратором в ресурсе NetworkClass;
  • NetworkClass — задаёт диапазон VLAN-тегов и узловые сетевые интерфейсы, на основе которых пользователи могут создавать собственные ресурсы Network;
  • NodeNetworkInterface — описывает сетевой интерфейс на узле, используется как для обнаружения существующих интерфейсов, так и для создания новых (VLAN, Bond);
  • SystemNetwork — создаёт дополнительную сервисную сеть на узлах кластера поверх существующей underlay-сети для служебного трафика;
  • UnderlayNetwork — обеспечивает прямое подключение физических и виртуальных сетевых интерфейсов узла (PF/VF) к подам через Dynamic Resource Allocation (DRA), в режиме Shared или Dedicated.

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

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

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

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

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

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

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

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

  1. Controller (Deployment) — контроллер управляет программно-определяемыми сетями в DP, выполняя следующие действия:

    • управляет кастомными ресурсами API-группы network.deckhouse.io;
    • выполняет валидацию кастомных ресурсов API-группы network.deckhouse.io через механику Validating Admission Controllers;
    • выполняет мутацию кастомных ресурсов NodeNetworkInterface через механику Mutating Admission Controllers;
    • выполняет мутацию ресурсов Pod в неймспейсах с лейблом direct-nic-access.network.deckhouse.io/enabled для внедрения ResourceClaim при пробросе аппаратных сетевых устройств.

    Состоит из одного контейнера controller.

  2. Agent (DaemonSet) — компонент, запускающийся на всех узлах кластера и выполняющий следующие операции:

    • настраивает сетевые интерфейсы узла (агрегация портов, объединение в бридж, настройка VLAN-интерфейсов);
    • поднимает дополнительные, underlay- и системные сети;
    • реализует CNI-сервер, к которому по Unix-сокету обращается компонент d8-sdn;
    • реализует драйвер Dynamic Resource Allocation (DRA) для API-группы network.deckhouse.io, регистрируясь в качестве DRA-плагина в kubelet для проброса физических и виртуальных сетевых устройств в под. Функционал доступен в редакциях DP Ultimate/EE, Certified Core/CSE Lite (1.73), Certified Pro/CSE Pro (1.73).

    Agent отвечает за перевод конфигураций узлов кластера и запущенных на них подов в низкоуровневые настройки для сетевых интерфейсов и eBPF-программ, которые реально обрабатывают трафик.

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

    • install-cni-plugin — init-контейнер, копирует исполняемый файл CNI-плагина d8-sdn в каталог /opt/cni/bin на узле;
    • agent — основной контейнер.

    У компонента agent есть привилегированный доступ к операционной системе каждого узла. В Linux для этого требуются capabilities:

    • NET_ADMIN
    • SYS_ADMIN
    • BPF

    Контейнер также запускается от имени пользователя root (runAsUser: 0), использует hostNetwork: true и профиль AppArmor Unconfined. Это необходимо для настройки сетевых интерфейсов узла, сетевых пространств имён и загрузки BPF-программ.

  3. D8-sdn — исполняемый файл CNI-плагина, который вызывается компонентом containerd в соответствии со спецификацией CNI, например ADD при создании сетевого пространства имён пода и DEL при его удалении. D8-sdn взаимодействует с API агента через Unix-сокет и инициирует настройку низкоуровневой конфигурации сети подов.

  4. Scheduler (Deployment) — расширение (extender) для kube-scheduler, предлагает узлы для размещения подов в соответствии с настройками сетевых интерфейсов подов.

  5. Cni-plugin-cleaner (DaemonSet) — Helm pre-delete хук модуля, запускаемый контроллером Deckhouse перед удалением модуля sdn, который запускается на каждом узле и удаляет файлы CNI-плагина (исполняемый файл в /opt/cni/bin и конфигурацию в /etc/cni/net.d), установленные компонентом agent. Не участвует в штатной работе модуля.

  6. Cni-plugin-cleaner-waiter (Job) — Helm pre-delete хук модуля, запускаемый контроллером Deckhouse перед удалением модуля sdn, который ожидает завершения работы DaemonSet cni-plugin-cleaner на всех узлах кластера, прежде чем Helm разрешит завершить удаление релиза модуля.

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

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

  1. Kube-apiserver:

    • управляет кастомными ресурсами API-группы network.deckhouse.io;
    • управляет ресурсами Secret, Pod, Node, Namespace, DeviceClass, ResourceSlice, ResourceClaim и ResourceClaimTemplate.
  2. Kubelet — регистрируется как DRA-плагин для ресурсов API-группы network.deckhouse.io.

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

  1. Kube-apiserver:

    • валидирует кастомные ресурсы API-группы network.deckhouse.io;
    • мутирует ресурсы NodeNetworkInterface и Pod.
  2. Kube-scheduler — отправляет на вебхук sdn-scheduler-extender запросы на планирование подов, использующих программно-определяемые сети.

  3. Containerd — запускает исполняемый файл d8-sdn с определёнными командами в соответствии со спецификацией CNI, например ADD при создании сетевого пространства имён пода и DEL при его удалении.

  4. Kubelet — вызывает RPC-методы PrepareResourceClaims и UnprepareResourceClaims для настройки DRA-ресурсов пода.

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