Протягиваем сеть Docker с использованием технологии VXLAN

D2

Администратор
Регистрация
19 Фев 2025
Сообщения
4,380
Реакции
0
Содержание статьи
  • Кто такой ваш VXLAN
  • Как работает VXLAN?
  • Пример практического использования VXLAN

Кто такой ваш VXLAN
Много статей и информации в Интернете уже написано на эту тему другими авторами. Вместо сухой теории, изучения RFC и структуры заголовков я попытаюсь объяснить на пальцах про эту интересную, на мой взгляд, технологию. К тому же покажу, как можно использовать ее в домашних условиях.

Современные тенденции в развитии облачных технологий, SaaS, систем контейнеризации и оркестрации в свое время породили несколько потребностей.

Во-первых, нужна возможность создавать большое количество изолированных и отдельных сегментов сети (широковещательных доменов). Когда вы заказываете в облачном провайдере ВМ - ей чаще всего выдается локальный адрес, например 10.0.0.1/24. И таких пользователей может быть очень и очень много, а выдавать каждому уникальный приватный адрес нереально, слишком уж быстро они кончатся. Выдавать пользователям адреса из общих сетей, согласитесь, как-то странно. Представьте, что ваша ВМ с личным блогом крутится в одной сети с какой-нибудь базой данных крупной компании, которую вдобавок еще и скомпрометировали и злоумышленник завладев базой имеет сетевую доступность с вашим блогом...

Во-вторых, крупные хостинг-провайдеры и поставщики облачных ресурсов могут иметь в своем распоряжении территориально распределенные ЦОДы (не обязательно через Интернет, это могут быть 2 машинных зала на одной территории), а ведь в некоторых случаях, вычислительные ресурсы должны быть в одном сегменте сети на L2 уровне. Это могут быть как ВМ, так и сервера, сетевое оборудование. Раньше для решения данной задачи активно использовали и используют до сих пор технологию MPLS, но это уже отдельный разговор.

В-третьих, в том же самом Kubernetes, Docker, возникла потребность объединить контейнеры в одну сеть при использовании нескольких нод (виртуальных и/или физических). То есть изолированному контейнеру, запущенному на одном сервере или ВМ нужно как-то общаться с контейнером на другой вычислительной ноде, которая может быть вообще на другом гипервизоре или в другом датацентре.

В-четвертых, для сетей некоторых организаций становится мало VLAN ID для собственных сетей. Для идентификации принадлежности сетевых пакетов тому или иному VLAN-у используется двенадцатибитный идентификатор (VLAN ID), т.е. максимальное количество VLAN-ов в одной сети - 4096. Много это или мало - вопрос риторический, однако технология VXLAN позволяет создать уже 16 777 216 сетей (24 бит).

Безусловно, можно объединять все в VPN, но это несет за собой накладные расходы (особенно если используется криптография). Да и вообще тяжело представить VPN внутри каждой виртуальной машины... Так на помощь нам пришли протоколы туннелирования, такие как VXLAN и оверлейные сети.

Изначально разработку VXLAN начала компания VMware, которая, является крупным игроком в мире виртуализации. Разрабатывался он как аналог популярному MPLS, так как для MPLS нужно иметь специальное сетевое оборудование, там используется другой подход к построению сети, да и не работает через NAT. В добавок, не каждый провайдер позволит вам гонять через Интернет MPLS трафик. На тот момент у VXLAN не было даже RFC и использовался другой UDP порт. Но по настоящему он обрел популярность после вовлечения в работу над протоколом такой известной компании как Cisco.

Итак, VXLAN (Virtual Extensible LAN) - технология, позволяющая создать overlay L2 сети между хостами, при наличии между ними L3 связности, с использованием протокола UDP.

Для четкого понимания нужно объяснить 2 термина - overlay и underlay.
Underlay-сеть в рамках статьи следует понимать существующую сеть, на которой будет строиться виртуальная "надсеть" - overlay.

Underlay_overlay.png



В качестве основы для Underlay используют обычное сетевое оборудование - коммутаторы, маршрутизаторы, межсетевые экраны и тд. Как раз настройка этого оборудования и позволяет нам обеспечить L3 связность для будущего Overlay. Например, если у вас есть соединение домашнего сервера и VPS через Интернет - то по сути underlay будет состоять из вашего домашнего сетевого оборудования, оборудования провайдеров и ЦОДа хостера.

Соответственно Overlay - виртуальная сеть поверх существующего оборудования.

Как работает VXLAN?

VXLAN основывается на технологии туннелирования. Для связи устройств в разных сетевых сегментах используются VXLAN-туннели, создаваемые между так называемыми VTEP (VXLAN Tunnel Endpoint).

- VTEP — это устройство (или программное решение), которое выполняет функции инкапсуляции/деинкапсуляции трафика. Им может быть как порт коммутатора, маршрутизатора, так и виртуальный маршрутизатор или Linux-сервер
- VNI (VXLAN Network Identifier) — уникальный идентификатор, который определяет виртуальную сеть внутри VXLAN-инфраструктуры. Прямой аналог VLAN ID в VLAN сетях

