ロードバランサを構築 (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!!