IDCFクラウド LVS で負荷分散

IDCFクラウド上でLVSを使う分には、参考になる記事もあってそれほど難しくなさそうに思った。ただ、自分の環境の場合、仮想サーバ内でブリッジ接続したLXCコンテナ上でLVSを利用、あるいは仮想サーバ上でLVSを利用して、LXCコンテナに振り分けるといった構成を取りたい。まずはLXCコンテナ上でのLVS運用を検証してみた。コンテナ上では、kernelモジュールやパラメータを変更することはできない。ホストOSのそれを継承するだけなので、とりあえずホストOS側にipvsadmをインストールする。振り分けに必要なkernelパラメータ2つも有効化する。CentOS7だとnet.ipv4.ip_forwardは最初から有効。net.ipv4.vs.conntrackはipvsadmを動かさないと設定できなかったので、一旦ipvsadmを起動してから有効化した。

yum install ipvsadm
sysctl net.ipv4.ip_forward net.ipv4.vs.conntrack
systemctl start ipvsadm
sysctl -w net.ipv4.vs.conntrack = 1
systemctl stop ipvsadm

ホストOS側でこの設定を加えてからコンテナ上でも同様にipvsadmを動かしてみようとしたが、なぜかnet.ipv4.vs.conntrackの設定が引き継がれない。LVSにはnat方式とDR方式があるが、この状態ではnat方式を動かすことが出来ない。DR方式は振り分けられるクライアント側にネットワーク設定を加える必要があるので、できればサーバ側で設定が完結するnat方式を使いたい。ネットワークの処理コストを考慮してDR方式を選択するケースも多いが、ネットワーク構成が複雑化するのと、どうせ大したトラフィックはないので自分の環境ではnat方式で充分。わざわざホストOSにもLVSのパッケージやパラメータを加えた上でコンテナ上で使うという構成もイマイチなので、おとなしくホストOS側でLVSを使うことにした。

先の設定に加えてvrrpの冗長構成をとるためにkeepalivedもインストール。VIPはIDCFクラウドで割当範囲外となっているIPレンジから適当にピックアップする。今回は10.100.5.11にした。このVIP用のNAT設定をfirewall-cmdで加える。ホストOSはsv1(10.100.0.10)とsv2(10.100.0.20)の2台で、それぞれの中にweb1(10.100.0.11)とweb2(10.100.0.21)というコンテナを用意して、そこへ振り分ける。keepalived.confの設定ができたらkeepalivedを起動し、ipvsadmで設定を確認する。また、VIPが正しく振られていることも確認する。

firewall-cmd --permanent --direct --add-rule ipv4 nat POSTROUTING 0 -m ipvs --vaddr 10.100.5.0/24 -j SNAT --to-source 10.100.0.10
firewall-cmd --reload
yum install keepalived
vi /etc/keepalived/keepalived.conf
    :
global_defs {
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state MASTER
    priority 100
    interface br0
    virtual_router_id 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 7890
    }
    virtual_ipaddress {
        10.100.5.11/21
    }
}

virtual_server 10.100.5.11 80 {
    delay_loop 6
    lb_algo rr
    lb_kind nat
    protocol TCP

    real_server 10.100.0.11 80 {
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 1
            nb_get_retry 2
            delay_before_retry 1
        }
    }
    real_server 10.100.0.21 80 {
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 1
            nb_get_retry 2
            delay_before_retry 1
        }
    }
}

systemctl start keepalived
ipvsadm -L
ip a

これで当初の予定通り仮想ブリッジの内側にいるコンテナにLVSで振り分けることが出来た。同じようにdnsの振り分けも設定して、dnsの冗長化もLVSで行うような形にした。sv2にも同じようにbackupとしての設定を加える。変更点はstateをBACKUPにするのとpriorityをmasterより低く設定すること。sv1側のkeepalivedを停止すると、きちんとsv2にフェールオーバすることも確認できた。TCPの通信であれば備え付けの仮想ルータでも分散可能だが、ヘルスチェックを任意に設定できる利点があるのでHTTPもLVSで振り分けるつもりだ。

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)