Работа keepalived и прочих утилит для обеспечения отказоустойчивости при помощи vIP в среде EVPN + базовая конфигурация
09 Oct 2020 - somovis
Share on:Работа keepalived и прочих утилит для обеспечения отказоустойчивости при помощи vIP в среде EVPN + базовая конфигурация
Проблема:
- keepalived с настройками по умолчанию использует secondary ip address на физическом интерфейсе в качестве virtual IP, как следствие, наследует MAC-адрес физического интерфейса;
- Поскольку EVPN изучает MAC-адреса на control plane и их распространение в сети передачи данных происходит по BGP, то для каждого сетеобразующего устройства каждый MAC-адрес будет являться уникальным маршрутом;
- Как следствие, при переключении vIP с srv1 на srv2, которые находятся за разными ESI или за разными ESI разных VTEP - произойдет изучение на control plane, а поскольку, у одинакового IP (vIP) адреса будут разные MAC-адреса (наследование от физического интерфейса) - произойдёт анонс двух разных маршрутов. В следствии чего, есть лишь 50% шанс, что данный адрес будет доступен. При переключении vIP обратно будет то же самое.
- Работоспособность будет восстановлена после истечения тайм-аута для данного адреса в ARP/EVPN ARP таблицах.
Решение:
- По возможности использовать L3 и балансировку (резервирование) средствами маршрутизации;
- Если нет возможности использовать L3 и необходимо резервирование L2, то потребуется перейти на виртуальные интерфейсы MACVLAN VEPA mode (так же возможна работа и в BRIDGE mode, но не тестировалось).
Варианты работы с MACVLAN интерфейсом:
- VRRP с виртуальным IP-адресом и MAC-адресом (должны быть одинаковыми на всех srv в рамках группы резервирования;
- Или использовать статическую конфигурацию при помощи скриптов (например, это можно сделать в связке с pacemaker). Виртуальный IP-адрес и MAC-адрес должны быть одинаковыми на всех srv в рамках группы резервирования.
Реализация для работы с keepalived по шагам:
- Если сервис в виртуальной машине, то потребуется на конкретном NIC в гипервизоре для виртуальной машины понизить уровень безопасности, а точнее, требуется включить:
- promiscuous mode;
- MAC address changes;
- forged transmits.
- Требуется обновить ядро и ПО до следующих версий:
kernel >= 3.2
;keepalived >= 2.0.16 (для RHEL7 >= 1.3.5)
.
- Включить promisc на физическом интерфейсе в guest OS/BMS:
ifconfig promisc
;ip link set promisc on
;echo PROMISC=yes >> /etc/sysconfig/network-scripts/ifcfg-
.
- Подгрузить модуль VMAC в ядро:
modprobe vmac
;echo "vmac" > /etc/modules-load.d/vmac.conf
.
- Поменять параметры sysctl в
/etc/sysctl.conf
для необходимой работы с ARP: Хочу заметить, что в строкеnet.ipv4.conf.vrrp/50
указывается интерфейс, наследуемый изvirtual_router_id
в конфигурации keepalived далее, при этом, если конфигурация keepalived ранее не была выполнена, то параметрnet.ipv4.conf.vrrp/50.rp_filter = 0
необходимо применить после конфигурации keepalived и его старта.net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.all.rp_filter = 0 net.ipv4.conf.ens192.rp_filter = 0 net.ipv4.conf.vrrp/50.rp_filter = 0
Для более детального понимания каждого параметра рекомендую ознакомится с документацией по ссылке - www.kernel.org/doc/Documentation/networking/ip-sysctl.txt
- Поменять параметры keevpalived в
/etc/keepalived/test.cfg
, дополнительно опишу часть важных параметров:state BACKUP
- запускает сервис в состоянии backup, далее, после обмена контрольных сообщений с priority, выбирается MASTER;interface
- ассоциируем физический интерфейс;virtual_router_id
- virtual router ID :) Так же важно, что без явного указания имени виртуального интерфейса он будет создан автоматически в виде:vrrp. +
;priority
- приоритет конкретного инстанса keepalived в рамках виртуальной группы (virtual_router_id
). MASTER в виртуальной группе выбирается по верхнему приоритету среди всех инстансов;use_vmac
- позволяет использовать VRRP с virtual MAC. Опционально можно указать имя виртуального интерфейса. *По умолчанию интерфейс MACVLAN находится в режиме VEPA, который отфильтровывает полученные пакеты, MAC-адрес источника которых совпадает с адресом интерфейса MACVLAN. Настройка интерфейса MACVLAN в private mode не будет фильтровать по исходному MAC-адресу. В качестве альтернативы вы можете указатьvmac_xmit_base
, который будет вызывать передачу и прием сообщений VRRP на базовом интерфейсе, в то время как ARP будет работать с интерфейсом vmac;advert_int
- интервал обмена служебными сообщениями, так же выполняет роль keepalive сообщений;nopreempt
- с этой опцией при появлении в виртуальной группе инстанса с более высоким приоритетом позволяет не отдавать тому инстансу состояние MASTER. Полезно при высокой нагрузке для предотвращения потери пакетов, но маршрутизация к vIP может быть не оптимальной;virtual_ipaddress
- собственно virtual IP;unicast_src_ip
- указываем unicast source address физического интерфейса, с которого хотим отправлять служебные пакеты. Без указания данного параметра в некоторых конфигурациях наблюдалась потеря пакетов;unicast_peer
- для большей предсказуемости рекомендуется указывать unicast IP адреса всех инстансов keepalived в конкретной виртуальной группе.vrrp_instance test { state BACKUP interface ens192 virtual_router_id 50 priority 50 use_vmac vmac_xmit_base advert_int 1 nopreempt virtual_ipaddress { 10.50.50.50 } unicast_src_ip 10.50.50.51 unicast_peer { 10.50.50.52 } }
Для более детального понимания каждого параметра рекомендую ознакомится с документацией по ссылке - Note on using VRRP with Virtual MAC address
- Что если используются разные адресные семейства на интерфейсе: Если у вас в ОС используются настройки сети по умолчанию и включен IPv6 (во многих дистрибутивах он включен по умолчанию), а на том srv, на MACVLAN интерфейсе которого на текущий момент времени нету IPv4 адреса (состояние keepalived backup), но есть IPv6 адрес, то vmac адрес MACVLAN интерфейса с разных srv будет виден в сети за разными ES (или разными VTEP и разными ES). Отсюда будут возникать события MACMOVE/duplicate MAC, что недопустимо в среде EVPN (да и не только с EVPN, по хорошему). Чтобы избежать проблем, если у вас не используется IPv6, то проще отключить его на srv с keepalived, но если используется, то нужно использовать тот же самый принцип с одинаковым IPv6 адресом на MACVLAN интерфейсе разных srv в пределах виртуальной группы, как и с IPv4 адресом.
Проверить работоспособность возможно переключая состояния инстансов keepalived, но не рекомендуется делать это чаще 5 раз за 3 минуты, иначе данный MAC может быть автоматически заблокировано на 5 минут, так как это является стандартным параметром некоторых производителей с целью предотвращения MAC-move/MAC-duplicate в сети передачи данных средствами EVPN.
Ссылки
1. www.kernel.org/doc/Documentation/networking/ip-sysctl.txt ↩
2. Note on using VRRP with Virtual MAC address ↩