Hetzner cloud предоставляет возможность использовать плавающий IP (Floating IP), но нет механизма автоматического переключения между серверами. Однако есть api — hcloud.
Будем использовать связку hcloud + bash + keepalived для того, чтобы решить нашу задачу и автоматизировать процесс переключения IP между серверами.
Для начало проверьте, что настроен Floating IP непосредственно на серверах к которым мы будем привязывать данную схему.
1 |
cat /etc/sysconfig/network-scripts/ifcfg-eth0:1 |
1 2 3 4 5 6 7 |
BOOTPROTO=static DEVICE=eth0:1 IPADDR=IP PREFIX=32 TYPE=Ethernet USERCTL=no ONBOOT=yes |
Если сделали правки, перезагружаем сеть
1 |
sudo service networking restart |
Установка Keepalived
Если устанавливать из репозиториев centos 7 то по-умолчанию будет установлена версия 1.3.5
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
yum install keepalived . . . ============================================================= Package Version ============================================================= Installing: keepalived 1.3.5-16.el7 Installing for dependencies: ipset-libs 7.1-1.el7 lm_sensors-libs 3.4.0-8.20160601gitf9185e5.el7 mariadb-libs 1:5.5.64-1.el7 net-snmp-agent-libs 1:5.7.2-43.el7_7.3 net-snmp-libs 1:5.7.2-43.el7_7.3 Transaction Summary ============================================================= |
Я буду собирать из исходников 2-ю версию
Установим необходимые зависимости:
1 2 3 |
sudo yum update sudo yum group install "Development Tools" -y yum install openssl-devel wget -y |
Скачиваем исходники и начинаем процесс сборки
1 2 3 4 5 6 7 8 |
wget http://www.keepalived.org/software/keepalived-2.0.20.tar.gz tar xzvf keepalived* cd keepalived-2.0.20 ./configure make sudo make install |
Создадим сервис файл
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
cat > /etc/systemd/system/keepalived.service <<EOF # # keepalived control files for systemd # # Incorporates fixes from RedHat bug #769726. [Unit] Description=LVS and VRRP High Availability monitor After=network.target ConditionFileNotEmpty=/etc/keepalived/keepalived.conf [Service] Type=simple # Ubuntu/Debian convention: EnvironmentFile=-/etc/default/keepalived ExecStart=/usr/local/sbin/keepalived --dont-fork ExecReload=/bin/kill -s HUP $MAINPID # keepalived needs to be in charge of killing its own children. KillMode=process [Install] WantedBy=multi-user.target EOF |
Перечитаем конфиги сервисов и сделаем enable для нашего нового
1 2 |
sudo systemctl daemon-reload sudo systemctl enable keepalived |
Настройка Keepalived
Далее самое интересно, настройка Keepalived в режиме мастер и бекап сервер.
Для первого, мастер, сервера конфиг следующий
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
cat > /etc/keepalived/keepalived.conf <<EOF global_defs { script_user root enable_script_security } vrrp_script chk_service { script "/usr/bin/pgrep keepalived" interval 2 } vrrp_instance VI_1 { interface eth0 state MASTER priority 200 virtual_router_id 33 unicast_src_ip <IP - текущего мастер сервера> unicast_peer { <IP второго - бекап сервера> } authentication { auth_type PASS auth_pass <задать пароль - max 8 символов, необходим для общения между серверами keepalived> } track_script { chk_service } notify_master /etc/keepalived/master.sh } EOF |
Конфиг второго сервера, бекап:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
cat > /etc/keepalived/keepalived.conf <<EOF global_defs { script_user root enable_script_security } vrrp_script chk_service { script "/usr/bin/pgrep keepalived" interval 2 } vrrp_instance VI_1 { interface eth0 state BACKUP priority 100 virtual_router_id 33 unicast_src_ip <IP - текущего сервера, бекап сервера> unicast_peer { <IP - мастер сервера> } authentication { auth_type PASS auth_pass <тот же пароль что указан в конфиге мастер сервера> } track_script { chk_service } notify_master /etc/keepalived/master.sh } EOF |
Идея заключается в проверке сервиса keepalived, и в случаи его недоступности выполнении скрипта /etc/keepalived/master.sh. В качестве проверки можно сделать сервис nginx например или иной другой критичный для вас.
Настройка hcloud api и скрипта для keepalived
Для того, чтобы обратится из скрипта /etc/keepalived/master.sh указанного в конфиге keepalived к hetzner cloud нам необходимо установить api — hcloud
1 2 3 |
cd /tmp && wget https://github.com/hetznercloud/cli/releases/download/v1.16.1/hcloud-linux-amd64.tar.gz tar xvfz hcloud-linux-amd64.tar.gz mv ./hcloud /usr/bin/ |
Проверим, чтобы в консоле hcloud нам возвращал информацию
Создадим скрипт master.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
cat > /etc/keepalived/master.sh << 'EOF' #!/bin/bash export HCLOUD_TOKEN='<token создается в Hetzner Cloud в конкретном проекте где размещены наши два сервера мастер и бекап>' ME=`curl http://169.254.169.254/hetzner/v1/metadata/instance-id` HTTP_IP_CURRENT_SERVER_ID=`hcloud floating-ip describe http | grep 'Server:' -A 1 | tail -n 1 | sed 's/[^0-9]*//g'` if [ "$HTTP_IP_CURRENT_SERVER_ID" != "$ME" ] ; then n=0 while [ $n -lt 10 ] do hcloud floating-ip assign http $ME && break n=$((n+1)) sleep 3 done fi EOF |
В переменной HTTP_IP_CURRENT_SERVER_ID указать имя floating-ip который создан панели Hetzner Cloud предварительно, в данном примере это имя — http.
Сделаем файл исполняющимся
1 |
chmod +x /etc/keepalived/master.sh |
Перезагружаемся
1 |
sudo service keepalived restart |
В качестве дополнения, rpm пакет собранной версии keepalived для centos 7 на ядре 3.10
keepalived-2.0.20-1.x86_64.rpm
Ссылки:
Оригинал статьи https://vitobotta.com/2020/03/20/haproxy-kubernetes-hetzner-cloud/