Keepalived + LVS não funciona em outros hosts, mas funciona em localhost no LB

Keepalived + LVS não funciona em outros hosts, mas funciona em localhost no LB

Eu tenho um keepalived + LVS configurado, estou tentando começar a trabalhar

Clientes, LB e servidores reais estão todos na mesma sub-rede.

Configuração mantida viva:

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 ...

}

Portanto, se eu definir lb_type como nat, posso conectar-me do próprio LB ao VIP/porta e as coisas passam, mas não de um host externo (cliente). Se eu definir lb_type como DR, nem o LB conectado a si mesmo nem um cliente externo poderão se conectar.

sys.net.ipv4.ip_forward está definido como 1 e há apenas um atm LB configurado.

Responder1

Não sei se você recebeu essa resposta desde que é tão antigo, mas DR (Roteamento Direto) é muito diferente do NAT. O NAT faz com que o balanceador de carga (LB) atue como um roteador, passando o pacote para o servidor real, e o servidor real o repassa ao LB para devolvê-lo ao cliente.

Com DR, o LB é apenas um pseudo-intermediário. Quando um pacote chega no VIP que o LB possui, ele decide para qual RS (servidor real) enviá-lo ereescreveo cabeçalho do pacote alterando o endereço MAC. Em seguida, ele passa o pacote de volta ao switch e o switch o entrega ao RS com o endereço MAC correspondente.

Você então terá que enganar seu RS para que aceite um pacote destinado à sua interface. Normalmente, você faz isso adicionando o VIP a um adaptador de loopback e atribuindo a ele uma máscara de rede 255.255.255.255. Seu daemon de serviço também precisará ser configurado para escutar neste VIP (no Apache você apenas adiciona uma linha Listen xxxx:80 adicional).

Para completar, você tem que lidar com o problema do ARP. Normalmente, adicionando

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

para o seu sysctl.conf cuidará disso

informação relacionada