LVS+keepalivedを使ってwebサーバを負荷分散

今回作るvirual box上のネットワーク構成図。
f:id:Tryota:20201027223945p:plain

仮想サーバを作成

上記のネットワーク図に記載した分の仮想マシンを作成する

  • 踏み台サーバ×2台
  • Load Balancer×2台
  • webサーバ×2台

各サーバの構成内容

  • 踏み台サーバは、webサーバへアクセスした時にLoad Balancerによって負荷分散されているか確認するためGUIとする。
  • Load Balancer 及び webサーバは、CLIとしてインストールする。

踏み台サーバを作成

  • 踏み台サーバは、冗長化してアクティブ機に障害が発生してもサーバが停止しない構成とする。
  • 上記を実現するため、keepalivedをインストールする。1号機をアクティブ、2号機をスタンバイとする。
1. keepalived をインストール
[root@bastin01 ~]# dnf -y install keepalived
CentOS-8 - AppStream                                                                                                                                                                                         3.3 MB/s | 5.8 MB     00:01
CentOS-8 - Base                                                                                                                                                                                              2.0 MB/s | 2.2 MB     00:01
CentOS-8 - Extras                                                                                                                                                                                            9.1 kB/s | 8.1 kB     00:00
依存関係が解決しました。
|
完了しました!

2. 設定ファイルをコピー
[root@bastin01 ~]# cd /etc/keepalived/
[root@bastin01 keepalived]# cp keepalived.conf keepalived.conf.orig
[root@bastin01 keepalived]# vi keepalived.conf

####################################
! Configuration File for keepalived

global_defs {
   router_id LVS_DEVEL
}
vrrp_instance VI_1 {
    state MASTER #MASTER/BACKUP(1号機:MASTER 2号機:BACKUP)
    interface enp0s3
    virtual_router_id 51 #1、2号機で合わせる
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress { #virtual IPアドレスの設定
        192.168.1.50/24 dev enp0s3
        10.0.0.50/24 dev enp0s8
    }
}
####################################

3. firewalld で「VRRP」パケットを許可する
[root@bastin01 ~]# firewall-cmd --permanent --add-protocol=vrrp
success
[root@bastin01 ~]# firewall-cmd --reload
success

[root@bastin01 ~]# systemctl start keepalived.service
[root@bastin01 ~]# systemctl enable keepalived.service
Created symlink /etc/systemd/system/multi-user.target.wants/keepalived.service → /usr/lib/systemd/system/keepalived.service.

4. 1号機に設定した virtual IPアドレスが振り分けられていることを確認する
[root@bastin01 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:1c:f5:08 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.51/24 brd 192.168.1.255 scope global noprefixroute enp0s3
       valid_lft forever preferred_lft forever
    inet 192.168.1.50/24 scope global secondary enp0s3
       valid_lft forever preferred_lft forever
    inet6 240d:1e:149:a400:661b:ec36:d833:f7b4/64 scope global dynamic noprefixroute
       valid_lft 10411sec preferred_lft 10411sec
    inet6 fe80::460c:3b21:de30:5f13/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:28:af:5d brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.51/24 brd 10.0.0.255 scope global noprefixroute enp0s8
       valid_lft forever preferred_lft forever
    inet 10.0.0.50/24 scope global secondary enp0s8
       valid_lft forever preferred_lft forever
    inet6 fe80::f556:a17a:a07:3543/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

Load Balancerを作成

  • webサーバへのアクセスを集中させないため負荷分散装置を作成。
  • 踏み台サーバと同じくkeepalivedをインストールし、冗長化構成にする。ただ、今回はkeepalivedを使ってリアルサーバ(バックエンドサーバ)の稼働状況の監視をさせる設定を組み込む。
! Configuration File for keepalived

global_defs {
   router_id LVS_server
}

vrrp_instance VI_1 {
    state MASTER
    interface enp0s3
    virtual_router_id 100
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass password
    }
    virtual_ipaddress {
        10.0.0.10 dev enp0s3
        172.16.0.10 dev enp0s8
    }
}

#リアルサーバの稼働状況を監視する設定を追加
virtual_server 10.0.0.10 80 {
    delay_loop 6
    lb_algo rr #負荷分散アルゴリズム
    lb_kind NAT #負荷分散方式
    persistence_timeout 50
    protocol TCP
	
    real_server 172.16.0.100 80 {
        weight 1
        HTTP_GET {
            url {
              path /
			  status_code 200
			}
            connect_timeout 3
        }
    }
    
    real_server 172.16.0.101 80 {
        weight 1
        HTTP_GET {
            url {
              path /
			  status_code 200
			}
            connect_timeout 3
        }
    }
}
  • 負荷分散装置として動作させるため、LVS(Linux Virtual Server)をインストール。(LVSの管理ユーティリティであるipvsadmをインストール)
  • LVSの設定
1. ipvsadm をインストール
[root@LB01 ~]# dnf install -y ipvsadm
メタデータの期限切れの最終確認: 0:22:38 時間前の 20201029214541秒 に実施しました。
依存関係が解決しました。
|
|
|
完了しました!

2. ipvsのシステム設定ファイルを作成
[root@LB01 ~]# touch /etc/sysconfig/ipvsadm

3. ipフォワーディングを設定
[root@LB01 ~]# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf

4. Load Balanceの設定(-A:virtual server -a:VSに振り分け先のリアルサーバを追加 -r:リアルサーバ -m:転送方法の設定(mはNAT方式))
[root@LB01 ~]# ipvsadm -C
[root@LB01 ~]# ipvsadm -A -t 10.0.0.10:80 -s wlc
[root@LB01 ~]# ipvsadm -a -t 10.0.0.10:80 -r 172.16.0.100:80 -m
[root@LB01 ~]# ipvsadm -a -t 10.0.0.10:80 -r 172.16.0.101:80 -m
[root@LB01 ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.0.10:http wlc
  -> 172.16.0.100:http            Masq    1      0          0
  -> 172.16.0.101:http            Masq    1      0          0

webサーバを作成

  • Load Balancerによって負荷分散できているか確認するため、webサーバを2台作成。
  • webサーバ用にapacheをインストールする。
  • firewalldでhttpもしくは80/tcpを許可する。

routingの設定

踏み台サーバ→webサーバへの通信はLBを経由するようにする。
[root@bastin01 ~]# ip route add 172.16.0.0/24 via 10.0.0.10 dev enp0s8

追記

上記設定では、
踏み台サーバ→ロードバランサ→webサーバ
の通信は成功するが、帰りの通信が成功しなかった。
パケットキャプチャをしたが、踏み台サーバにwebサーバからの「SYN+ACKパケット」が到達していなかった。
恐らく「firewalld」でIPマスカレード設定をしていないのが原因。
今回は、ローカルだし設定めんどくさいし...ってことで、「firewalld」自体を停止させた。

[root@LB01 ~]# systemctl stop firewalld.service
「firewalld」を停止させたら成功した。