Keepalived + LVS не работает с других хостов, но работает с локального хоста на LB

Keepalived + LVS не работает с других хостов, но работает с локального хоста на LB

У меня настроены keepalived и LVS. Я пытаюсь приступить к работе.

Клиенты, LB и реальные серверы находятся в одной подсети.

Конфигурация Keepalived:

global_defs {
    notification_email {
        [email protected]
    }
    notification_email_from [email protected]
    smtp_server 127.0.0.1
    smtp_connect_timeout 30
    router_id ukld5p500x
}

vrrp_instance some_service {
    state             MASTER
    interface         em1
    virtual_router_id 100
    priority          100
    virtual_ipaddress {
        10.0.0.75
    }

    track_script {
        chk_fail
    }
}

virtual_server 10.0.0.75 58563 {
    delay_loop      10
    lb_algo     rr
    lb_kind     DR

    protocol        TCP

    real_server 10.0.0.70 58563 {
        weight          1
        TCP_CHECK {
            connect_timeout 3   
            connect_port    58563
        }
    }

    ... more real_servers ...

}

Итак, если я устанавливаю lb_type на nat, то я могу подключиться из самого LB к VIP/port, и все пройдет, но не из внешнего хоста (клиента). Если я устанавливаю lb_type на DR, то ни LB, подключающийся к себе, ни внешний клиент не смогут подключиться.

sys.net.ipv4.ip_forward установлен на 1, и в настоящее время настроен только один LB.

решение1

Не знаю, получили ли вы ответ на этот вопрос, поскольку он очень старый, но DR (прямая маршрутизация) сильно отличается от NAT. NAT заставляет балансировщик нагрузки (LB) действовать как маршрутизатор, передавая пакет реальному серверу, а реальный сервер передает его обратно LB для доставки клиенту.

С DR LB является лишь псевдопосредником. Когда пакет приходит на VIP, который есть у LB, он решает, на какой RS (реальный сервер) его отправить, ипереписываетзаголовок пакета, изменяя MAC-адрес. Затем он передает пакет обратно на коммутатор, а коммутатор доставляет его на RS с соответствующим MAC-адресом.

Затем вам нужно обмануть свой RS, чтобы он принял пакет, предназначенный для его интерфейса. Обычно вы делаете это, добавляя VIP к адаптеру обратной связи и назначая ему сетевую маску 255.255.255.255. Ваш демон службы также должен быть настроен на прослушивание этого VIP (в apache вы просто добавляете дополнительную строку Listen xxxx:80).

В довершение всего, вам придется иметь дело с проблемой ARP. Обычно, добавляя

net.ipv4.conf.eth0.arp_announce = 2
net.ipv4.conf.eth0.arp_ignore = 1

в ваш sysctl.conf позаботится об этом

Связанный контент