CloudStackでLVS(Linux Virtual Server) -keepalivedを利用編

概要

前回、前々回とCloudStackのVMを使ってLVS(Linux Virtual Server)を構成してみました。

  • ipvsadmを利用

CloudStackでLVS(Linux Virtual Server) - mukkun0824’s blog

  • Ldirectordを利用

CloudStackでLVS(Linux Virtual Server) -Ldirectordを利用編 - mukkun0824’s blog

ただ、上記の構成だとlvsは1台しかなく、lvsの1台がダウンすると終わりなので、lvsを2台構成にします。その2台の疎通にはkeepalivedを利用します。 これもLPIC304の勉強がてらCentos7で構築しています。

参考

CentOS 7 : LVS + Keepalived の設定 : Server World

構成

構成は以下のようになります。VIPなどは変わりません。Ldirectordではなく、ipvsadmをそのまま利用します。

                         (internet)
                             |
                             | グローバルIP
                   +---------+-----------+
                   |  Virtual Router     |
                   +---------+-----------+
                             | 192.168.0.1/24 GW
                             |
                     VIP:192.168.0.100/24
                             |
+-----------+                |                 +------------+
|    lvs1   |192.168.0.223/24|192.168.0.104/24 |    lvs2    |
|keepalived +------------+---------------------+ keepalived |
|           |eth0            |            eth0 |            |
+-----------+                |                 +------------+
                             |
                             |
+------------+               |                 +------------+
|  Backend01 |192.168.0.62/24| 192.168.0.243/24|  Backend02 |
| Web Server +------------+--------------------+ Web Server |
|            |eth0                        eth0 |            |
+------------+                                 +------------+

lvsサーバー:インストール・設定

cloudStackでの操作

(1) 事前にセカンダリIP192.168.0.100を付けておく。

(2) グローバルIPのNATの設定で、セカンダリIP 192.168.0.100へNAT設定しておく(送信元NATのグローバルIPではなく、別で用意する)

firewalld 止める

systemctl status firewalld.service
systemctl stop firewalld.service
systemctl disable firewalld.service
systemctl status firewalld.service

インストール・設定

lvs1、lvs2共に以下の作業を行います。

yum -y install ipvsadm keepalived
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p

touch /etc/sysconfig/ipvsadm
systemctl start ipvsadm
systemctl enable ipvsadm

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

設定が残っている場合は-Cでクリアしておく。

ipvsadm -C
ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

keepalivedの設定

これもlvs1、lvs2共に以下の作業を行います。 以下のように設定ファイルを編集します。lvs1とlvs2の設定ファイルの差分は、「priority」のところだけです。どちらか(優先度をあげたい方)を高めにしておきます。今回はIPをNATしないので、DR(ダイレクトルーティング)で行います。

ちなみに、VRRP はVirtualRouterRedundancyProtocolのことで、ルーター間の疎通監視プロトコルのことです。死活監視できるメソッドは以下の通りです。

[root@mukkun-lvs1 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
}

vrrp_instance VI_1 {
    # 両方でバックアップとする(プライオリティで制御する)
    state BACKUP
    # 監視させるインターフェース
    interface eth0
    # 仮想ルータのID
    virtual_router_id 51
    # プライオリティ (双方のサーバーで値を変更)
    # (値の大きい方が優先度が高くなる)
    priority 100
    # プライオリティが高い方へ復帰しない
    nopreempt
    # VRRP送信間隔
    advert_int 1
    # VRRPをやり取りする際の認証情報
    authentication {
        auth_type PASS
        auth_pass mukkun-test
    }

    virtual_ipaddress {
        # 仮想IPアドレス
        192.168.0.100/24 dev eth0
    }
}
virtual_server 192.168.0.100 80 {
    # 監視する間隔
    delay_loop 3
    # 負荷分散方式
    lvs_sched rr
    # パケットの転送方式
    lvs_method DR
    protocol TCP

    # バックエンドサーバー#1
    real_server 192.168.0.62 80 {
        weight 1
        HTTP_GET {
            url {
                # 監視先URL
                path /
                # 正常な場合のステータスコード
                status_code 200
            }
            # タイムアウト時間(秒)
            connect_timeout 3
        }
    }
    # バックエンドサーバー#2
    real_server 192.168.0.243 80 {
        weight 1
        HTTP_GET {
            url {
                path /
                status_code 200
            }
            connect_timeout 3
        }
    }
}

サービス起動

lvs1でサービス起動

[root@mukkun-lvs1 ~]# systemctl start keepalived

lvs2でもサービス起動

[root@mukkun-lvs2 ~]# systemctl start keepalived

2台のLVSサーバーのkeepalivedのサービスをあげると「priority」を高めに設定した方のサーバーにVIPがつきます。

[root@mukkun-lvs1 ~]# ip -4 a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    inet 192.168.0.223/24 brd 192.168.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 192.168.0.100/24 scope global secondary eth0
       valid_lft forever preferred_lft forever

lvs1のkeepalivedを止めるとlvs2にVIPが動きます。バックエンドへの通信は問題ありません。

[root@mukkun-lvs2 ~]# ip -4 a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    inet 192.168.0.104/24 brd 192.168.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 192.168.0.100/24 scope global secondary eth0
       valid_lft forever preferred_lft forever

BackEndServer:設定

BackEnd(リアルサーバー)側の設定は前回と変更なしです。

これで前回と同じようにグローバルIPでWebアクセスすると2台に負荷分散されます。lvs1をダウンさせるとlvs2に処理が移行し、Webアクセスは問題ありません。CloudStack的にはlvs1のVIP(192.168.0.100/24)として静的NATしているのですが、lvs1を落としてもlvs2にNATしてくれます。