0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>В<a>одной из предыдущих статей</a>мы рассматривали особенности реализации многоадресной передачи в VXLAN (multicast). Однако на практике multicast доступен не всегда, да и управлять им при масштабировании бывает непросто. В таких случаях выручают расширения DOVE - они добавлены к реализации VXLAN в Linux 3.8 и избавляют системного архитектора от необходимости применения multicast.</p>
1
<p>В<a>одной из предыдущих статей</a>мы рассматривали особенности реализации многоадресной передачи в VXLAN (multicast). Однако на практике multicast доступен не всегда, да и управлять им при масштабировании бывает непросто. В таких случаях выручают расширения DOVE - они добавлены к реализации VXLAN в Linux 3.8 и избавляют системного архитектора от необходимости применения multicast.</p>
2
<h2>Flooding - unicast-передача со статической лавинной рассылкой</h2>
2
<h2>Flooding - unicast-передача со статической лавинной рассылкой</h2>
3
<p>При желании multicast можно заменить на реплицирование кадров BUM в статически сконфигурированный перечень удалённых VTEP:</p>
3
<p>При желании multicast можно заменить на реплицирование кадров BUM в статически сконфигурированный перечень удалённых VTEP:</p>
4
<p>VXLAN определяется без удалённой multicast-группы. Вместо этого, все существующие удалённые VTEP выполняют связь с нулевым адресом, то есть кадр BUM дублируется на все имеющиеся удалённые точки. При этом устройство VXLAN автоматически запоминает удалённые адреса, изучая адреса источников кадров.</p>
4
<p>VXLAN определяется без удалённой multicast-группы. Вместо этого, все существующие удалённые VTEP выполняют связь с нулевым адресом, то есть кадр BUM дублируется на все имеющиеся удалённые точки. При этом устройство VXLAN автоматически запоминает удалённые адреса, изучая адреса источников кадров.</p>
5
<p>По сути, перед нами довольно простое решение. Если добавить немного автоматизации, вы сможете без проблем поддерживать актуальность записей по дефолту в FDB. Но следует учесть, что хост должен будет дублировать каждый BUM-кадр (head-end replication) на все удалённые VTEP. Если их у вас с десяток, то никаких проблем. Но если тысячи, всё становится гораздо сложнее.</p>
5
<p>По сути, перед нами довольно простое решение. Если добавить немного автоматизации, вы сможете без проблем поддерживать актуальность записей по дефолту в FDB. Но следует учесть, что хост должен будет дублировать каждый BUM-кадр (head-end replication) на все удалённые VTEP. Если их у вас с десяток, то никаких проблем. Но если тысячи, всё становится гораздо сложнее.</p>
6
<p>Пример использования этой стратегии (head-end replication) можно посмотреть<a>здесь</a>.</p>
6
<p>Пример использования этой стратегии (head-end replication) можно посмотреть<a>здесь</a>.</p>
7
<h2>Unicast-передача со статическими записями L2</h2>
7
<h2>Unicast-передача со статическими записями L2</h2>
8
<p>Если вы знаете связи MAC-адресов с VTEP, то сможете предконфигурировать FDB, а также отключить изучение адресов источников:</p>
8
<p>Если вы знаете связи MAC-адресов с VTEP, то сможете предконфигурировать FDB, а также отключить изучение адресов источников:</p>
9
<p>Используя флаг<strong>nolearning</strong>, вы отключите изучение адресов источников. А когда MAC отсутствует, то кадр всегда станет отправляться с применением нулевых записей. Такие записи нужны для широковещательного трафика и milticast-трафика (к примеру, для обнаружения соседей по ARP и IPv6). Данный вид настройки подойдёт для предоставления виртуальных сетей L2 виртуальным машинам (если информация L3 недоступна). Чтобы обновить записи FDB, потребуются какие-нибудь связанные записи.</p>
9
<p>Используя флаг<strong>nolearning</strong>, вы отключите изучение адресов источников. А когда MAC отсутствует, то кадр всегда станет отправляться с применением нулевых записей. Такие записи нужны для широковещательного трафика и milticast-трафика (к примеру, для обнаружения соседей по ARP и IPv6). Данный вид настройки подойдёт для предоставления виртуальных сетей L2 виртуальным машинам (если информация L3 недоступна). Чтобы обновить записи FDB, потребуются какие-нибудь связанные записи.</p>
10
<p>Среди практических примеров этой стратегии -<a>BGP EVPN</a>и<a>Cumulus Quagga</a>.</p>
10
<p>Среди практических примеров этой стратегии -<a>BGP EVPN</a>и<a>Cumulus Quagga</a>.</p>
11
<h2>Unicast-передача со статическими записями L3</h2>
11
<h2>Unicast-передача со статическими записями L3</h2>
12
<p>В прошлом примере мы сохраняли все нулевые записи, что необходимо для корректного обнаружения соседей по ARP и IPv6. Но операционная система Linux способна ещё и отвечать на запросы соседей от имени удалённых узлов.</p>
12
<p>В прошлом примере мы сохраняли все нулевые записи, что необходимо для корректного обнаружения соседей по ARP и IPv6. Но операционная система Linux способна ещё и отвечать на запросы соседей от имени удалённых узлов.</p>
13
<p>Если вы включите эту опцию, то записи по умолчанию станут не нужны (однако вы сможете их сохранять):</p>
13
<p>Если вы включите эту опцию, то записи по умолчанию станут не нужны (однако вы сможете их сохранять):</p>
14
<p>Эта настройка полностью исключит head-end replication. Но следует учесть, что не будут функционировать и протоколы, основанные на мультивещании. При наличии автоматизации данная настройка может хорошо работать с контейнерами: когда в реестре содержится перечень всех используемых IP- и MAC-адресов, программа сможет слушать его, настраивая FDB и соседние таблицы.</p>
14
<p>Эта настройка полностью исключит head-end replication. Но следует учесть, что не будут функционировать и протоколы, основанные на мультивещании. При наличии автоматизации данная настройка может хорошо работать с контейнерами: когда в реестре содержится перечень всех используемых IP- и MAC-адресов, программа сможет слушать его, настраивая FDB и соседние таблицы.</p>
15
<p>Пример - бэкенд VXLAN в<a>Docker libnetwork</a>. Правда, в нём ещё используется метод, о котором поговорим ниже.</p>
15
<p>Пример - бэкенд VXLAN в<a>Docker libnetwork</a>. Правда, в нём ещё используется метод, о котором поговорим ниже.</p>
16
<h2>Unicast-передача с динамическими записями L3</h2>
16
<h2>Unicast-передача с динамическими записями L3</h2>
17
<p>ОС Linux способна уведомлять программу, если отсутствуют записи (L2 либо L3). Программа обратится к центральному реестру и динамически добавит запрашиваемую запись. Но для L2-записей отправка уведомлений применяется лишь в некоторых случаях: • неизвестен MAC-адрес назначения, • в FDB отсутствует нулевая запись, • MAC-адрес назначения не является широковещательным и многоадресным.</p>
17
<p>ОС Linux способна уведомлять программу, если отсутствуют записи (L2 либо L3). Программа обратится к центральному реестру и динамически добавит запрашиваемую запись. Но для L2-записей отправка уведомлений применяется лишь в некоторых случаях: • неизвестен MAC-адрес назначения, • в FDB отсутствует нулевая запись, • MAC-адрес назначения не является широковещательным и многоадресным.</p>
18
<p>Эти ограничения не позволят задействовать сценарий unicast-передачи с динамическими записями L2.</p>
18
<p>Эти ограничения не позволят задействовать сценарий unicast-передачи с динамическими записями L2.</p>
19
<p>Итак, создадим устройство VXLAN с опциями 13miss и 12miss:</p>
19
<p>Итак, создадим устройство VXLAN с опциями 13miss и 12miss:</p>
20
<p>Уведомления отправляются программам, которые слушают сокет AF_NETLINK и используют протокол NETLINK_ROUTE. Данный сокет должен быть связан с группой RTNLGRP_NEIGH. Эта связь, как и декодирование полученных уведомлений, выполняется посредством:</p>
20
<p>Уведомления отправляются программам, которые слушают сокет AF_NETLINK и используют протокол NETLINK_ROUTE. Данный сокет должен быть связан с группой RTNLGRP_NEIGH. Эта связь, как и декодирование полученных уведомлений, выполняется посредством:</p>
21
<p>Первое уведомление сообщит о том, что отсутствует запись соседа для запрошенного IP-адреса. Эту запись можно добавить так:</p>
21
<p>Первое уведомление сообщит о том, что отсутствует запись соседа для запрошенного IP-адреса. Эту запись можно добавить так:</p>
22
<p>Но перед нами временная запись, а значит, по окончании срока действия удалять её не придётся. В случае устаревания записи поступит уведомление для обновления. В тот момент, когда хост получит ответ proxy на запрос на обнаружение соседей, он сможет отправить кадр с MAC-адресом, который мы указали в качестве адреса назначения. Второе уведомление относится к отсутствию FDB записи для данного MAC-адреса. Добавить соответствующую запись можно посредством другой команды:</p>
22
<p>Но перед нами временная запись, а значит, по окончании срока действия удалять её не придётся. В случае устаревания записи поступит уведомление для обновления. В тот момент, когда хост получит ответ proxy на запрос на обнаружение соседей, он сможет отправить кадр с MAC-адресом, который мы указали в качестве адреса назначения. Второе уведомление относится к отсутствию FDB записи для данного MAC-адреса. Добавить соответствующую запись можно посредством другой команды:</p>
23
<p>Данная запись тоже временная - в обратном случае это могло бы помешать миграции MAC на локальный VTEP (дело в том, что динамическая запись не переопределяет постоянную запись).</p>
23
<p>Данная запись тоже временная - в обратном случае это могло бы помешать миграции MAC на локальный VTEP (дело в том, что динамическая запись не переопределяет постоянную запись).</p>
24
<p>Такая настройка хорошо работает с глобальным реестром и контейнерами. Но для первых подключений возможно запаздывание сигнала. Мало того, в транспортной сети мультивещание и широковещательная передача доступны не будут. Пример такой стратегии - бэкенд VXLAN в<a>flannel</a>(сетевая матрица для Kubernets).</p>
24
<p>Такая настройка хорошо работает с глобальным реестром и контейнерами. Но для первых подключений возможно запаздывание сигнала. Мало того, в транспортной сети мультивещание и широковещательная передача доступны не будут. Пример такой стратегии - бэкенд VXLAN в<a>flannel</a>(сетевая матрица для Kubernets).</p>
25
<p><em>По материалам статьи "<a>VXLAN & Linux</a>".</em></p>
25
<p><em>По материалам статьи "<a>VXLAN & Linux</a>".</em></p>
26
26