Что такое keepalived и VIP
В инструкции рассмотрим настройку Keepalived на двух серверах с использованием одного виртуального IP-адреса (VIP) для обеспечения высокой доступности.
Keepalived
Keepalived — программный инструмент, предназначенный для обеспечения высокой доступности и отказоустойчивости сетевых сервисов. Он первоначально был разработан для работы с Linux Virtual Server (LVS) для балансировки нагрузки, но его функциональность была расширена, и теперь его часто используют для управления Virtual IP (VIP) адресами и для организации механизма failover (переключение на резервный сервер при сбое основного).
Keepalived работает на основе протокола VRRP (Virtual Router Redundancy Protocol), который позволяет нескольким серверам обмениваться информацией о состоянии друг друга.
В случае отказа одного из серверов, другой сервер может автоматически взять на себя его функции, чтобы пользователи не заметили прерывания в работе сервиса.
VIP (Virtual IP)
VIP (Virtual IP Address) — это виртуальный IP-адрес, который не привязан к какому-то конкретному физическому интерфейсу. VIP может быть использован для того, чтобы обеспечить доступ к сервису, который работает на нескольких серверах (например, в кластере). В случае отказа одного сервера, VIP может быть перенесен на другой сервер, обеспечивая непрерывность работы сервиса.
Как они работают вместе
В типичной конфигурации с Keepalived и VIP:
- Один сервер назначается как «главный» или «мастер» и отвечает за управление VIP. Этот сервер обычно активно обслуживает запросы.
- Другой сервер или несколько серверов находятся в режиме ожидания и мониторят состояние мастера с помощью Keepalived.
- Если мастер сервер выходит из строя, один из резервных серверов автоматически берет на себя VIP и начинает обслуживать запросы.
Таким образом, пользователи продолжают получать доступ к сервису без заметных сбоев, даже если один из серверов выходит из строя.
Настройка Keepalived и VIP в Облачной платформе
Для организации описанной схемы нам потребуется 2 сервера в Облачной платформе с ОС Ubuntu в одной приватной сети. Инструкцию по созданию сервера можно найти в документации.
Установку и настройку будем проводить на примере серверов Master (192.168.10.10) и Backup (192.168.10.20) с установленной ОС Ubuntu 22.04. В качестве VIP будем использовать адрес 192.168.10.22.
В большинстве популярных дистрибутивов Linux keepalived доступен в официальных репозиториях и может быть установлен оттуда. Установим и активируем демон Keepalived на двух серверах:
apt update
apt install keepalived
systemctl enable keepalived
После установки необходимо заполнить конфигурационный файл /etc/keepalived/keepalived.conf: nano /etc/keepalived/keepalived.conf
Пример конфигурации для сервера Master:
global_defs {
router_id MASTER
}
vrrp_instance VI_1 {
state MASTER
interface eth0 # Замените на имя вашего сетевого интерфейса
virtual_router_id 51
priority 101 # Установите приоритет выше, чем у резервного сервера
advert_int 1
authentication {
auth_type PASS
auth_pass your_password # Замените на надежный пароль
}
virtual_ipaddress {
192.168.10.22
}
}
Пример конфигурации для сервера Backup:
global_defs {
router_id BACKUP
}
vrrp_instance VI_1 {
state BACKUP
interface eth0 # Замените на имя вашего сетевого интерфейса
virtual_router_id 51
priority 100 # Установите приоритет ниже, чем у основного сервера
advert_int 1
authentication {
auth_type PASS
auth_pass your_password # Должен совпадать с паролем на основном сервере
}
virtual_ipaddress {
192.168.10.22
}
}
Описание параметров:
- global_defs: глобальные определения, включая уникальный идентификатор для данного роутера.
- vrrp_instance: определяет VRRP-инстанс (виртуальный маршрутизатор) с именем VI_1.
- state: устанавливает состояние узла как BACKUP.
- interface: указывает сетевой интерфейс, на котором будет работать VIP.
- virtual_router_id: уникальный идентификатор VRRP для группы виртуальных маршрутизаторов. Должен совпадать с идентификатором на основном сервере.
- priority: приоритет для определения основного и резервного узлов. Установите его ниже, чем у основного сервера.
- advert_int: интервал объявления состояния (в секундах).
- authentication: настройки аутентификации для безопасности. Должен совпадать с паролем на основном сервере.
- virtual_ipaddress: указывает VIP, который будет управляться этим узлом.
Настраивать IP-алиас в любом другом месте, кроме файла конфигурации Keepalived, не требуется. Keepalived автоматически назначит IP-адрес нужному сетевому интерфейсу.
После внесения изменений в конфигурацию запустим Keepalived для применения настроек:
systemctl start keepalived
Проверить статус Keepalived можно командой:
systemctl status keepalived
root@master:~# systemctl status keepalived
● keepalived.service - Keepalive Daemon (LVS and VRRP)
Loaded: loaded (/lib/systemd/system/keepalived.service; enabled; vendor preset: enabled)
Active: active (running)
Main PID: 798 (keepalived)
Tasks: 2 (limit: 1060)
Memory: 5.1M
CPU: 149ms
CGroup: /system.slice/keepalived.service
├─798 /usr/sbin/keepalived --dont-fork
└─803 /usr/sbin/keepalived --dont-fork
Различия конфигураций серверов Master и Backup
Конфигурации серверов Master и Backup в Keepalived имеют несколько ключевых различий, которые определяют, какой из серверов будет основным, а какой — резервным. Основные различия касаются параметров.
Параметр state
- Master: в конфигурации основного сервера этот параметр установлен как MASTER. Это означает, что сервер будет пытаться взять на себя управление VIP при запуске.
- Backup: в конфигурации резервного сервера параметр установлен как BACKUP, что указывает, что сервер будет ждать, пока основной сервер выйдет из строя, прежде чем взять на себя VIP.
Параметр priority
- Master: приоритет на основном сервере выше (например, 101), что позволяет ему выигрывать выбор в пользу MASTER-состояния и управлять VIP.
- Backup: на резервном сервере приоритет ниже (например, 100). Это означает, что он станет MASTER только если основной сервер станет недоступным.
Идентификатор роутера (router_id):
- Master: идентификатор роутера на Master-сервере может быть указан как MASTER, чтобы подчеркнуть его роль.
- Backup: на Backup-сервере этот идентификатор может быть указан как BACKUP.
Это помогает различать конфигурации и легко идентифицировать роли серверов.
Проверка конфигурации
Для начала проверим доступность адреса с помощью ICMP-запросов:
root@test:~# ping 192.168.10.22
PING 192.168.10.22 (192.168.10.22) 56(84) bytes of data.
64 bytes from 192.168.10.22: icmp_seq=1 ttl=64 time=1.48 ms
64 bytes from 192.168.10.22: icmp_seq=2 ttl=64 time=0.274 ms
64 bytes from 192.168.10.22: icmp_seq=3 ttl=64 time=0.263 ms
Подключимся по ssh, чтобы точно убедиться, что подключение будет выполняться к виртуальной машине Master.
ssh root@192.168.10.22
Welcome to Ubuntu 22.04.4 LTS (GNU/Linux 5.15.0-119-generic x86_64)
root@master:~#
Для проверки корректности работы keepalived отключим ВМ Master в панели управления и посмотрим, переключится ли адрес 192.168.10.22 на ВМ Backup.
root@test:~# ping 192.168.10.22
PING 192.168.10.22 (192.168.10.22) 56(84) bytes of data.
64 bytes from 192.168.10.22: icmp_seq=1 ttl=64 time=0.768 ms
64 bytes from 192.168.10.22: icmp_seq=2 ttl=64 time=0.233 ms
64 bytes from 192.168.10.22: icmp_seq=3 ttl=64 time=0.302 ms
64 bytes from 192.168.10.22: icmp_seq=4 ttl=64 time=0.277 ms
При подключении через ssh видим приглашение на сервере Backup:
root@test:~# ssh root@192.168.10.22
root@backup:~#
На сетевом интерфейсе eth0 появился адрес 192.168.20.22, а в логах демона keepalived запись о том, что ВМ является мастером:
root@backup:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether fa:16:3e:72:9e:05 brd ff:ff:ff:ff:ff:ff
altname enp0s3
altname ens3
inet 192.168.10.20/24 brd 192.168.10.255 scope global eth0
valid_lft forever preferred_lft forever
inet 192.168.10.22/32 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::f816:3eff:fe72:9e05/64 scope link
valid_lft forever preferred_lft forever
root@backup:~# systemctl status keepalived
● keepalived.service - Keepalive Daemon (LVS and VRRP)
Loaded: loaded (/lib/systemd/system/keepalived.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2024-08-29 07:57:18 UTC; 6h ago
Main PID: 1036 (keepalived)
Tasks: 2 (limit: 1060)
Memory: 1.9M
CPU: 1.436s
CGroup: /system.slice/keepalived.service
├─1036 /usr/sbin/keepalived --dont-fork
└─1037 /usr/sbin/keepalived --dont-fork
Aug 29 07:57:18 backup Keepalived[1036]: Starting VRRP child process, pid=1037
Aug 29 07:57:18 backup systemd[1]: keepalived.service: Got notification message from PID 1037, but reception only permitted for main PID 1036
Aug 29 07:57:18 backup Keepalived_vrrp[1037]: (/etc/keepalived/keepalived.conf: Line 13) Truncating auth_pass to 8 characters
Aug 29 07:57:18 backup Keepalived[1036]: Startup complete
Aug 29 07:57:18 backup systemd[1]: Started Keepalive Daemon (LVS and VRRP).
Aug 29 07:58:30 backup Keepalived_vrrp[1037]: (VI_1) Entering BACKUP STATE
Aug 29 14:17:35 backup Keepalived_vrrp[1037]: (VI_1) Entering MASTER STATE
Настройка доступа во внешнюю сеть
Если необходим доступ к серверам Master и Backup извне, к VIP адресу можно подключить публичный адрес.
В панели управления добавим новый публичный адрес и привяжем его к порту. Для этого перейдем в карточку приватной сети 192.168.10.0/24 на вкладку Порты, добавим новый порт с адресацией 192.168.10.22 и подключим публичный адрес 87.228.8.202.
Перезапустим службу Keepalived:
systemctl restart keepalived
Проверим доступность публичного адреса:
root@test:~# ping 87.228.8.202
PING 87.228.8.202 (87.228.8.202) 56(84) bytes of data.
64 bytes from 87.228.8.202: icmp_seq=1 ttl=63 time=0.520 ms
64 bytes from 87.228.8.202: icmp_seq=2 ttl=63 time=0.322 ms
64 bytes from 87.228.8.202: icmp_seq=3 ttl=63 time=0.322 ms
При подключении через ssh также видим, что keepalived отрабатывает корректно и подключения по умолчанию попадают на сервер Master, а при его недоступности — на Backup.
Заключение
В этой статье мы рассмотрели настройку Keepalived на двух серверах с использованием одного виртуального IP-адреса (VIP) для обеспечения высокой доступности. Мы использовали адреса из приватной подсети и публичный IP, но вы также можете применять адреса из публичных подсетей.
Keepalived позволяет автоматически переключать VIP с основного сервера на резервный в случае сбоя, обеспечивая непрерывность работы сервиса. Это решение минимизирует простои и повышает надежность вашей инфраструктуры.