LVS (Linux Virtual Server) のNATモードを使用して、複数のリアルサーバにトラフィックを分散させる負荷分散環境を構築します。本構成ではKVM(Kernel-based Virtual Machine)を仮想化基盤として利用します。
1. ネットワーク構成の設計
以下の4台の仮想マシンを使用します。
| 役割 | ネットワークモード | インターフェース | IPアドレス |
|---|---|---|---|
| クライアント (Client) | Host-Only | eth0 | 1.1.1.99 |
| LVS Director (Load Balancer) | Host-Only / NAT | eth0 / eth1 | 1.1.1.100 (VIP) / 192.168.122.100 (DIP) |
| Real Server 1 (RS1) | NAT | eth0 | 192.168.122.101 |
| Real Server 2 (RS2) | NAT | eth0 | 192.168.122.102 |
2. KVM 仮想ネットワークの設定
Host-Onlyネットワークを定義し、クライアントとLVSの外側インターフェースを接続します。
# /etc/libvirt/qemu/networks/private-net.xml
<network>
<name>private-net</name>
<bridge name='virbr-priv'/>
<ip address='1.1.1.1' netmask='255.255.255.0'>
<dhcp>
<range start='1.1.1.2' end='1.1.1.253'/>
</dhcp>
</ip>
</network>
設定を反映させます。
sudo virsh net-define /etc/libvirt/qemu/networks/private-net.xml
sudo virsh net-start private-net
sudo virsh net-autostart private-net
3. LVS Directorの設定
LVSノードでは、パケット転送を有効にし、NATの設定を行います。
3.1 IPフォワーディングの有効化
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p
3.2 iptablesによるマスカレード設定
外部からのリクエストを内部ネットワークに中継するためのルールを追加します。
iptables -t nat -F
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
# 内部ネットワーク(192.168.122.0/24)からの応答を外部(eth0)へ転送
iptables -t nat -A POSTROUTING -s 192.168.122.0/24 -o eth0 -j MASQUERADE
4. リアルサーバ (RS) の設定
RS1およびRS2でWebサービスを稼働させ、デフォルトゲートウェイをLVSのDIPに設定します。
4.1 Webサービスのセットアップ
各RSで以下の操作を行います。
yum -y install httpd
systemctl enable --now httpd
# 識別用のコンテンツ作成
echo "Response from RS1" > /var/www/html/index.html # RS1の場合
4.2 ネットワークゲートウェイの設定
LVS-NATでは、RSの応答パケットが必ずLVS Directorを経由する必要があるため、ゲートウェイ設定が重要です。
# /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
ONBOOT="yes"
BOOTPROTO="static"
IPADDR=192.168.122.101
NETMASK=255.255.255.0
GATEWAY=192.168.122.100 # LVSの内部IP(DIP)を指定
systemctl restart network
5. IPVSルールの適用
LVS Directorに負荷分散ルールを定義します。
yum install -y ipvsadm
# 仮想サービスの追加 (ラウンドロビン方式)
ipvsadm -A -t 1.1.1.100:80 -s rr
# リアルサーバの登録 (-mオプションでNATモードを指定)
ipvsadm -a -t 1.1.1.100:80 -r 192.168.122.101:80 -m
ipvsadm -a -t 1.1.1.100:80 -r 192.168.122.102:80 -m
6. 動作確認
クライアントマシンからVIPに対してリクエストを送信し、異なるサーバから応答が返ってくることを確認します。
[root@client ~]# curl 1.1.1.100
Response from RS1
[root@client ~]# curl 1.1.1.100
Response from RS2
[root@client ~]# curl 1.1.1.100
Response from RS1