null

KeepAlived: конфигурация плавающего IP на CentOS 7

Плавающий IP адрес (или виртуальный, далее VIP) используется для обеспечения отказоустойчивости в кластерах.
Кластер конфигурируется таким образом, что плавающий IP присвоен только одному узлу
в каждый момент времени. Если узел с VIP стал недоступен, то VIP присваивается standby узлу.
Тогда standby узел посылает оповещение (gratuitous ARP), чтобы оповестить остальных участников сети
о смене MAC адреса интерфейса с присвоенным VIP.

Простыми словами, standby узел "забирает" IP адрес себе, и все запросы начинают идти ему.

Описание примера

Сегодня мы настроим HAProxy без единой точки отказа.
Предположим, что у нас есть 2 узла с установленным HAProxy на них:

| Hostname   | web-node-1    | web-node-2    |   
| IP address | 192.168.20.10 | 192.168.20.11 |
| OS         | CentOS 7      | CentOS 7      |   
| Web server | HAProxy       | HAProxy       |

Ниже будет предполагаться, что в качестве VIP выбран: 192.168.20.15

Установка keepalived

Установим keepalived на оба узла:

# yum install keepalived

Далее, нам нужно следующий параметр Linux Kernel, чтобы включить поддержку
плавающих IP. На обоих узлах:

# echo "net.ipv4.ip_nonlocal_bind = 1" >> /etc/sysctl.conf
# sysctl -p

Теперь займемся конфигурацией keepalived, поместим в файл /etc/keepalived/keepalived.conf
на web-node-1:

! Configuration File for keepalived

vrrp_script chk_haproxy {
  script "killall -0 haproxy" # check the haproxy process
  interval 2                  # every 2 seconds
  weight 2                    # add 2 points if OK
}

vrrp_instance VI_1 {
  interface ens160            # interface to monitor
  state MASTER                # MASTER on web-node-1, BACKUP on web-node-2
  virtual_router_id 51
  priority 101                # 101 on web-node-1, 100 on web-node-2

  virtual_ipaddress {
    192.168.20.15/24          # virtual ip address
  }

  track_script {
    chk_haproxy
  }
}

На web-node-2, соответственно, следующее:

! Configuration File for keepalived

vrrp_script chk_haproxy {
  script "killall -0 haproxy" # check the haproxy process
  interval 2                  # every 2 seconds
  weight 2                    # add 2 points if OK
}

vrrp_instance VI_1 {
  interface ens160            # interface to monitor
  state BACKUP                # MASTER on web-node-1, BACKUP on web-node-2
  virtual_router_id 51
  priority 100                # 101 on web-node-1, 100 on web-node-2

  virtual_ipaddress {
    192.168.20.15/24          # virtual ip address
  }

  track_script {
    chk_haproxy
  }
}

killall -0 haproxy проверяет запущен ли процесс HAProxy.
Узел web-node-1 имеет приоритет 101, поэтому он всегда будет "забирать" VIP себе, если жив.
Таким образом, VIP будет назначен web-node-2, только если web-node-1 перестал отвечать.

Запуск keepalived

Настроим автозапуск сервиса keepalived и запустим его. На обоих узлах:

# systemctl enable --now keepalived.service

Проверка

Проверим, что VIP присвоился интерфейсу ens160. Выполним на web-node-1:

# ip addr | grep "inet" | grep "ens160"
    inet 192.168.20.10/24 brd 192.168.20.255 scope global ens160
    inet 192.168.20.15/24 scope global secondary ens160

Убьем HAProxy на web-node-1 и посмотрим, что будет. На web-node-1:

# systemctl stop haproxy.service

На web-node-2:

# ip addr | grep "inet" | grep "ens160"
    inet 192.168.20.11/24 brd 192.168.20.255 scope global ens160
    inet 192.168.20.15/24 scope global secondary ens160

Как можем заметить, VIP успешно переназначен узлу web-node-2.
При запуске сервиса haproxy на web-node-1, keepalived автоматически
"перенесет" VIP на него, потому что он имеет выше приоритет.