Привет, Хабр! На связи Кирилл Савин, я — архитектор SDN в Облаке Рег.ру. Недавно мы с командой начали большой переезд OpenStack облака на OVN, который идет и сейчас. Это непростое путешествие, в котором мы пробовали разные решения, извлекали уроки из ошибок и продолжали двигаться вперед. Так появилась идея рассказать о рабочих кейсах и идеях, которые мы почерпнули. 

Мыслей на этот счет получилось много, поэтому решил сделать серию статей об инструментах для сетевой виртуализации. В первой начнем с обзора OVN: об архитектуре, преимуществах и недостатках. Будет полезно тем, кто в контексте OpenStack работает с сетевой виртуализацией и уже «трогал» OVN. Поехали!

Навигация по тексту:

Что такое OVN

Сетевая виртуализация — ключевая составляющая современных облаков. Живые обсуждения и вопросы вызывает то, как обустроить ее работу. Традиционно в OpenStack используется связка Neutron и Open vSwitch (OVS) с набором агентов для реализации L2/L3/DHCP функциональности. При применении такого подхода всплывает ряд ограничений: сложность, высокая связанность компонентов и проблемы масштабирования. 

С решением этих вопросов помогает OVN (Open Virtual Network) — система предлагает современный подход к архитектуре и повышенную отказоустойчивость. Это SDN (Software Defined Network), который использует Open vSwitch для процессинга сетевых пакетов и предоставляет полноценную сетевую виртуализацию (Overlay) на уровнях L2–L4:

  • виртуальные коммутаторы и маршрутизаторы (Logical Switches, Logical Routers);

  • NAT, ACL, балансировщики нагрузки;

  • встроенный DHCP-сервер;

  • поддержка IPv6, мультикаст, QoS.

В основе архитектуры OVN лежит несколько ключевых компонентов, каждый из которых отвечает за свой уровень управления сетью. Рассказываю, что здесь под капотом. Две базы данных — Northbound и Southbound. Они представляют собой конфигурационные хранилища с распределенной репликацией, содержащие high-level описание сети и low-level правила. Демон ovn-northd, преобразующий описание сети в правила. Локальный агент ovn-controller на гипервизоре применяет правила low-level к Open vSwitch. И CLI-инструменты: ovn-nbctl, ovn-sbctl. 

Архитектура OVN с CMS Neutron

Посмотрим, что внутри. Предлагаю сравнить два подхода — начну со взаимодействия OpenStack (Neutron и Octavia) с SDN OVN (Open Virtual Network), которая обеспечивает виртуальную сетевую инфраструктуру. Выглядит это так:

Сетевой стек OVN строится по уровням, каждый из которых отвечает за свою часть логики — от общего описания сети до настройки правил на конкретных узлах. В верхней части находится слой управления облаком — Neutron/Octavia как CMS (Cloud Management System). Здесь работают два драйвера:

  • ML2 OVN Driver отвечает за создание и управление сетями, подсетями и портами, передавая инструкции в OVN;

  • OVN Octavia Driver занимается реализацией виртуальных балансировщиков нагрузки с использованием OVN.

В среднем блоке сосредоточен «мозг» системы — OVN Control. Здесь происходит слаженная работа трех элементов. Первым в игру вступает Northbound DB — он принимает инструкции от CMS. Например, создание виртуальной сети. Дальше демон ovn-northd интерпретирует эти инструкции и преобразует их в правила для нижнего уровня. Он записывает их в Southbound DB — базу данных, содержащую уже конкретные директивы для гипервизоров.

Нижний уровень — OVN Chassis. Он разворачивается на каждом compute- или network-узле. Сначала ovn-controller получает из Southbound DB инструкции и применяет их к локальному Open vSwitch (OVS) через Open vSwitch DB — создает правила перенаправления трафика. Отдельно работает Metadata Agent, который обеспечивает доступ виртуальных машин к метаданным инстансов. Это нужно для получения, например, ключей SSH и настроек сети при запуске.

В таком механизме каждый при деле: CMS инструктирует OVN, OVN управляет сетевыми объектами-маршрутизаторами и сетями, Open vSwitch обрабатывает трафик на хостах.

Архитектура SDN Neutron на базе Open vSwitch

В OpenStack Neutron при использовании драйвера ML2 с механизмом Open vSwitch (OVS) взаимодействие между компонентами реализовано через агентскую модель. На compute- и network-нодах работает Open vSwitch Agent, который взаимодействует с базой данных Open vSwitch DB и управляет виртуальными сетевыми интерфейсами через Open vSwitch. Metadata Agent обеспечивает доступ к метаданным инстансов, перенаправляя запросы к 169.254.169.254 через iptables из namespace маршрутизатора к локальному сокету агента.

