Настройка VRRP для кластера серверов BareMetal с использованием Keepalived
Примечание
Сервис Yandex BareMetal находится на стадии Preview.
VRRP
Отказоустойчивость достигается за счет объединения в группу двух и более маршрутизаторов в один виртуальный маршрутизатор, который выступает шлюзом по умолчанию для обслуживаемых сегментов сети. Протокол VRRP позволяет создать виртуальный IP-адрес и передавать его между участниками группы, за счет чего повышается доступность шлюза.
В данном руководстве приводится пример организации на серверах BareMetal высокодоступной конфигурации прокси-сервера, в которой функции проксирования симметрично настроены на двух и более узлах HAProxy
Схема решения
В зоне доступности ru-central1-m
вы настроите окружение из двух приватных подсетей subnet-m3
и subnet-m4
, созданных соответственно в пулах серверов ru-central1-m3
и ru-central1-m4
. Эти подсети вы объедините в виртуальный фрагмент сети (VRF) vrrp-vrf
.
В подсети subnet-m3
вы создадите два сервера BareMetal — master-server-m3
и backup-server-m3
, которые соответственно будут выполнять роли MASTER
и BACKUP
в VRRP-группе. На двух этих серверах вы запустите сервис Keepalived и настроите с его помощью виртуальный IP-адрес для группы серверов в пуле ru-central1-m3
.
В подсети subnet-m4
в пуле серверов ru-central1-m4
вы создадите сервер BareMetal client-server-m4
, который будет выступать в качестве клиента при использовании виртуального IP-адреса, созданного в пуле ru-central1-m3
.
Данное решение позволяет продемонстрировать комплексную работу клиентского изолированного VRF с маршрутизацией уровня L3 сетевой модели OSIru-central1-m3
и ru-central1-m4
, а также работу широковещательного протокола VRRP на уровне L2 в пуле серверов ru-central1-m3
.
Примечание
Распространение широковещательного трафика (на уровне L2 сетевой модели OSI) происходит только в пределах одного пула серверов и только для группы серверов, находящихся в одной и той же сети.
Чтобы настроить отказоустойчивый кластер серверов BareMetal с использованием VRRP:
- Подготовьте облако к работе.
- Создайте виртуальный сетевой сегмент.
- Создайте приватные подсети.
- Арендуйте серверы BareMetal.
- Настройте Keepalived на серверах пула ru-central1-m3.
- Убедитесь в работоспособности решения.
См. также Как отказаться от аренды серверов.
Перед началом работы
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
В стоимость предлагаемого решения входит плата за аренду серверов BareMetal (см. тарифы Yandex BareMetal).
Создайте виртуальный сетевой сегмент
Чтобы связать несколько приватных подсетей на уровне L3 сетевой модели OSI, их необходимо объединить в виртуальный фрагмент сети (VRF).
Создайте новый VRF:
- В консоли управления
выберите каталог, в котором вы будете создавать инфраструктуру. - В списке сервисов выберите BareMetal.
- На панели слева выберите
VRF и нажмите кнопку Создать VRF. - В поле Имя задайте имя VRF:
vrrp-vrf
. - Нажмите кнопку Создать VRF.
Создайте приватные подсети
Создайте две приватные подсети в разных пулах серверов и добавьте их в созданный ранее виртуальный фрагмент сети:
- В консоли управления
выберите каталог, в котором вы создаете инфраструктуру. - В списке сервисов выберите BareMetal.
- На панели слева выберите
Приватные подсети и нажмите кнопку Создать подсеть. - В поле Пул выберите пул серверов
ru-central1-m3
. - В поле Имя задайте имя подсети:
subnet-m3
. - Включите опцию IP-адресация и маршрутизация.
- В поле Виртуальный сетевой сегмент (VRF) выберите созданный ранее сегмент
vrrp-vrf
. - В поле CIDR укажите
172.28.1.0/24
. - Нажмите кнопку Создать подсеть.
- Аналогичным образом создайте приватную подсеть
subnet-m4
в пуле серверовru-central1-m4
c CIDR172.28.2.0/24
.
Арендуйте серверы BareMetal
-
В консоли управления
выберите каталог, в котором вы создаете инфраструктуру. -
В списке сервисов выберите BareMetal и нажмите кнопку Заказать сервер.
-
В поле Пул выберите пул серверов
ru-central1-m3
. -
В блоке Конфигурация выберите подходящую конфигурацию сервера.
-
(Опционально) В блоке Диск настройте разметку дисков:
-
Нажмите кнопку Настроить разделы диска.
-
Укажите параметры разделов. Чтобы создать новый раздел, нажмите кнопку
Добавить раздел.Примечание
Чтобы самостоятельно собрать RAID-массивы и настроить разделы дисков, нажмите кнопку Разобрать RAID.
-
Нажмите кнопку Сохранить.
-
-
В блоке Образ выберите образ Ubuntu 24.04.
-
В блоке Условия аренды выберите период, на который арендуете сервер. По окончании указанного периода аренда сервера будет автоматически продлена на такой же период.
-
В блоке Сетевые настройки:
- В поле Приватная подсеть выберите созданную ранее подсеть
subnet-m3
. - В поле Публичный адрес выберите
Автоматически
.
- В поле Приватная подсеть выберите созданную ранее подсеть
-
В блоке Доступ:
-
В поле Пароль воспользуйтесь одним из вариантов создания пароля для root-пользователя:
-
Чтобы сгенерировать пароль для root-пользователя, выберите опцию
Новый пароль
и нажмите кнопку Сгенерировать.Важно
Этот вариант предусматривает ответственность пользователя за безопасность пароля. Сохраните сгенерированный пароль в надежном месте: он не сохраняется в Yandex Cloud, и после заказа сервера вы не сможете посмотреть его.
-
Чтобы использовать пароль root-пользователя, сохраненный в секрете Yandex Lockbox, выберите опцию
Секрет Lockbox
:В полях Имя, Версия и Ключ выберите соответственно секрет, его версию и ключ, в которых сохранен ваш пароль.
Если у вас еще нет секрета Yandex Lockbox, нажмите кнопку Создать, чтобы создать его.
Этот вариант позволяет вам как задать собственный пароль (тип секрета
Пользовательский
), так и использовать пароль, сгенерированный автоматически (тип секретаГенерируемый
).
-
-
В поле Открытый SSH-ключ выберите SSH-ключ, сохраненный в вашем профиле пользователя организации.
Если в вашем профиле нет сохраненных SSH-ключей или вы хотите добавить новый ключ:
- Нажмите кнопку Добавить ключ.
- Задайте имя SSH-ключа.
- Загрузите или вставьте содержимое открытого SSH-ключа. Пару SSH-ключей для подключения к серверу по SSH необходимо создать самостоятельно.
- Нажмите кнопку Добавить.
SSH-ключ будет добавлен в ваш профиль пользователя организации.
Если в организации отключена возможность добавления пользователями SSH-ключей в свои профили, добавленный открытый SSH-ключ будет сохранен только в профиле пользователя создаваемого сервера BareMetal.
-
-
В блоке Информация о сервере в поле Имя задайте имя сервера:
master-server-m3
. -
Нажмите кнопку Заказать сервер.
-
Аналогичным способом арендуйте еще два сервера: с именем
backup-server-m3
в пуле серверовru-central1-m3
и с именемclient-server-m4
и подсетьюsubnet-m4
в пуле серверовru-central1-m4
.
На открывшейся странице со списком серверов BareMetal отобразится информация обо всех созданных серверах. В поле Публичный адрес таблицы скопируйте публичные IP-адреса серверов — они понадобятся для подключения к серверам по SSH.
Примечание
Подготовка серверов и установка на них операционных систем может занять до 45 минут — в это время серверы будут находиться в статусе Provisioning
. После завершения установки ОС серверы перейдут в статус Ready
.
Настройте Keepalived на серверах пула ru-central1-m3
На этом этапе вы установите, настроите и запустите сервис Keepalivedru-central1-m3
.
Используйте приведенную ниже инструкцию, чтобы настроить оба сервера — master-server-m3
и backup-server-m3
.
-
Подключитесь к серверу по SSH, использовав сохраненный на предыдущем шаге публичный IP-адрес этого сервера.
-
Установите сервис Keepalived, выполнив команду:
sudo apt update && sudo apt install keepalived -y
-
Посмотрите список сетевых интерфейсов сервера:
ip a
Результат:
... 5: etx2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 00:02:c9:35:fd:31 brd ff:ff:ff:ff:ff:ff altname enp6s0d1 inet 172.28.1.2/24 metric 100 brd 172.28.1.255 scope global dynamic etx2 valid_lft 3512sec preferred_lft 3512sec inet6 fe80::202:c9ff:fe35:fd31/64 scope link valid_lft forever preferred_lft forever
В выводе команды найдите интерфейс с IP-адресом, относящимся к диапазону
172.28.1.0/24
, назначенному приватной подсетиsubnet-m3
. В примере выше это интерфейс с идентификаторомetx2
. Идентификатор интерфейса понадобится далее, при настройке Keepalived. -
Создайте файл конфигурации Keepalived:
sudo nano /etc/keepalived/keepalived.conf
-
Добавьте в созданный файл следующую конфигурацию:
MasterBackupvrrp_instance M3_1 { state MASTER interface etx2 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass hGoVjTjSYQq3Epm } virtual_ipaddress { 172.28.1.254 } preempt }
vrrp_instance M3_2 { state BACKUP interface etx2 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass hGoVjTjSYQq3Epm } virtual_ipaddress { 172.28.1.254 } preempt }
Где:
-
vrrp_instance
— имя виртуального маршрутизатора:- для сервера с ролью
MASTER
—M3_1
- для сервера с ролью
BACKUP
—M3_2
- для сервера с ролью
-
state
— состояние сервера:MASTER
илиBACKUP
. -
interface
— идентификатор сетевого интерфейса, на котором будет работать виртуальный IP-адрес. В примере выше —etx2
. -
virtual_router_id
— уникальный идентификатор VRRP для группы виртуальных маршрутизаторов. Значение должно совпадать для всех серверов в группе. -
priority
— приоритет, позволяющий определить основной и резервный узлы. Установка приоритета на уровне100
делает сервер основным узлом, на90
— резервным. -
advert_int
— интервал объявления состояния в секундах. -
authentication
— секция с настройками аутентификации для обеспечения безопасности. Содержимое секции должно совпадать для всех серверов в группе. -
virtual_ipaddress
— виртуальный IP-адрес, который будет управляться этим узлом. Виртуальный IP-адрес:- должен относиться к диапазону CIDR, заданному для виртуальной подсети, в которой создана группа северов;
- должен быть не занят;
- должен совпадать для всех серверов в группе.
-
preempt
— позволяет серверу перейти в состояниеMASTER
, если его приоритет оказывается выше чем у текущего мастера в группе.
-
-
Перезапустите сервис Keepalived:
systemctl restart keepalived.service
-
Посмотрите журнал логов сервиса Keepalived, чтобы убедиться, что сервис запущен:
sudo journalctl -u keepalived.service
Результат:
MasterBackupsystemd[1]: keepalived.service - Keepalive Daemon (LVS and VRRP) was skipped because of an unmet condition check (ConditionFileNotEmpty=/etc/keepalived/keepalived.conf). systemd[1]: Starting keepalived.service - Keepalive Daemon (LVS and VRRP)... Keepalived[4045]: Starting Keepalived v2.2.8 (04/04,2023), git commit v2.2.7-154-g292b299e+ Keepalived[4045]: Running on Linux 6.8.0-53-generic #55-Ubuntu SMP PREEMPT_DYNAMIC Fri Jan 17 15:37:52 UTC 2025 (built for Linux 6.8.0) Keepalived[4045]: Command line: '/usr/sbin/keepalived' '--dont-fork' Keepalived[4045]: Configuration file /etc/keepalived/keepalived.conf Keepalived[4045]: NOTICE: setting config option max_auto_priority should result in better keepalived performance Keepalived[4045]: Starting VRRP child process, pid=4046 Keepalived_vrrp[4046]: (/etc/keepalived/keepalived.conf: Line 10) Truncating auth_pass to 8 characters Keepalived[4045]: Startup complete systemd[1]: Started keepalived.service - Keepalive Daemon (LVS and VRRP). Keepalived_vrrp[4046]: (M3_1) Entering BACKUP STATE (init) Keepalived_vrrp[4046]: (M3_1) Entering MASTER STATE
systemd[1]: keepalived.service - Keepalive Daemon (LVS and VRRP) was skipped because of an unmet condition check (ConditionFileNotEmpty=/etc/keepalived/keepalived.conf). systemd[1]: Starting keepalived.service - Keepalive Daemon (LVS and VRRP)... Keepalived[2751]: Starting Keepalived v2.2.8 (04/04,2023), git commit v2.2.7-154-g292b299e+ Keepalived[2751]: Running on Linux 6.8.0-53-generic #55-Ubuntu SMP PREEMPT_DYNAMIC Fri Jan 17 15:37:52 UTC 2025 (built for Linux 6.8.0) Keepalived[2751]: Command line: '/usr/sbin/keepalived' '--dont-fork' Keepalived[2751]: Configuration file /etc/keepalived/keepalived.conf Keepalived[2751]: NOTICE: setting config option max_auto_priority should result in better keepalived performance Keepalived[2751]: Starting VRRP child process, pid=2752 Keepalived_vrrp[2752]: (/etc/keepalived/keepalived.conf: Line 10) Truncating auth_pass to 8 characters Keepalived[2751]: Startup complete Keepalived_vrrp[2752]: (M3_2) Entering BACKUP STATE (init)
Убедитесь в работоспособности решения
-
Убедитесь, что виртуальный IP-адрес был добавлен к сетевому интерфейсу сервера с ролью
Master
:-
Подключитесь по SSH к серверу
master-server-m3
. -
Посмотрите конфигурацию сетевого интерфейса, назначенного приватной подсети
subnet-m3
.ip a
Результат:
... 5: etx2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000 link/ether 00:02:c9:35:fd:31 brd ff:ff:ff:ff:ff:ff altname enp6s0d1 inet 172.28.1.2/24 metric 100 brd 172.28.1.255 scope global dynamic etx2 valid_lft 3575sec preferred_lft 3575sec inet 172.28.1.254/32 scope global etx2 valid_lft forever preferred_lft forever inet6 fe80::202:c9ff:fe35:fd31/64 scope link valid_lft forever preferred_lft forever
Сетевой интерфейс получил дополнительный виртуальный IP-адрес, который был задан в настройках Keepalived —
172.28.1.254/32
.
-
-
С помощью ICMP
-запросов из приватной подсетиsubnet-m4
убедитесь в доступности виртуального IP-адреса, расположенного в приватной подсетиsubnet-m3
:-
Подключитесь по SSH к серверу
client-server-m4
. -
Выполните команду:
ping 172.28.1.254 -s 1024 -c 5
Результат:
PING 172.28.1.254 (172.28.1.254) 1024(1052) bytes of data. 1032 bytes from 172.28.1.254: icmp_seq=1 ttl=62 time=0.211 ms 1032 bytes from 172.28.1.254: icmp_seq=2 ttl=62 time=0.242 ms 1032 bytes from 172.28.1.254: icmp_seq=3 ttl=62 time=0.264 ms 1032 bytes from 172.28.1.254: icmp_seq=4 ttl=62 time=0.312 ms 1032 bytes from 172.28.1.254: icmp_seq=5 ttl=62 time=0.273 ms --- 172.28.1.254 ping statistics --- 5 packets transmitted, 5 received, 0% packet loss, time 4117ms rtt min/avg/max/mdev = 0.211/0.260/0.312/0.033 ms
Использованная команда отправляет и получает пакеты увеличенного размера: все пакеты были доставлены без потерь.
-
-
Убедитесь в корректной работе балансировщика Keepalived:
-
Подключитесь по SSH к серверу
client-server-m4
. -
В отдельном окне терминала подключитесь по SSH к серверу
master-server-m3
.Расположите окна терминала так, чтобы одновременно видеть содержимое обоих окон.
-
В окне терминала с сессией подключения к серверу
client-server-m4
повторно запустите утилитуping
без ограничения на количество повторений:ping 172.28.1.254 -s 1024
В процессе выполнения этого опроса в окне терминала с открытой сессией подключения к серверу
master-server-m3
остановите сервис Keepalived, выполнив команду:sudo systemctl stop keepalived
В момент остановки сервиса наблюдайте за окном терминала с сессией подключения к
client-server-m4
. Результатом корректной работы процесса по передаче виртуального IP-адреса должно быть практически бесшовное переключение ICMP-запросов на резервный хост, при этом выполнение командыping
не должно прерваться.Примечание
Допускается минимальная потеря пакетов (1-3), что обусловлено срабатыванием таймера выбора нового
MASTER
в группе и передаче ему виртуального адреса.Результат:
PING 172.28.1.254 (172.28.1.254) 1024(1052) bytes of data. 1032 bytes from 172.28.1.254: icmp_seq=1 ttl=62 time=0.249 ms ... 1032 bytes from 172.28.1.254: icmp_seq=56 ttl=62 time=0.224 ms 1032 bytes from 172.28.1.254: icmp_seq=57 ttl=62 time=0.314 ms 1032 bytes from 172.28.1.254: icmp_seq=58 ttl=62 time=0.278 ms ^C --- 172.28.1.254 ping statistics --- 58 packets transmitted, 55 received, 5.17241% packet loss, time 58368ms rtt min/avg/max/mdev = 0.185/0.271/0.326/0.035 ms
-
В окне терминала с открытой сессией подключения к серверу
master-server-m3
запустите сервис Keepalived, выполнив команду:sudo systemctl start keepalived
-
-
Проверьте журнал логов сервиса Keepalived на сервере с ролью
BACKUP
:-
Подключитесь по SSH к серверу
backup-server-m3
. -
Посмотрите журнал логов сервиса Keepalived:
sudo journalctl -u keepalived.service
Результат:
... # регистрация события о переключении на MASTER в момент остановки сервиса на исходном основном узле Feb 19 07:08:07 backup-server-m3 Keepalived_vrrp[2752]: (M3_2) Entering MASTER STATE # регистрация события о переключении на BACKUP при восстановлении работы сервиса на исходном основном узле Feb 19 07:08:31 backup-server-m3 Keepalived_vrrp[2752]: (M3_2) Master received advert from 172.28.1.2 with higher priority 100, ours 90 Feb 19 07:08:31 backup-server-m3 Keepalived_vrrp[2752]: (M3_2) Entering BACKUP STATE ...
Как видно из журнала работы сервиса и добавленных в него комментариев, после остановки сервиса Keepalived на сервере
master-server-m3
, роль основного узла перешла к серверуbackup-server-m3
. После восстановления работоспособности сервиса на сервереmaster-server-m3
роль основного узла была ему возвращена, а серверbackup-server-m3
вновь стал резервным.
-
Как отказаться от аренды серверов
Удалить серверы BareMetal нельзя. Вместо этого можно отказаться от продления их аренды.
Чтобы перестать платить за созданные ресурсы, откажитесь от продления аренды созданных ранее серверов BareMetal.