HAProxy+keepalived でwebサーバを負荷分散

HAProxy とは

前回、LVS + keepalived で負荷分散構成を作成したが、LVS は「Layer 4:トランスポート層」で動作するのに対して
HAProxy は「Layer 7:アプリケーション層」もしくは「Layer 4:トランスポート層」で動作させることができる。

※構築がメインのため、説明はしない。以下参照。
1.2. haproxy Red Hat Enterprise Linux 7 | Red Hat Customer Portal

構成

以下、画像の構成で構築する。
f:id:Tryota:20201203212155p:plain

  • 踏み台サーバ

 OS:CentOS8

  • ロードバランサ

 OS:CentOS8
 冗長化keepalived
 負荷分散:HAProxy

  • webサーバ

 OS:CentOS8
 ソフトウェア:Apache

※踏み台サーバ・webサーバは構築済みとする。

ロードバランサ の構築

keepalived の設定

インストール

[root@haproxy01 ~]# dnf install -y keepalived

設定

[root@haproxy01 ~]# cd /etc/keepalived/
[root@haproxy01 keepalived]# mv keepalived.conf keepalived.conf.orig
[root@haproxy01 keepalived]# vim keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id HAProxy_server
}

vrrp_instance VI_1 {
    state MASTER
 # VRRPパケットを受信・送信するインタフェース
    interface enp0s8
    virtual_router_id 100
 #1号機と2号機で数値を変える(activeにしたい方を大きくする)
    priority 100    
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass password
    }
    virtual_ipaddress {
        192.168.0.200 dev enp0s8
        172.16.0.200 dev enp0s9
    }
}

サービスの起動

[root@haproxy01 ~]# systemctl start keepalived.service
[root@haproxy01 ~]# systemctl enable keepalived.service

HAProxy の設定

インストール

[root@haproxy01 ~]# dnf install -y haproxy

設定

[root@haproxy01 ~]# cd /etc/haproxy/
[root@haproxy01 haproxy]# mv haproxy.cfg haproxy.cfg.orig
[root@haproxy01 haproxy]# vim haproxy.cfg
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend http-in
        #80/tcp ポートで受け付ける
        bind *:80
        #バックエンドを定義
        default_backend backend_server
        #X-Forwarded-For ヘッダーを渡す
        option          forwardfor
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
backend backend_server
        #ラウンドロビン方式で負荷分散
        balance roundrobin
        #バックエンドサーバを定義
        server  node1   172.16.0.11:80  check    #[check]オプションにより、バックエンドサーバの死活監視を行う
        server  node2   172.16.0.12:80  check

サービスの起動

[root@haproxy01 ~]# systemctl start haproxy.service
[root@haproxy01 ~]# systemctl enable haproxy.service

firewalld の無効化

[root@haproxy01 haproxy]# systemctl stop firewalld.service
[root@haproxy01 haproxy]# systemctl disable firewalld.service

負荷分散の検証

踏み台サーバからロードバランサのVIPへHTTPリクエストを送信

[root@bastion ~]# curl 192.168.0.200
 test_web01
[root@bastion ~]# curl 192.168.0.200
test_web02

負荷分散されていた。

Ubuntu_20.04_LTS でIPアドレスを変更する

NetworkManager で設定しない

CentOS8 では、NetworkManager を使ってIPアドレスを設定したが、Ubuntu_20.04 ではどうやら違うらしい。
LPIC の試験では、「/etc/network/interfaces」という設定ファイルを変更する。みたいな感じで書かれていたが、そもそも Ubuntu_20.04 にはそんなファイルが存在していなかった。

rev1a@rev1a-VirtualBox:~$ ls -al /etc/network/
合計 32
drwxr-xr-x 6 root root 4096 8月 8 09:29 .
drwxr-xr-x 129 root root 12288 11月 23 22:17 ..
drwxr-xr-x 2 root root 4096 8月 8 09:31 if-down.d
drwxr-xr-x 2 root root 4096 8月 8 09:31 if-post-down.d
drwxr-xr-x 2 root root 4096 8月 8 09:31 if-pre-up.d
drwxr-xr-x 2 root root 4096 8月 8 09:31 if-up.d

YAML ファイルを弄る

既存YAMLファイルの無効化

どうやら ubuntu_20.04 では、「/etc/netplan/」内にある yamlファイルを編集するらしい。(詳しくは知らない。)
ということで、まずデフォルトで存在している yamlファイルを無効にする。

