Модуль 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 изображены на следующей диаграмме:
Компоненты модуля
Модуль состоит из следующих компонентов:
-
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.
- управляет кастомными ресурсами API-группы
-
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и профиль AppArmorUnconfined. Это необходимо для настройки сетевых интерфейсов узла, сетевых пространств имён и загрузки BPF-программ. -
D8-sdn — исполняемый файл CNI-плагина, который вызывается компонентом containerd в соответствии со спецификацией CNI, например ADD при создании сетевого пространства имён пода и DEL при его удалении. D8-sdn взаимодействует с API агента через Unix-сокет и инициирует настройку низкоуровневой конфигурации сети подов.
-
Scheduler (Deployment) — расширение (extender) для kube-scheduler, предлагает узлы для размещения подов в соответствии с настройками сетевых интерфейсов подов.
-
Cni-plugin-cleaner (DaemonSet) — Helm
pre-deleteхук модуля, запускаемый контроллером Deckhouse перед удалением модуляsdn, который запускается на каждом узле и удаляет файлы CNI-плагина (исполняемый файл в/opt/cni/binи конфигурацию в/etc/cni/net.d), установленные компонентом agent. Не участвует в штатной работе модуля. -
Cni-plugin-cleaner-waiter (Job) — Helm
pre-deleteхук модуля, запускаемый контроллером Deckhouse перед удалением модуляsdn, который ожидает завершения работы DaemonSetcni-plugin-cleanerна всех узлах кластера, прежде чем Helm разрешит завершить удаление релиза модуля.
Взаимодействия модуля
Модуль взаимодействует со следующими компонентами:
-
Kube-apiserver:
- управляет кастомными ресурсами API-группы
network.deckhouse.io; - управляет ресурсами Secret, Pod, Node, Namespace, DeviceClass, ResourceSlice, ResourceClaim и ResourceClaimTemplate.
- управляет кастомными ресурсами API-группы
-
Kubelet — регистрируется как DRA-плагин для ресурсов API-группы
network.deckhouse.io.
С модулем взаимодействуют следующие внешние компоненты:
-
Kube-apiserver:
- валидирует кастомные ресурсы API-группы
network.deckhouse.io; - мутирует ресурсы NodeNetworkInterface и Pod.
- валидирует кастомные ресурсы API-группы
-
Kube-scheduler — отправляет на вебхук
sdn-scheduler-extenderзапросы на планирование подов, использующих программно-определяемые сети. -
Containerd — запускает исполняемый файл d8-sdn с определёнными командами в соответствии со спецификацией CNI, например ADD при создании сетевого пространства имён пода и DEL при его удалении.
-
Kubelet — вызывает RPC-методы
PrepareResourceClaimsиUnprepareResourceClaimsдля настройки DRA-ресурсов пода.