Инкапсуляция происходит следующим образом:

1. Ethernet-фрейм передается к VTEP-устройству.
2. VTEP инкапсулирует фрейм в UDP-пакет и добавляет заголовки IP и VXLAN.
3. Пакет передается через IP-сеть к другому VTEP.
4. На стороне получателя VTEP выполняет деинкапсуляцию и передает оригинальный Ethernet-фрейм в конечную точку.

Пример практического использования VXLAN

Для построения простейшей overlay сети на базе VXLAN нам понадобятся 2 виртуальные машины. Допустим, в каждой из них запущен Docker контейнер и существует потребность соединить 2 контейнера в одну сеть.

VXLAN между контейнерами Docker
Как было сказано выше, современные оркестраторы (Kubernetes) позволяют предоставлять сетевую связность контейнерам, запущенным на 2 разных нодах (ВМ).
Однако, мы можем сами решить эту задачу, для связки двух контейнеров на разных нодах (Умный читатель поймет, что это заявка на нестандартный пивотинг в некоторых случаях).

Для начала подготовим хосты на которых крутится Docker, установив туда дополнительный пакет
sudo apt install bridge-utils

Стандартная сеть, создаваемая докером (docker0), не позволяет закрепить конкретные IP-адреса за контейнерами. Поэтому создадим свою сеть типа bridge (сетевой мост)

docker network create --subnet 172.18.0.0/16 customnet

Теперь запустим тестовые контейнеры на двух удаленных ВМ. Пусть это будет Nginx.
Важно - IP-адреса контейнеров должны быть разными на двух нодах.

На ВМ 1 поднимаем тестовый контейнер

docker run -d --net customnet --ip 172.18.0.2 nginx

На ВМ 2 поднимаем тестовый контейнер

docker run -d --net customnet --ip 172.18.0.3 nginx

Далее, нам нужно настроить VXLAN интерфейсы на двух ВМ и привязать их к физическому сетевому адаптеру.

Если у нас ВМ один имеет адрес - 172.25.0.1, а ВМ два имеет адрес - 192.168.0.1 (при этом, как написано выше, у нас должна быть обеспечена L3 связность между ВМ 1 и ВМ 2, по простому - ВМ один должна пинговать ВМ два), то настройка интерфейса будет следующая.

ВМ 1:

sudo ip link add vxlan10 type vxlan id 10 remote 192.168.0.1 dstport 4789 dev eth0

Здесь, 10 - VNI (аналог VLAN ID), 192.168.0.1 - адрес соседа (ВМ 2), 4789 - порт, используемый для построения туннеля, eth0 - физический интерфейс ВМ 1 .
Соответсвенно, настройки ВМ 2 будут аналогичными:

sudo ip link add vxlan10 type vxlan id 10 remote 172.25.0.1 dstport 4789 dev eth0

В результате, у нас должны создаться интерфейсы с именами vxlan10 на обоих хостах.

Поднимаем созданные интерфейсы на обоих хостах

sudo ip link set vxlan10 up

Отлично, по-сути, туннель готов. Теперь нам нужно подключить созданные интерфейсы к нашим двум созданным Docker сетям (customnet). Так как на каждом хосте customnet является бриджом (виртуальным коммутатором), то посредством VXLAN интерфейса мы соединим 2 виртуальных коммутатора в один широковещательный домен (L2 сегмент). Это и будет наш Overlay (cеть customnet растянутая над существующей L3 сетью между двумя ВМ).

Чтобы найти нужные нам мосты, можно выполнить команду
ip a
и по адресу сети customnet (172.18.0.0/16) найти нужное имя моста. Оно будет вида br-f2241d9c2e89. На двух ВМ они скорее всего будут иметь разные названия. Именно в эти мосты и подключены наши контейнеры с Nginx на каждой ноде.

Добавляем сетевой интерфейс VXLAN в нужные мосты:

ВМ 1:
sudo brctl addif br-f2241d9c2e89 vxlan10

ВМ 2:

sudo brctl addif br-ecc65441b6d2 vxlan10

Готово. Теперь можно провалиться в контейнер Nginx на ВМ1 и проверить связность с другим контейнером на ВМ2

ping 172.18.0.3

Поздравляю, мы создали свою первую overlay сеть!
Аналогичным образом протягивают разные VLAN сети в один широковещательный домен, с помощью VXLAN.
Например, когда в ЦОДе А нужно соединить VLAN 56 с VLAN 329 в ЦОДе Б.

Безусловно, это не все аспекты данной технологии и лишь самый простой способ подключения типа точка-точка (ни о каких BGP EVPN тут речи не идет - тема отдельных статей). В данной статье я попытался на пальцах рассказать зачем нужна эта технология, и что она может делать.
 
Сверху Снизу