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で振り分けるつもりだ。