Назад | Перейти на главную страницу

keepalived - Virtual не направляет мои запросы на реальные серверы

Я играю с keepalived и запускаю эту настройку на своем главном узле:

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass XXXXXXXXXXXXXXXXXXXXXXXXX
    }
    virtual_ipaddress {
        192.168.178.200/32 dev eth0
        192.168.178.201/32 dev eth0
    }
}

virtual_server 192.168.178.201 8443 {
    delay_loop 10
    protocol TCP
    lb_algo rr
    lb_kind DR

    real_server 192.168.178.210 8443 {
        weight 1
        TCP_CHECK {
          connect_timeout 5
        }
    }

    real_server 192.168.178.211 8443 {
        weight 1
        TCP_CHECK {
          connect_timeout 5
        }
    }

    real_server 192.168.178.212 8443 {
        weight 1
        TCP_CHECK {
          connect_timeout 5
        }
    }
}

На подчиненных узлах у меня такая же установка с более низким priority и state BACKUP.

По причинам тестирования 2 из 3 узлов отключены, и я ожидал, что VIP (.201) балансирует трафик на 192.168.178.211:8443. (.212 и 213 не в сети, .211 онлайн) Я столкнулся с таким поведением 192.168.178.201:8443 доступен только в том случае, если ГЛАВНЫЙ узел - это тот же компьютер, что и доступный серверный компьютер.

В моем случае это означает, что 192.168.178.211:8443 доступен только если 192.168.178.211 является ГЛАВНЫМ узлом. Если т.е. 192.168.178.212 это МАСТЕР-узел, на который не направляется трафик 192.168.178.211:8443.

sysctl.conf:

#keepalived
net.ipv4.ip_nonlocal_bind=1
net.ipv4.ip_forward=1
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.eth0.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.eth0.rp_filter = 2

Кто может мне в этом помочь?

Я понял из вашего вопроса и комментариев, что балансировщики нагрузки и реальные серверы - это одни и те же машины.

Согласно Документация Redhat:

Доступ к виртуальному IP от балансировщиков нагрузки или одного из реальных серверов не поддерживается. Точно так же не поддерживается настройка балансировщика нагрузки на тех же машинах, что и реальный сервер.

Однако это все еще возможно согласно База знаний LVS, но требует немного больше усилий для настройки.

Основываясь на вашем примере, давайте возьмем настройку 3 узлов без сценария отслеживания с одним виртуальным IP-адресом для keepalived-2.0.19 в CentOS 7:

  • виртуальный IP-адрес: 192.168.178.201
  • узел 1: 192.168.178.210 с приоритетом 150
  • узел 2: 192.168.178.211 с приоритетом 100
  • узел 3: 192.168.178.212 с приоритетом 50

Тогда возможная конфигурация для keepalived:

На узле 1

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 150
    advert_int 1
    virtual_ipaddress {
        192.168.178.201/32
    }
}

virtual_server 192.168.178.201 {
    lvs_sched rr
    lvs_method DR
    protocol TCP
    persistence_timeout 50
    delay_loop 10
    real_server 192.168.178.210 {
        TCP_CHECK {
          connect_timeout 5
          connect_port 8443
        }
    }
    real_server 192.168.178.211 {
        TCP_CHECK {
          connect_timeout 5
          connect_port 8443
        }
    }
    real_server 192.168.178.212 {
        TCP_CHECK {
          connect_timeout 5
          connect_port 8443
        }
    }
}

На узле 2

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    virtual_ipaddress {
        192.168.178.201/32
    }
}

virtual_server 192.168.178.201 {
    lvs_sched rr
    lvs_method DR
    protocol TCP
    persistence_timeout 50
    delay_loop 10
    real_server 192.168.178.211 {
        TCP_CHECK {
          connect_timeout 5
          connect_port 8443
        }
    }
    real_server 192.168.178.212 {
        TCP_CHECK {
          connect_timeout 5
          connect_port 8443
        }
    }
}

На узле 3

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 50
    advert_int 1
    virtual_ipaddress {
        192.168.178.201/32
    }
}

virtual_server 192.168.178.201 {
    lvs_sched rr
    lvs_method DR
    protocol TCP
    persistence_timeout 50
    delay_loop 10
    real_server 192.168.178.212 {
        TCP_CHECK {
          connect_timeout 5
          connect_port 8443
        }
    }
}

NB: на каждом узле LVS настроен в соответствии с его приоритетом (все меньше и меньше real_server). Если вы настроите LVS симметрично, пакеты будут бесконечно отправляться туда и обратно между узлами и никогда не отвечал.

Вам необходимо добавить виртуальный IP-адрес в качестве адреса обратной связи на всех узлах. В противном случае узлы BACKUP получают сообщения TCP от балансировщика нагрузки, но не знают, что с ними делать.

На всех узлах в /etc/sysconfig/network-scripts/ifcfg-lo:0

DEVICE=lo:0
IPADDR=192.168.178.201
NETMASK=255.255.255.255
ONBOOT=yes
NAME=loopback

На всех узлах в /etc/sysconfig/networkдобавьте строку

GATEWAYDEV=eth0

На всех узлах, настроить параметры ядра

net.ipv4.conf.ens192.arp_ignore = 1
net.ipv4.conf.ens192.arp_announce = 2
net.ipv4.ip_forward = 1

Ссылки

http://kb.linuxvirtualserver.org/wiki/Building_Two-Node_Directors/Real_Servers_using_LVS_and_Keepalived