Стандартная сеть Kubernetes даёт поду один интерфейс и адрес из внутреннего диапазона, но иногда приложениям этого не хватает: нужны дополнительные сети для интеграции с legacy-инфраструктурой, изоляции трафика или прямого доступа в публичные сети. В ванильном K8s это превращается в сложную настройку нескольких компонентов и ручную работу на каждом узле.
Мы в Deckhouse эту боль закрыли модулем sdn, где дополнительные сети описываются декларативно, а агент на узле сам поднимает нужные VLAN-интерфейсы. Теперь базовые возможности модуля — кластерные VLAN-сети с DHCP и настройкой MTU — входят в бесплатную Deckhouse Platform Open и в базовую Deckhouse Platform Core. А всё, что относится к самостоятельному управлению сетями команд, прямому доступу к интерфейсам узлов и системным сетям, вошло в расширение «Продвинутые сетевые возможности».
Всем привет! Я Петр Антонов — руководитель продуктовых направлений «Сети и провайдеры для частной инфраструктуры» в команде Deckhouse. В новости рассказываю, какие возможности sdn теперь входят в базовую платформу, что доступно в расширении и как настроить дополнительную сеть в кластере.
Запутались в базовых возможностях платформы и расширениях? Объясняем, как изменилась доступность модуля sdn после обновления продуктовой линейки Deckhouse — какие редакции были раньше и как это устроено сейчас (кликайте).
Как было раньше:
Раньше у Deckhouse были бесплатная редакция Community Edition и коммерческие Basic Edition, Standard Edition, Standard Edition+ и Enterprise Edition. Модуль sdn с возможностями создания дополнительных сетей был доступен только в Enterprise Edition.
Что изменилось:
Мы провели крупные изменения платформы. Теперь состав редакций выглядит так:
-
Deckhouse Platform Open — та же бесплатная редакция с открытым исходным кодом (прежнее название — Deckhouse Community Edition).
-
Deckhouse Platform Core — включает базовые возможности платформы и позволяет собрать индивидуальное решение под ваши задачи с помощью совместимых расширений. Теперь пользователи не ограничены фиксированным набором редакций Enterprise, Basic, Standard или Standard Edition+.
-
Deckhouse Platform Ultimate — включает все базовые возможности платформы и расширения «из коробки».
Подробнее об изменениях в продуктах читайте в новости про Deckhouse Platform и новую продуктовую линейку.
Как стало сейчас:
Базовые возможности модуля sdn (кластерные VLAN-сети с DHCP, адресацией и настройкой MTU) теперь входят в саму платформу — доступны и в Deckhouse Platform Open, и в Deckhouse Platform Core.
Продвинутые возможности (самостоятельное управление сетями команд, прямой доступ к сетевым интерфейсам узлов, создание системных сетей) вошли в расширение «Продвинутые сетевые возможности», которое можно подключить к Core или получить сразу в составе Deckhouse Platform Ultimate.
Для использования потребуются модуль sdn версии 0.8.0 и выше и Kubernetes 1.32 и выше.
Зачем поду или виртуальной машине физическая сеть
Для типичных микросервисов достаточно одного интерфейса и IP-адреса из внутреннего диапазона кластера. Но есть сценарии, где нужны дополнительные сетевые интерфейсы:
-
Запуск монолитных приложений в классической виртуализации. Классическим приложениям или виртуалке нужен IP из того же VLAN, где остались её соседние компоненты, чтобы не переделывать всю маршрутизацию в ЦОДе.
-
Изоляция трафика. Базе данных или хранилищу нужен выделенный сегмент сети, чтобы не делить общую полосу с остальным кластером.
-
Доступ в публичные сети. Сервису (например, работающему на уровне L4), который принимает внешний трафик, иногда нужен честный публичный IP без прослоек в виде балансировщиков и NAT.
Чтобы подключить к поду или виртуальной машине дополнительную сеть, в Kubernetes обычно требуется несколько компонентов: мета-плагин для подключения нескольких сетевых интерфейсов, отдельный CNI-плагин для VLAN, IPAM для выдачи адресов и настройка сетевых интерфейсов на узлах.
Наш модуль sdn объединяет всё это в одном решении, и вместо ручной настройки сетевых интерфейсов на каждом узле достаточно один раз описать желаемое состояние сети. Подробности дальше.
Какие возможности модуля sdn теперь входят в состав платформы
Кластерные сети и всё необходимое для их работы доступны в Deckhouse Platform Core и в бесплатной Deckhouse Platform Open.
Как это работает «под капотом»:
Кластерная сеть (ClusterNetwork). Это L2-домен, который администратор создаёт один раз и может подключать к подам и виртуальным машинам в любом неймспейсе кластера. Сеть строится поверх тегированного VLAN (тогда коммутация идёт на оборудовании ЦОДа, а в кластере можно завести до 4094 таких сетей) или на выделенных интерфейсах узлов без тегов. Внутри пода сеть появляется как отдельный сетевой интерфейс с заданным именем.
Интерфейсы узлов (NodeNetworkInterface). Сетевые карты обнаруживаются автоматически, а Bond, мосты и VLAN-интерфейсы поверх них описываются декларативно.
Адресация (ClusterIPAddressPool и IPAddress). Адрес из пула выдаётся автоматически при подключении пода/ВМ или может быть запрошен явно. Назначить его можно двумя способами: напрямую на интерфейс или по DHCP, тогда адрес отдаётся в ответ на запрос из пода или виртуальной машины. DHCP-сервер реализован на eBPF в агенте узла и отдельный сервис для него не нужен. Освободившиеся адреса удерживаются в течение заданного времени и не выдаются повторно сразу. Пока поддерживается только IPv4.
MTU. Задаётся отдельным полем в описании сети. Интерфейсы подов наследуют его. При изменении значения уже подключённые поды переконфигурируются без пересоздания.
Так выглядит кластерная сеть поверх VLAN 900 с пулом адресов:
apiVersion: network.deckhouse.io/v1alpha1kind: ClusterIPAddressPoolmetadata: name: public-net-poolspec: leaseTTL: 24h pools: - network: 203.0.113.0/24 ranges: - 203.0.113.10-203.0.113.200---apiVersion: network.deckhouse.io/v1alpha1kind: ClusterNetworkmetadata: name: public-networkspec: type: VLAN vlan: id: 900 parentNodeNetworkInterfaces: labelSelector: matchLabels: nic-group: extra ipam: ipAddressPoolRef: kind: ClusterIPAddressPool name: public-net-pool
Метка nic-group: extra заранее ставится на те ресурсы NodeNetworkInterface, поверх которых разрешено строить дополнительные сети. К поду сеть подключается аннотацией:
apiVersion: v1kind: Podmetadata: name: app-with-public-network annotations: network.deckhouse.io/networks-spec: | [ { "type": "ClusterNetwork", "name": "public-network", "ifName": "net1" } ]spec: containers: - name: app image: nginx
После запуска в аннотации network.deckhouse.io/networks-status видно, какой адрес и какие маршруты получил интерфейс, а также в каком он состоянии.
Администратор описывает сеть один раз, и на каждом узле появляется VLAN с мостом. Под получает второй интерфейс с адресом напрямую, виртуальная машина — по DHCP в гостевую системуЧто даёт расширение «Продвинутые сетевые возможности»
Кластерную сеть заводит администратор, и она общая для всего кластера. Всё, что относится к самостоятельным сетям команд, прямому доступу к сетевым картам узлов и служебным сетям, входит в расширение «Продвинутые сетевые возможности»:
-
Сети проектов. Помимо кластерных сетей, можно выделить изолированную сеть в рамках одного проекта. Сетевой инженер один раз задаёт безопасные границы (диапазоны VLAN ID и интерфейсы) через ресурс
NetworkClass. После этого команды самостоятельно создают свои сети и управляют ими (ресурсыNetworkиIPAddressPool) в своём неймспейсе. Это автоматизирует рутинные задачи, избавляя сетевых специалистов от потока мелких запросов. -
Проброс сетевых карт. Ресурс
UnderlayNetworkотдаёт подам физические или виртуальные функции сетевых карт через Dynamic Resource Allocation. Такой режим используется, в частности, для SR-IOV и высокопроизводительных сетевых нагрузок с DPDK и VFIO. -
Системные сети.
SystemNetworkпозволяет создавать дополнительные служебные сети на узлах поверх underlay-сетей для трафика хранилищ и управления.
Без расширения эти ресурсы в кластере не появляются: модуль собирается отдельно для каждой поставки.
Как попробовать модуль
Важный нюанс: модуль sdn находится на стадии Preview. Это значит, что часть функциональности ещё может измениться, а при переходе на будущие версии может потребоваться ручная миграция. Для сетей поверх VLAN также нужно заранее выделить диапазоны VLAN ID на коммутаторах и настроить их на портах узлов.
Включить модуль можно через веб-интерфейс платформы в разделе «Модули», командой d8 system module enable sdn в CLI или применив манифест ModuleConfig:
apiVersion: deckhouse.io/v1alpha1kind: ModuleConfigmetadata: name: sdnspec: enabled: true
После включения модуля в кластере появятся ресурсы типа NodeNetworkInterface с текущим состоянием интерфейсов узлов. Дальше по шагам из руководства администратора нужно разметить интерфейсы, создать пул адресов и сеть и подключить её к поду по руководству пользователя. Описание всех ресурсов ищите в разделе документации модуля «Кастомные ресурсы».
Попробуйте модуль в деле, делитесь идеями по улучшению и задавайте вопросы в Telegram-сообществе.
P. S.
Больше материалов о сетях:
-
Доклад «Путь к SDN: чего не хватает в классической сети Kubernetes?» от руководителя разработки сетевой подсистемы Deckhouse
-
Статья «IP подов кончились, а обычные решения не подошли: как мы расширили сеть на проде, не пересоздавая кластер»
-
Статья «Балансировка входящего трафика на железе: как надёжно вывести K8s наружу с MetalLB, BGP и L2»
Источник: habr.com