Перейти к основному содержанию

Установка и настройка keepalived на примере MultiFactor Ldap Adapter

Keepalived

Есть два сервера с операционной системой Ubuntu 20.04.4 LTS. Но обоих серверах развёрнут LDAP proxy сервер на базе Multifactor. По сути это обычные LDAPS сервера, которые неплохо было бы объединить в один отказоустойчивый кластер Master — Slave с плавающим виртуальным IP-адресом. Сделаем это с помощью keepalived.

keepalived — это open source программное обеспечение (написано на C), предназначенное для обеспечения функций высокой надежности (high availabilitty) и балансировки нагрузки (load-balancing) в кластерах Linux. За первую функцию отвечает реализация протокола VRRP, а вторая основывается на модуле ядра IPVS.

VRRP (Virtual Router Redundancy Protocol) — сетевой протокол, предназначенный для увеличения доступности маршрутизаторов, выполняющих роль шлюза по умолчанию. Это достигается путём объединения группы маршрутизаторов в один виртуальный маршрутизатор и назначения им общего IP-адреса, который и будет использоваться как шлюз по умолчанию для компьютеров в сети.

IPVS (IP Virtual Server) — модуль ядра Linux, реализующий балансировку нагрузки транспортного уровня, обычно называемую коммутацией уровня 4. L4-маршрутизатор.

Установка keepalived

В популярных ОС keepalived имеется в официальных репозиториях. Deb:

apt update
apt install keepalived

Rpm:

yum install keepalived

Настройка кластера

  • На первом сервере настроен IP адрес: 10.12.49.150
  • На втором сервере настроен IP адрес: 10.12.49.151

Выделяем новый IP адрес, который будет использоваться в качестве виртуального: 10.12.49.155.

Настраиваем конфигурационный файл /etc/keepalived/keepalived.conf на первом сервере:

cd /etc/keepalived
vim keepalived.conf

Содержимое:

vrrp_script chk_service {
        script "/opt/multifactor-ldap.check.sh"
        interval 3
        weight 100
        user mfa
}

vrrp_instance VI_mf_ldap {
        interface ens160
        state MASTER
        priority 100
        virtual_router_id 172
        advert_int 1
        unicast_src_ip 10.12.49.150
        unicast_peer {
                10.12.49.151
        }
        virtual_ipaddress {
                10.12.49.155
        }
        track_script {
                chk_service
        }
}

Настраиваем конфигурационный файл /etc/keepalived/keepalived.conf на втором сервере:

cd /etc/keepalived
vim keepalived.conf

Содержимое:

vrrp_script chk_service {
        script "/opt/multifactor-ldap.check.sh"
        interval 3
        weight 100
        user mfa
}

vrrp_instance VI_mf_ldap {
        interface ens160
        state BACKUP
        priority 50
        virtual_router_id 172
        advert_int 1
        unicast_src_ip 10.12.49.151
        unicast_peer {
                10.12.49.152
        }
        virtual_ipaddress {
                10.12.49.155
        }
        track_script {
                chk_service
        }
}

Давайте посмотрим, что у нас тут есть.

  • vrrp_script — скрипт проверки сервиса, chk_service — имя функции
    • script — скрипт может быть любым, он должен вернуть код ответа 0 если MultiFactor Ldap Adapter работает нормально, или любой другой ответ если не работает
    • interval — периодичность запуска скрипта проверки в секундах
    • weight — значение, на которое будет уменьшен приоритет сервера, в случае перехода в состояние FAULT
    • user — пользователь, под которым запускается скрипт, в данном случае mfa — пользователь MultiFactor Ldap Adapter
  • vrrp_instance — экземпляр сервиса, назовём VI_mf_ldap
    • interface — имя сетевого интерфейса
    • state — начальное состояние при запуске. На главном MASTER, на втором BACKUP
    • priority — приоритет выбора главного сервера
    • virtual_router_id — уникальный идентификатор VRRP экземпляра, должен быть одинаковым на всех серверах экземпляра VRRP
    • advert_int — периодичность оповещения мастером других нод время в секундах, если за данное время мастер не успеет отправить широковещательный сигнал, начнутся выборы другого мастера на основе priority
    • unicast_src_ip — адрес источник VRRP пакетов
    • unicast_peer — адреса получатели VRRP пакетов
    • virtual_ipaddress — блок виртуальных IP адресов, которые будут активны на мастере, должны совпадать на всех серверах экземпляра VRRP
    • track_script — мониторинг с использованием скрипта, который должен возвращать 0 если проверка завершилась успешно

Есть примеры с использованием опции authentication. Она устарела и была удалена из VRRPv2 в спецификации RFC3768 в 2004 году. Рекомендуется избегать использования этой опции.

 
Keepalived Configuration Manual Page

Создадим скрипт /opt/multifactor-ldap.check.sh, он должен вернуть код ответа 0, если сервис MultiFactor Ldap Adapter работает нормально.

#!/bin/bash

systemctl is-active multifactor-ldap > /dev/null 2>&1

Дадим права на него пользователю mfa:

chown mfa: /opt/multifactor-ldap.check.sh
chmod 700 /opt/multifactor-ldap.check.sh

Запуск кластера

На мастере:

systemctl enable keepalived
systemctl start keepalived

systemctl status keepalived
ip a

keepalived

Мы увидели второй виртуальный IP адрес 10.12.49.155.

На бэкапе:

systemctl enable keepalived
systemctl start keepalived

systemctl status keepalived
ip a

linux

Проверяем на бэкапе работу VRRP:

Ловим VRRP пакеты с помощью tcpdump

tcpdump -i ens160 vrrp

linux

Для проверки остановим на мастере службу multifactor-ldap.

systemctl stop multifactor-ldap

linux

И виртуальный IP переехал на вторую ноду.

Ещё полезно

Всё что хотел, я настроил. Еще можно посмотреть в сторону настройки действий при смене состояния, например, логирование.

В блоке vrrp_instance:

vrrp_instance web {
    ...
    notify /etc/keepalived/log.sh root
}

Содержимое /etc/keepalived/log.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
  • $0 — путь до скрипта, который запускает (/etc/keepalived/log.sh)
  • $1 — тип vrrp. Может быть GROUP или INSTANCE
  • $2 — имя инстанса или группы
  • $3 — состояние. Могут быть MASTER, BACKUP, FAULT, * (любое)
  • $4 — приоритет ноды, который указан в конфигурационном файле keepalived
  • $@ — все вышеперечисленные параметры через пробел

В SELinux для запуска на выполнение скриптов файлу должен быть присвоен контекст безопасности keepalived_unconfined_script_exec_t.

semanage fcontext -a -t keepalived_unconfined_script_exec_t /etc/keepalived/log.sh

#для отмены
#restorecon -R -v /etc/keepalived/log.sh

Ссылки

MultiFactor Ldap Adapter — установка на Linux

https://keepalived.org

 

Похожие материалы