rev1a@rev1a-VirtualBox:~$ sudo mv /etc/netplan/01-network-manager-all.yaml /etc/netplan/01-network-manager-all.yaml.disable
※デフォルトで存在しているファイルは、削除しても良いらしいが、なんかこわいのでファイル名を変更して、yamlファイルとして認識されないようにする。

新規YAMLファイルの作成

新規にyamlファイルを作成し、IPアドレス等々を設定する。

rev1a@rev1a-VirtualBox:~$ sudo vi /etc/netplan/99-netcfg.yaml
network:
ethernets:
# ネットワークインターフェース名
enp0s3:
dhcp4: no
# IPアドレス/サブネットマスク
addresses: [192.168.1.77/24]
# デフォルトゲートウェイ
gateway4: 192.168.1.1
nameservers:
# 参照するネームサーバー
addresses: [192.168.1.1]
dhcp6: no
version: 2
設定を反映する。
rev1a@rev1a-VirtualBox:~$ sudo netplan apply 
設定されたか確認する。
rev1a@rev1a-VirtualBox:~$ ip a
1: lo: 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: mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 08:00:27:63:90:a5 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.77/24 brd 192.168.1.255 scope global enp0s3
valid_lft forever preferred_lft forever
inet6 240d:1e:149:a400:a00:27ff:fe63:90a5/64 scope global tentative dynamic mngtmpaddr noprefixroute
valid_lft 6172sec preferred_lft 6172sec
inet6 fe80::3767:d144:d0a2:78dc/64 scope link noprefixroute
valid_lft forever preferred_lft forever

Apacheでhttpサーバをhttpsサーバにする

はじめに

Apache でwebサーバを構築すると、何もしなければ「http 80/tcp」の通信になり、セキュリティ的に推奨されていないものになってしまう。
そこてで、今回はあらかじめ作成されている「httpサーバ」に「自己証明書」を作成し、「httpsサーバ」にする。
※「httpサーバ」は作成されているものとする。

https化に必要なモジュールをインストールする。

Apachehttpsサーバを構築するには、「mod_ssl」モジュールが必要になる。

[root@web01 ~]# dnf -y install mod_ssl
メタデータの期限切れの最終確認: 1:39:30 時間前の 2020年11月15日 10時57分53秒 に実施しました。
依存関係が解決しました。
======================================================================================================================
パッケージ アーキテクチャー バージョン リポジトリー サイズ
======================================================================================================================
インストール中:
mod_ssl x86_64 1:2.4.37-21.module_el8.2.0+494+1df74eae AppStream 132 k

完了しました!

サーバの秘密鍵を作る

秘密鍵を作成。

[root@web01 ~]# openssl genrsa -aes128 2048 > server.key
Generating RSA private key, 2048 bit long modulus (2 primes)
....+++++
.......................................................................+++++
e is 65537 (0x010001)
Enter pass phrase: #パスフレーズを入力
Verifying - Enter pass phrase: #パスフレーズを再入力

作成した秘密鍵からパスフレーズを削除する。

[root@web01 ~]# openssl rsa -in server.key -out server.key
Enter pass phrase for server.key: #パスフレーズを入力
writing RSA key

証明書署名要求(CSR)を作成する

基本的にすべての項目を[Enterキー]でスキップする。

[root@web01 ~]# openssl req -utf8 -new -key server.key -out server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
ーーーー
Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

サーバ証明書を発行する

今回は、無料で証明書を発行したいため自分自身で証明書を作る。
先ほど作成した証明書署名要求「server.csr」をもとに、サーバ証明書「server.crt」を有効期限:10年間で作成する。

[root@web01 ~]# openssl x509 -in server.csr -out server.crt -req -signkey server.key -days 3650
Signature ok
subject=C = XX, L = Default City, O = Default Company Ltd
Getting Private key

SSLモジュールの設定

証明書・鍵の移動

先ほど作成したサーバ証明書「server.crt」とサーバ秘密鍵「server.key」を管理しやすいように移動させる。

[root@web01 ~]# mkdir /etc/httpd/conf/ssl
[root@web01 ~]# mv server.key /etc/httpd/conf/ssl/
[root@web01 ~]# mv server.crt /etc/httpd/conf/ssl/

SSLモジュールの設定変更

証明書と鍵の場所を加える

