LVS+keepalivedを使ってwebサーバを負荷分散
今回作るvirual box上のネットワーク構成図。
仮想サーバを作成
上記のネットワーク図に記載した分の仮想マシンを作成する
- 踏み台サーバ×2台
- Load Balancer×2台
- webサーバ×2台
踏み台サーバを作成
- 踏み台サーバは、冗長化してアクティブ機に障害が発生してもサーバが停止しない構成とする。
- 上記を実現するため、keepalivedをインストールする。1号機をアクティブ、2号機をスタンバイとする。
- keepalivedの設定
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 時間前の 2020年10月29日 21時45分41秒 に実施しました。 依存関係が解決しました。 | | | 完了しました! 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サーバを作成
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」を停止させたら成功した。