LVS (Linux Virtual Server)
ちょっと勉強する時間ができたので、ロードバランサの勉強をしてみた。LVS は。。。というか wiki の説明が詳しいので説明はそちらを参考、なのですがvagrant で NAT転送した場合にすこしハマッタとこがあるので毎度の自分メモ。今回、vagrant の nic についてちょっとした小ネタ発見したので結構よかったw
varant の 複数nic指定
public_network, private_network を同時に指定できるって知らんかった。ただし順番あるのでそこは注意すること。
config.vm.define :nictest do |node|
node.vm.network :public_network, ip: "192.168.0.201"
node.vm.network :private_network, ip: "192.168.11.117"
end
と指定した場合、public_network が「eth1」、private_network が「eth2」でnicが作成される。これ便利やw
$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:4f:b8:06 brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
inet6 fe80::a00:27ff:fe4f:b806/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:e0:ee:d2 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.201/24 brd 192.168.0.255 scope global eth1
inet6 fe80::a00:27ff:fee0:eed2/64 scope link
valid_lft forever preferred_lft forever
4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 08:00:27:10:b4:f6 brd ff:ff:ff:ff:ff:ff
inet 192.168.11.117/24 brd 192.168.11.255 scope global eth2
inet6 fe80::a00:27ff:fe10:b4f6/64 scope link
valid_lft forever preferred_lft forever
ネットワーク構成
図のようなネットワーク構成を作成してみます。①にアクセスするのは、同一ネットワークないの他の機器を想定してます。
# lvs
config.vm.define :nictest do |node|
node.vm.hostname = "lvs"
node.vm.network :public_network, ip: "192.168.0.201"
node.vm.network :private_network, ip: "192.168.11.117"
end
# node1
config.vm.define :node1 do |node|
node.vm.hostname = "node1"
node.vm.network :private_network, ip: "192.168.11.118"
end
# node2
config.vm.define :node2 do |node|
node.vm.hostname = "node2"
node.vm.network :private_network, ip: "192.168.11.119"
end
lvs(ロードバランサー)側の設定
ipvsadm のインストールと、ポート転送の設定をします。
$ sudo yum install ipvsadm
$ sudo vi /etc/sysctl.conf
net.ipv4.ip_forward = 1 ← 0を1に
$ sudo /sbin/sysctl -p
$ sudo /sbin/sysctl -a | grep net.ipv4.ip_forward
ipvsadm の設定。DNSラウンドロビン&NATの設定をします。
$ sudo ipvsadm -C
$ sudo ipvsadm -A -t 192.168.0.201:80 -s rr
$ sudo ipvsadm -a -t 192.168.0.201:80 -r 192.168.11.118:80 -m
$ sudo ipvsadm -a -t 192.168.0.201:80 -r 192.168.11.119:80 -m
$ sudo /etc/init.d/ipvsadm save
$ sudo cat /etc/sysconfig/ipvsadm
$ sudo chkconfig ipvsadm on
$ sudo ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.0.201:http rr
-> 192.168.11.118:http Masq 1 0 0
-> 192.168.11.119:http Masq 1 0 0
node1, node2 側の設定
Apache, nginx, node.js なんでもいいですw
が、まあ無難に Apache をインストールしておきますかね。
$ sudo su
# yum install httpd
# sudo service httpd start
# chkconfig httpd on
# echo "node" > /var/www/html/index.html
gw の設定をします。lvs の eth2(192.168.11.117) を指定しますが、node1, node2 側から外部(インタネットー側)にアクセスすることができなくなるので注意が必要です。
$ sudo route add default gw 192.168.11.117
$ netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
10.0.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.11.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth1
0.0.0.0 192.168.11.117 0.0.0.0 UG 0 0 0 eth1
アクセスしてみる
curl 192.168.0.201
にアクセスしてみてみるべし。うまく node1, node2 にアクセスされると思います(Apacheのログを見るのもいいね)。
動作が不安定
なにが原因か不明なのですが、10分経過すると突然アクセスできなくなる現象があります。
まあこれきっと、vagrant のなにか?が悪さしてるんだろうな?って感じでみてますが、nat は調子悪いので DSR を使っています。