[root@web01 ~]# vi /etc/httpd/conf.d/ssl.conf
# Point SSLCertificateFile at a PEM encoded certificate. If
# the certificate is encrypted, then you will be prompted for a
# pass phrase. Note that restarting httpd will prompt again. Keep
# in mind that if you have both an RSA and a DSA certificate you
# can configure both in parallel (to also allow the use of DSA
# ciphers, etc.)
# Some ECC cipher suites (http://www.ietf.org/rfc/rfc4492.txt)
# require an ECC certificate which can also be configured in
# parallel.
#SSLCertificateFile /etc/pki/tls/certs/localhost.crt #コメントアウト
SSLCertificateFile /etc/httpd/conf/ssl/server.crt

# Server Private Key:
# If the key is not combined with the certificate, use this
# directive to point at the key file. Keep in mind that if
# you've both a RSA and a DSA private key you can configure
# both in parallel (to also allow the use of DSA ciphers, etc.)
# ECC keys, when in use, can also be configured in parallel
#SSLCertificateKeyFile /etc/pki/tls/private/localhost.key #コメントアウト
SSLCertificateKeyFile /etc/httpd/conf/ssl/server.key

Apacheを再起動する

最後に「httpd」を再起動し、動作確認をする。

[root@web01 ~]# systemctl restart httpd
再起動完了後に、ブラウザから「https://[IPアドレス]」を検索し、表示されれば成功。

NTPサーバの構築

はじめに

NTPサーバを構築するためには、「chrony」をインストールする必要がある。
(centos8 サーバ用でインストールした際は、デフォルトでインストールされていた。)

「chrony」とは

深くは書かない。長くなりそうだから。
PCをNTPサーバ兼クライアントソフトとして動作させるための
「NTP用のソフトウェアスイート」。

  • chronyd(chronyデーモン)
  • chronyc

「chronyd」は、「chronyc」というコマンドラインユーティリティを使用して、管理及び監視をしている。

NTPサーバを構築

「chrony」のインストール。

主は、「centos8」を使用しているがデフォルトでインストールされていた。
一応、インストールする。

[root@ntp ~]# dnf install -y chrony
CentOS-8 - AppStream 1.5 MB/s | 5.8 MB 00:03
CentOS-8 - Base 1.8 MB/s | 2.2 MB 00:01
CentOS-8 - Extras 5.5 kB/s | 8.6 kB 00:01
パッケージ chrony-3.5-1.el8.x86_64 はすでにインストールされています。
依存関係が解決しました。
行うべきことはありません。
完了しました!
確認方法
(最初にこれやればよかった?)
[root@ntp ~]# dnf list installed | grep chrony
chrony.x86_64 3.5-1.el8 @anaconda

設定を変更

念のためオリジナルファイルをコピーしておく。

[root@ntp ~]# cp /etc/chrony.conf /etc/chrony.conf.orig

設定ファイルを編集

[root@ntp ~]# vi /etc/chrony.conf

# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
pool 2.centos.pool.ntp.org iburst
/////////////////
# Allow NTP client access from local network.
#allow 192.168.0.0/16

# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
#日本の標準時間を提供しているNTPサーバ(stratum 1)
server ntp.nict.jp iburst
/////////////////
# Allow NTP client access from local network.
#allow 192.168.0.0/16
allow 192.168.0.0/24

サービスの起動

「chronyデーモン」を起動

[root@ntp ~]# systemctl start chronyd
[root@ntp ~]# systemctl enable chronyd

「chronyデーモン」のステータスを確認

[root@ntp ~]# systemctl status chronyd
chronyd.service - NTP client/server
Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2020-11-20 22:24:41 JST; 37min ago
Docs: man:chronyd(8)
man:chrony.conf(5)
Main PID: 866 (chronyd)
Tasks: 1 (limit: 6041)
Memory: 1.7M
CGroup: /system.slice/chronyd.service
mq866 /usr/sbin/chronyd
正常に動作している。

NTPサーバの時刻同期状態の確認

[root@ntp ~]# chronyc sources
210 Number of sources = 4
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^+ vpn.ms.mff.cuni.cz 2 8 377 94 +1062us[+1062us] +/- 176ms
^- ns2.vedur.is 3 8 377 34 -8573us[-8573us] +/- 211ms
^* ott130.hkcable.com.hk 3 7 377 103 +1567us[+1776us] +/- 79ms
^+ ntpool0.603.newcontinuum> 2 8 377 37 +57us[ +57us] +/- 107ms

NTPサーバ名の前に「^+」「^*」があれば時刻を同期している。

NetworkManagerでインタフェースの設定をする

virtual box を使って、アダプタをブリッジにして追加したが、
下記のコマンドを実行したところ、インタフェースが反映されていなかった。


