Используемые термины: Keepalived , Linux .
Мы рассмотрим пошаговую процедуру установки keepalived и настройки кластера Master — Slave с плавающим IP-адресом (VIP — virtual ip). Проверку работоспособности сервиса будем выполнять на примере с веб-сервером NGINX.
Также мы не будем привязываться к конкретному дистрибутиву Linux, учитывая разные варианты.
Настройка сетевого экрана
Установка keepalived
Конфигурирование кластара
Настройка действия при смене состояния
Для корректной работы кластера нужно предусмотреть некоторые настройки безопасности системы.
Keepalived для обеспечения в ысокой доступности использует протокол VRRP. Для его работы фаервол должен пропускать трафик для протокола vrrt на широковещательный адрес 224.0.0.18.
В зависимости от утилиты управления брандмауэром наши действия будут отличаться.
а) Для iptables (как правило, в системах на основе deb):
iptables -I INPUT -p vrrp -d 224.0.0.18 -j ACCEPT
Чтобы сохранить правила, можно использовать iptables-persistent:
apt install iptables-persistent
netfilter-persistent save
б) Для firewalld (как правило, в системах на основе rpm):
firewall-cmd —permanent —add-rich-rule=’rule protocol accept’
firewall-cmd —reload
Для систем, где используется SELinux (по умолчанию, в RPM) мы можем столкнуться с проблемами запуска скриптов notify.
Иногда, администраторы предпочитают просто отключать SELinux. Для этого нужно ввести несколько команд:
setenforce 0
sed -i ‘s/^SELINUX=.*/SELINUX=disabled/g’ /etc/selinux/config
* первая команда отключит SELinux для текущей загрузки, вторая — для последующих. Подробнее в инструкции Как отключить SELinux .
Но мы также рассмотрим варианты настройки сервера без отключения SELinux. Об этом будет ниже (в разделе с настройкой notify).
В популярных дистрибутивах Linux k eepalived включен в официальный репозиторий и может быть установлен из него. В зависимости от типа Linux действия будут немного отличаться.
а) Для систем на базе Deb (Debian / Ubuntu / Astra Linux):
apt update
apt install k eepalived
б) Для систем на базе RPM (Rocky Linux / РЕД ОС):
yum install keepalived
Предположим, что есть два сервера nginx, и нам нужно, чтобы пользователи подключались только к одному из них. Мы настроим кластер с плавающим IP-адресом, который будет добавляться на сетевой интерфейс только для одного из серверов.
Если мы работаем на тестовых серверах, на которых нет nginx, выполняем его установку одной из команд:
apt install nginx
yum install nginx
* первая команда для дистрибутивов deb, вторая — rpm.
Создаем конфигурационный файл.
а) На первом сервере:
vi /etc/keepalived/keepalived.conf
global_defs {
enable_script_security
}
vrrp_script nginx_check {
script «/usr/bin/curl http://127.0.0.1»
interval 5
user nginx
}
vrrp_instance web {
state MASTER
interface eth0
virtual_router_id 254
priority 100
advert_int 2
authentication {
auth_type PASS
auth_pass 12345678
}
virtual_ipaddress {
192.168.0.254
}
track_script {
nginx_check
}
}
б) На втором сервере:
vi /etc/keepalived/keepalived.conf
global_defs {
enable_script_security
}
vrrp_script nginx_check {
script «/usr/bin/curl http://127.0.0.1»
interval 5
user nginx
}
vrrp_instance web {
state BACKUP
interface eth0
virtual_router_id 254
priority 50
advert_int 2
preempt_delay 30
authentication {
auth_type PASS
auth_pass 12345678
}
virtual_ipaddress {
192.168.0.254
}
track_script {
nginx_check
}
}
* оба конфигурационных файла отличаются опцией state . На первом сервере мы задаем ей значение MASTER , предполагая, что он будет основным по умолчанию, второму — BACKUP . Также на втором сервере дополнительна указана директива preempt_delay .
** пройдем по разделам:
*** и опишем опции раздела vrrp_instance :
Так как для проверки работы сервиса мы используем утилиту curl, убедимся, что она есть в системе, установив ее.
а) Для систем на базе Deb (Debian / Ubuntu / Astra Linux):
apt update
apt install curl
б) Для систем на базе RPM (Rocky Linux / РЕД ОС):
yum install curl
Теперь проверим работу keepalived.
Разрешим автозапуск сервиса и запустим его:
systemctl enable keepalived
systemctl start keepalived
Проверим его состояние командой:
systemctl status keepalived
Теперь командой:
ip a
… мы должны на мастере увидеть дополнительный адрес (в нашем примере 192.168.0.254). Это VIP, назначенный keepalived.
Попробуем на этом же сервере остановить nginx:
systemctl stop nginx
VIP должен оказаться на втором сервере.
Теперь запустим nginx:
systemctl start nginx
Через какое-то время, в соответствии с параметром preempt_delay, VIP вернется.
Keepalived предусматривает возможность запуска скрипта, который выполняет любые команды при смене состояния с MASTER на BACKUP и наоборот. Рассмотрим подробнее.
В конфигурационные файлы (раздел vrrp_instance ) добавим:
vi /etc/keepalived/keepalived.conf
vrrp_instance web {
…
notify /etc/keepalived/notify-web.sh root
}
* при смене состояния должен быть выполнен скрипт /etc/keepalived/notify-web.sh от пользователя root .
Теперь создадим сам скрипт, примерно, такого содержания:
vi /etc/keepalived/notify-web.sh
#!/bin/bash
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
SCRIPT_NAME=$0
TYPE=$1
INST_NAME=$2
STATE=$3
PRIOR=$4
ALL_ARGS=$@
case $STATE in
«MASTER») echo «[$(date)] MASTER UP with prior ${PRIOR}» >> «/var/log/keepalived/${INST_NAME}.log»
;;
*) echo «[$(date)] change MASTER. I am slave with prior ${PRIOR}» >> «/var/log/keepalived/${INST_NAME}.log»
;;
esac
* в данном примере мы просто добавляем строку в файл лога. Для сервера, который стал мастером и остальными серверами текст немного отличается. Также обратите внимание на аргументы, которые keepalived передаст скрипту:
Разрешив запускать скрипт на выполнение:
chmod +x /etc/keepalived/notify-web.sh
В нашем конкретном случае также нужно создать каталог для логов:
mkdir /var/log/keepalived
Перезапустим keepalived:
systemctl restart keepalived
Пробуем поиграть с остановкой и запуском nginx на мастере. Мы должны увидеть изменения в логе.
Как было сказано выше, в работе notify могут быть сбои, если система использует SELinux. Для решения проблемы можно использовать разные способы.
SELinux сверяет контексты безопасности процессов и файлов с политиками доступа. Например, для запуска на выполнение скриптов, файлу должен быть присвоен контекст keepalived_unconfined_script_exec_t . В нашем примере это можно сделать командой:
semanage fcontext -a -t keepalived_unconfined_script_exec_t /etc/keepalived/notify-web.sh
Это задаст политику назначения контекста. Чтобы его применить также вводим:
restorecon -R -v /etc/keepalived/notify-web.sh
* не забываем поменять /etc/keepalived/notify-web.sh на полный путь к вашему скрипту.
Второй способ может показаться проще. Нужно использовать каталог, для которого уже выставлен контекст keepalived_unconfined_script_exec_t .
Путь до него — /usr/libexec/keepalived . Переносим наш скрипт в него и меняем путь в конфигурационном файле keepalived.
Zulip — программное обеспечение для реализации корпоративного чата. Разработан в 2012 году, в 2014 был…
Zookeeper — cервис-координатор, который позволяет обеспечить контроль синхронизации данных. Разработан на Java компанией Apache Software…
Zimbra — программное обеспечение для реализации почтового сервиса или, если сказать точнее, автоматизации совместной деятельности…
Zabbix — бесплатная система мониторинга. Позволяет отслеживать состояние сетевых узлов, компьютеров и серверов. Возможности: Поддержка…
YouTube — компания-владелец одноименного портала для просмотра и хранения видео. Чтобы пользоваться данным порталом достаточно…
Yota — провайдер, предоставляющий доступ к сети Интернет по беспроводной связи. Впервые, сервис начал работать…