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/ポートに接続してデータが通過できますが、外部ホスト (クライアント) からは通過できません。lb_type を DR に設定すると、LB 自体に接続することも、外部クライアントに接続することもできなくなります。

sys.net.ipv4.ip_forward は 1 に設定されており、現時点で設定されている LB は 1 つだけです。

答え1

非常に古い質問なので、すでに回答が得られているかどうかはわかりませんが、DR (ダイレクト ルーティング) は NAT とは大きく異なります。NAT では、ロード バランサー (LB) がパケットを実際のサーバーに渡すことでルーターのように動作し、実際のサーバーはパケットを LB に返してクライアントに返します。

DRでは、LBは単なる疑似仲介者です。LBが持つVIPにパケットが到着すると、どのRS(実サーバ)に送信するかを決定します。書き直しMAC アドレスを変更してパケット ヘッダーを変更します。その後、パケットはスイッチに返され、スイッチは一致する MAC アドレスを持つ RS にパケットを配信します。

次に、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に以下を追加すれば解決します

関連情報