[root@lb01 ~]# nmcli device
DEVICE TYPE STATE CONNECTION
enp0s3 ethernet 接続済み enp0s3
enp0s8 ethernet 切断済み --
enp0s9 ethernet 切断済み --
lo loopback 管理無し --
 
そもそもインタフェースの設定ファイルが存在していなかった。

[root@lb01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-enp0s9
cat: /etc/sysconfig/network-scripts/ifcfg-enp0s9: そのようなファイルやディレクトリはありません
 

まずは、インタフェースの設定ファイルを作成する。


[root@lb01 ~]# nmcli connection add type ethernet con-name enp0s9 ifname enp0s9
接続 'enp0s9' (36e6beb5-80c7-49b1-a18a-b49b30f76187) が正常に追加されました。

  • 接続タイプは、「ethernet
  • インタフェースの接続名、「enp0s8」

※「/etc/sysconfig/network-scripts/ifcfg-xxx」←「xxx」の部分にも使われる

  • インタフェース名は、「enp0s8」

上記コマンドにより、


/etc/sysconfig/network-scripts/ifcfg-enp0s9
が作成される。

作成した後は、


# nmcli connection up enp0s8
により、「DHCP」で ipアドレス・NWアドレス・デフォルトゲートウェイ等が
自動設定される。

設定後に確認してみる。


[root@lb01 ~]# nmcli device
DEVICE TYPE STATE CONNECTION
enp0s3 ethernet 接続済み enp0s3
enp0s9 ethernet 接続済み enp0s9
enp0s8 ethernet 接続済み enp0s8
lo loopback 管理無し --
接続されたことが確認できた。


インタフェースの設定を変更する。

変更点としては、

  1. IPアドレス
  2. デフォルトゲートウェイ

 の2点とする。

  • IPアドレスを変更する。

 [root@lb01 ~]# nmcli connection modify enp0s9 ipv4.addresses 192.168.1.100/24

  • インタフェースのデフォルトゲートウェイを変更する。

 [root@lb01 ~]# nmcli connection modify enp0s9 ipv4.gateway 192.168.1.1

  • 「DHCP」->「Manual(手動)」に切り替える。

[root@lb01 ~]# nmcli connection modify enp0s9 ipv4.method manual

  • インタフェースを再起動し、設定を反映させる。

[root@lb01 ~]# nmcli connection down enp0s9
接続 'enp0s9' が正常に非アクティブ化されました (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/2)
[root@lb01 ~]# nmcli connection up enp0s9
接続が正常にアクティベートされました (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/4)

  • IPアドレスが変更されたか確認する。

[root@lb01 ~]# ip addr show | grep "enp0s9"
4: enp0s9: mtu 1500 qdisc fq_codel state UP group default qlen 1000
inet 192.168.1.100/24 brd 192.168.1.255 scope global noprefixroute enp0s9

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」を停止させたら成功した。

centos8を冗長構成にする

Linuxサーバを冗長化するには、keepalivedを使用する。

 

冗長化する目的

  • NW機器やサーバに障害が発生してとしてもサービスを提供できるようにする。
  • 構成変更時、スタンバイ系の1台ずつ変更できる。結果、サービスを停止しないで作業ができる。

今回、冗長化するための構成図↓

f:id:Tryota:20201020214938p:plain

負荷分散装置(LVS:Linux Virtual Server)については、

前回の記事を参照。

 

keepalivedの設定をしていく。

 

keepalived のインストール

dnf install -y keepalived

 

以下に設定ファイルが置かれる

/etc/keepalived/keepalived.conf

 

設定ファイルをコピー

cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.org

 

設定ファイルを編集

vi /etc/keepalived/keepalived.conf

 

! Configuration File for keepalived

 global_defs {
  router_id LVS_server
 }

 vrrp_instance VI_1 { #HAクラスタ冗長化クラスタ)の設定
  state MASTER #1号機と2号機で変える(MASTER/BACKUP)
  interface enp0s3 #冗長化するインタフェース
  virtual_router_id 51 #1号機と2号機で合わせる
  priority 100
  advert_int 3 #1号機と2号機で合わせる
  authentication {
   auth_type PASS
   auth_pass password
  }
  virtual_ipaddress {#パケットを送受信する仮想サーバ(1号機と2号機で合わせる)
   192.168.1.202/24
  }
 }

 

firewalldの設定

vrrpの許可

firewall-cmd --permanent --add-protocol=vrrp

firewall-cmd --reload

 

設定を保存して、serviceの起動

systemctl start keepalived.service

systemctl enable keepalived.service