Дальше все события и изменения передаются через RabbitMQ от ML2-плагина к агентам на нодах. Для организации сетевой связности и проброса пакетов между виртуальными машинами, маршрутизаторами и внешними сетями используется логика bridges и flows в Open vSwitch.

На стороне network-ноды также запускаются L3 Agent и DHCP Agent. L3 Agent управляет маршрутизаторами, которые создаются в отдельных Linux namespace’ах (qrouter, SNAT, FIP). DHCP Agent отвечает за предоставление IP-адресов из пулов сетей. Эти namespace взаимодействуют с виртуальными машинами через Open vSwitch — отсюда изоляция трафика, маршрутизация и сервисные функции для инстансов.

OVN vs Neutron+Open vSwitch: почему OVN побеждает

1. FullSync: Согласованность вместо полной синхронизации

Eventual Consistency — модель, когда обновления распространяются через события, а изменения применяются постепенно. Эту модель использует как Neutron + Open vSwitch, так и OVN.

Neutron + Open vSwitch использует агент neutron-openvswitch-agent, который реагирует на поступающие запросы путем обработки событий через RabbitMQ. В случае потери связи с брокером сообщений (RabbitMQ) агент может инициировать полную повторную синхронизацию (fullsync) — это приводит к удалению и повторной установке всех flows в Open vSwitch, что затрагивает как один гипервизор, так и потенциально всю инфраструктуру. Такое поведение критично при сбоях в underlay-сети и потере соединения с RabbitMQ.

OVN так же использует модель Eventual Consistency, где все изменения распространяются через транзакции в распределённых базах данных (OVN Northbound и Southbound). Локальный ovn-controller на каждом хосте синхронизирует свое состояние с базой, но в отличие от neutron-openvswitch-agent, при потере связи с OVN Southbound DB он не сбрасывает локальное состояние, а продолжает обрабатывать трафик по текущим flow'ам. Это делает OVN более устойчивым к временным сбоям control plane и потере связи с центральными компонентами.

2. Нативная балансировка нагрузки (L4 Load Balancing)

OVN поддерживает балансировку трафика на уровне Flow — это означает, что обработка осуществляется прямо в datapath Open vSwitch, без необходимости запускать отдельные виртуальные машины или контейнеры. В отличие от подхода с использованием Amphora в Octavia, где создается полноценная виртуальная машина с агентами и приложениями, OVN реализует балансировку легковесно и эффективно. Отсюда получаем:

  • экономию ресурсов: не требуется запуск отдельных ВМ для балансировки;

  • высокую производительность: логика реализуется на сетевом уровне, как OpenFlow-правила;

  • прозрачность для приложений: оригинальный source IP клиента сохраняется. Это важно для систем логирования, контроля доступа и приложений, зависящих от IP-идентификации.

Звучит неплохо, но всплывают и ограничения:

  • поддерживаются только L4-протоколы (TCP, UDP), без сложной логики на прикладном уровне;

  • трудности с балансировкой внешних ресурсов или сервисов вне виртуальной сети OVN;

  • меньше гибкости по сравнению с полноценными L7-балансировщиками (например, на базе HAProxy или Envoy).

3. Минимум агентов

В OVN нет отдельных агентов уровня L2, L3 и DHCP. Также почти отсутствует зависимость от RabbitMQ для взаимодействия между контроллером и агентами. На гипервизорах используются только два компонента: ovn-controller и ovn-metadata-agent (использует RabbitMQ).

Всё это снижает сложность, увеличивает отказоустойчивость и упрощает сопровождение.

4. Комбо из сетевых сервисов: Flow-based NAT, ACL и DHCP

Вместо привычных инструментов: iptables/nftables и dnsmasq, OVN реализует преобразование сетевых адресов (NAT) и правил файрвола через OpenFlow-правила. Протокол динамической настройки узла (DHCP) встроен в управляющий слой Control Plane.

5. Отказ от Network namespaces — новые подходы к диагностике

Одно из отличий OVN от классического Neutron с Open vSwitch — отказ от использования отдельных Network namespaces для компонентов вроде L3-агента, DHCP и Floating IP. OVN реализует маршрутизацию, NAT, DHCP и другие сетевые функции на уровне  Open vSwitch с помощью Flow-правил, что дает нам ряд преимуществ:

  • снижение накладных расходов: ядро не тратит ресурсы на создание и обслуживание множества неймспейсов, интерфейсов и процессов, таких как dnsmasq, keepalived, haproxy;

  • упрощение архитектуры: меньше двоичных компонентов, меньше взаимодействия между ними, меньше точек отказа.

