ロードバランサを構築 (NAT編)
VirtualBox で作成した仮想マシンを使って、ロードバランサを作成してみる。環境はこんな感じ。
- OS(LB, Web)
- Cent0S 5.3
- keepalived
- 1.1.17
- ipvsadm
- 1.2.1
- apache
- 2.2.3
ネットワーク構成
| | 192.168.0.7/24 (eth0) +-----------+ | lbsrv01 | ロードバランサ +-----------+ | 192.168.1.3/24 (eth1) | +------------------------+ | | | 192.168.1.1/24 | 192.168.1.2/24 +-----------+ +-----------+ | wsrv01 | | wsrv02 | Webサーバ +-----------+ +-----------+
ロードバランサ準備
仮想ディスクイメージの複製
すでに作成してある CentOS 5.3 をインストールした VirtualBox の仮想マシンを複製する。単純に .vdi ファイルをコピーするだけではダメで、専用のコマンドでコピーしなくちゃいけない。
localhost % VBoxManage clonehd CentOS-5.3_Basic.vdi CentOS-5.3_lbsrv01.vdi
VirtualBox で新規仮想マシンの作成
ロードバランサの種類には NAT 構成と DSR 構成があってどちらにしようか迷ったが、まずは簡単そうな NAT 構成で。
作成手順は前回とほぼ同じ。違う箇所は、仮想ディスクイメージを新規作成ではなく、上でコピーしたファイルを使う。あと、NIC は2つ用意する。NIC の 1 つは割当てを「ホストインタエース」(eth0) に、もう 1 つは「内部ネットワーク」(eth1) にする。
パッケージ追加
lbsrv01 % sudo yum install openssl-devel # keepalived の make で必要 lbsrv01 % sudo yum install kernel-devel # 同上 lbsrv01 % sudo yum install rpm-build # rpm パッケージの作成に必要
keepalived のインストール
ソースをダウンロードする。RPMパッケージにしてインストールするつもり。
lbsrv01 % sudo mkdir -p /usr/src/redhat/SOURCES lbsrv01 % cd /usr/src/redhat/SOURCES lbsrv01 % sudo curl -O http://www.keepalived.org/software/keepalived-1.1.17.tar.gz lbsrv01 % sudo tar xzf keepalived-1.1.17.tar.gz
rpm の作成。kernel-devel をインストールしただけで configure を実行すると、 net/core/link_watch.c がなくて
"Use LinkWatch : No"
となるので、カーネルのソースをダウンロードして、$KERNEL_DIR/net/core 以下をコピーする。
lbsrv01 % curl -O http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.8.tar.gz lbsrv01 % tar xzf linux-2.6.18.8.tar.gz lbsrv01 % sudo cp -pr linux-2.6.18.8/net/core/* /usr/src/kernels/2.6.18-128.1.6.el5-i686/net/core/
make。オプションで、カーネルのソースが置かれているディレクトリのパスを指定する。
lbsrv01 % sudo ./configure --with-kernel-dir=/usr/src/kernels/2.6.18-128.1.6.el5-i686 ... ... ... Keepalived configuration ------------------------ Keepalived version : 1.1.17 Compiler : gcc Compiler flags : -g -O2 Extra Lib : -lpopt -lssl -lcrypto Use IPVS Framework : Yes IPVS sync daemon support : Yes Use VRRP Framework : Yes Use LinkWatch : Yes # net/core/link_watch.c がないとここが No になる。 Use Debug flags : No lbsrv01 % sudo make rpm
rpmのパッケージは署名がないとインストールできないので、署名を付加する。方法は別途記載。
インストール実行。
lbsrv01 % sudo yum install /usr/src/redhat/RPMS/i386/keepalived-1.1.17-5.i386.rpm
設定ファイルを編集。
lbsrv01 % sudo vim /etc/keepalived/keepalived.conf ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ! Configuration File for keepalived virtual_server_group example { 192.168.0.7 80 } virtual_server group example { delay_loop 30 lvs_sched rr lvs_method NAT protocol TCP virtualhost health real_server 192.168.1.1 80 { weight 1 HTTP_GET { url { path /health.html status_code 200 } connect_port 80 connect_timeout 5 } } real_server 192.168.1.2 80 { weight 1 HTTP_GET { url { path /health.html status_code 200 } connect_port 80 connect_timeout 5 } } } /etc/keepalived/keepalived.conf ~~~~~~~~~~
ipvsadm のインストール
lbsrv01 % sudo yum install ipvsadm
ネットワークの設定
eth0 はDHCPで設定するようになっているけど、eth1 は固定の設定にしておく。
lbsrv01 % sudo vim /etc/sysconfig/network-scripts/ifcfg-eth1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE] DEVICE=eth1 ONBOOT=yes BOOTPROTO=static IPADDR=192.168.1.3 NETWORK=192.168.1.0 NETMASK=255.255.255.0 BROADCAST=192.168.1.255 TYPE=Ethernet USERCTL=no HWADDR=08:00:27:c5:4b:12 /etc/sysconfig/network-scripts/ifcfg-eth1 ~~~~~~~~~~
設定を反映させる。
lbsrv01 % sudo ifdown eth1 lbsrv01 % sudo ifup eth1
パケットの転送機能を有効にする。
lbsrv01 % sudo sysctl net.ipv4.ip_forward=1
起動時にもパケットの転送機能が有効になるようにしておく。
lbsrv01 % sudo vim /etc/sysctl.conf ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ... ... net.ipv4.ip_forward = 0 # 1 にすれば、起動時にパケットの転送機能が有効になる。 ... ... /etc/sysctl.conf ~~~~~~~~~~~~~~~~~~
iptables の機能を無効にする。...iptables が理解できなくて、どうやって設定していいのか解らなかった。またあとで調べるということで、今回は一旦無効にしておく。
lbsrv01 % sudo service iptables stop
Webサーバ準備
仮想ディスクイメージの複製
wsrv0[12] % VBoxManage clonehd CentOS-5.3_Basic.vdi CentOS-5.3_wsrv01.vdi
VirtualBox で新規仮想マシンの作成
ロードバランサ同様、コピーした仮想イメージディスクを使う。NIC は「内部ネットワーク」にする。
htmlファイル作成
/var/www/html の下に、index.html と ヘルスチェック用のファイル health.html を作成する。
wsrv0[12] % sudo vim /var/www/html/index.html ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ wsrv0[12] # どちらのWebサーバかが分かるようにしておく /var/www/html/index.html ~~~~~~~~~~ wsrv0[12] % sudo vim /var/www/html/health.html ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ live # なんでもいい /var/www/html/health.html ~~~~~~~~~~
動かしてみる
Webサーバ (2台とも)
http サーバを起動
wsrv0[12] % sudo /etc/init.d/httpd start
LBサーバ
keepalived 起動。
lbsrv01 % sudo /etc/init.d/keepalived start
ipvsadm で状態を確認。
lbsrv01 % sudo ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.0.7:80 rr -> 192.168.1.2:80 Masq 1 0 0 -> 192.168.1.1:80 Masq 1 0 0
ホストOS
リクエストを出してみる。
localhost % curl http://192.168.0.7 wsrv01 localhost % curl http://192.168.0.7 wsrv02
OK!
片方のWebサーバが止まった場合に、きちんと振り分けができるかどうか
Webサーバを1台止める。
wsrv02 % sudo /etc/init.d/httpd stop
リクエストを出してみる。
localhost % curl http://192.168.0.7 wsrv01 localhost % curl http://192.168.0.7 wsrv01
ipvsadm で状態を確認する。
lbsrv01 % sudo ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 192.168.0.7:80 rr -> 192.168.1.1:80 Masq 1 0 0
OK!!