Vagrant で CentOS6.6, LVS (IPVS) の NAT 転送方法をためしてみる, その1

4 min read読了の目安(約4300字

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

# 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 を使っています。