С отказом от Network namespaces получаем и новые подходы к диагностике OVN. В классической архитектуре для отладки можно было «зайти в роутер» или «в DHCP-сервер», выполнив ip netns exec, и воспользоваться привычными утилитами вроде ping, tcpdump, dig и т.п. В OVN же логические роутеры: NAT, DHCP и ACL — реализуются как абстракции, описанные в Northbound-базе, которые в итоге транслируются в OpenFlow-правила. Получается, нельзя просто «зайти в неймспейс роутера» — его больше нет. Это требует смены парадигмы при отладке.

Хочу отметить доступные инструменты для диагностики:

  • ovn-trace — симулирует прохождение пакета по логической топологии (по Northbound/Southbound правилам);

  • ovs-appctl ofproto/trace — более низкоуровневый инструмент, симулирующий прохождение пакета в Open vSwitch;

  • ovn-nbctl, ovn-sbctl — позволяют просматривать и анализировать правила маршрутизации, NAT, DHCP, ACL на логическом уровне.

Важно учесть: эти инструменты не заменяют живой сетевой стек — они симулируют поведение пакета. Поэтому диагностика требует большего понимания логических конструкций OVN и принципов их трансляции в OpenFlow.

Точки роста OVN: о недостатках

Казалось, при работе с OVN всё звучит отлично: есть нативная балансировка, современные подходы и удобные инструменты диагностики. Но и у этого проекта есть свои минусы: 

1. Сложность отладки

Отладка требует понимания цепочки преобразований: от Northbound-абстракций до Southbound-правил и OpenFlow flows. Прямая визуализация состояния через ip netns, iptables — недоступна.

2. Чувствительность к версиям

Neutron, OVN и Open vSwitch должны быть совместимы. При использовании в OpenStack следует внимательно следить за соответствием версий ML2-плагина, OVN и базовых компонентов.

3. Молодость проекта и меньшее комьюнити

Хотя OVN развивается активно и уже используется в продакшене во многих  инсталляциях, проект всё еще молод по сравнению с классическим стеком Neutron + Open vSwitch.

На этапе становления OVN можно выделить основные пойнты, повлиявшие на его развитие. Так, разработкой OVN занимается та же команда, что и Open vSwitch, — отсюда стабильное развитие базовой сетевой логики. Значительный вклад в развитие OVN внесли инженеры Red Hat, активно продвигая его в экосистемах OpenStack и Kubernetes.

Несмотря на связи с OpenStack, OVN — это независимый проект, представляющий собой полноценное SDN-решение. Он может использоваться вне OpenStack. Например, с Kubernetes (через ovn-kubernetes), Bare Metal сетями и другими системами.

Что касается официальной документации — она довольно подробная, но не всегда интуитивно понятная для новичков. Понимание архитектуры и диагностических утилит требует времени и практики. К этой теме мы скоро вернемся — в мыслях отдельная статья, где затронем эту проблему :)

По сравнению с Neutron+Open vSwitch, у OVN меньше публикаций, готовых решений и советов в сообществе, особенно в части отладки и эксплуатации.

Заключение

OVN — это логичное развитие идей Open vSwitch, предлагающее современную архитектуру сетевой виртуализации. Он убирает узкие места старого подхода, сокращает количество компонентов и повышает отказоустойчивость. Несмотря на сложность обучения и некоторые ограничения, OVN уже сегодня готов к использованию в продакшене и представляет собой мощный инструмент для построения облаков нового поколения.

Отмечу, что при переходе на OVN стоит учитывать, что он требует дополнительного погружения в архитектуру, OpenFlow-логику и внутренние механизмы. Однако его независимость от OpenStack делает его универсальным решением для построения сетей в самых разных сценариях.

Для себя я сделал выводы, что OVN стоит использовать в следующих случаях: 

  • при развертывании нового облака с упором на масштабируемость и отказоустойчивость;

  • для использования легковесных L4 балансировщиков;

  • при необходимости унификации NAT, DHCP и ACL в рамках одной модели.

В этой статье посмотрели на OVN с теоретической точки зрения. Пора переходить к практике — в следующий раз расскажу, как мы с командой Облака Рег.ру переезжали на новую систему и с какими сложностями столкнулись. Мы глубже посмотрим на процесс миграции и поделимся техническими деталями. До связи!

Комментарии (0)