keepalived による VIP の動作確認

# 概要

* 冗長化の学習を始める中で、keepalived を用いて仮想 IP アドレス(VIP)を設定した際の挙動というか動作を確認しておきたく、本記事記載。
* 動作確認した環境は、**「CentOS7(MacOS Big Sur の Virtualbox 上に構築)」** 
である。
* なお本記事では「keepalived による VIP 設定時のシンプルな動作確認」のみを目的とする。そのため、動作内容に深く追及してなかったり、firewall の停止やら [SELinux の無効化](https://qiita.com/hanaita0102/items/5d3675e4dc1530b255ba)を実施していたりする。
* 基本的には [Keepalivedを用いた冗長化](https://christina04.hatenablog.com/entry/keepalived-vip) を参照させていただいた(今回のケースでは追加手順も必要になってしまったが)。そのほかにも参考にさせていただいた記事については本文中にリンクを貼っておく(記事作成者の皆さんありがとうございます)。


# 確認したいこと

* 下図のような、CentOS7 を 2 台用意しそれぞれに nginx を構築した環境を想定。
この環境において、次の事項を確認してみる。

① 設定した VIP にブラウザからアクセスすると、MASTER の nginx のページが表示されるか？

![environment1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001161/29a4f5ce-704f-7854-ba38-cee270f74c55.png)

② MASTER の CentOS7 について keepalived を停止した場合に、BACKUP 側に VIP が振り直されるか？(もちろん、① 同様にブラウザでのアクセスも確認する)

![environment2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001161/d568db38-c01a-9b0b-0008-b38d281bb370.png)


# 実際に確認

### nginx の用意

* まずは Virtualbox 上の CentOS 2 台それぞれに nginx を構築。
* 手順については、[CentOS7 に Nginx をインストールする](https://qiita.com/tomy0610/items/0884c77f1ac52957fa96) を参考にした。構築できれば、ブラウザにて 192.168.56.11 or 12 にアクセス時、以下の画面が表示される(firewalld 停止済)。
![figure1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001161/d77a1f85-4bc3-26ce-a02c-ca7010b2d8e5.png)
* VIP の切り替えを確認するため、今回 2 台の nginx で表示内容を変えておきたい。[Nginxで自分のHTMLを表示させる方法：htmlディレクトリはどこにある？](https://k-koh.hatenablog.com/entry/2019/11/08/100158) を参考に、```/usr/share/nginx/html/index.html```
の表示を修正した(Welcome to nginx! の続きに IP アドレスを追記)。
これにより、例えば IP 192.168.56.11 にブラウザでアクセスすると、以下の画面表示になるようにした。
![figure2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001161/1cc20e39-9e7b-8a6e-06ac-fe6cbadd99e0.png)

### keepalived の設定・起動

* 2 台の CentOS7 それぞれについて、keepalived をインストール

```
[root@centos7 ~]# yum install -y keepalived
```

* それぞれの CentOS7 について、``` /etc/keepalived/keepalived.conf``` を編集する。編集対象となるのは、以下の箇所。

```
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }
}
```

* 上記ファイルのうち、以下を編集する。
<dl>
　　　　<dt>state</dt>
  <dd>1 台は ```MASTER``` に、もう 1 台は ```BACKUP``` に変更。</dd>
  <dt>interface</dt>
  <dd>```ip addr``` での出力内容に変更。今回は、eth0 から enp0s8 に変更。</dd>
  <dt>priority</dt>
  <dd>MASTER の方が BACKUP より数値が大きくなるように。ここでは MASTER の方は 100、BACKUP は 80 とした。</dd>
 <dt>virtual_ipaddress</dt>
  <dd>「確認したいこと」で添付した画像に従い、```192.168.56.10``` に変更。</dd>
</dl>
結果的に、各 CentOS7 における編集後の内容は以下の通りになった。

```
### MASTER(IP 192.168.56.11)

vrrp_instance VI_1 {
    state MASTER
    interface enp0s8
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.56.10
    }
}
```

```
### BACKUP(IP 192.168.56.12)

vrrp_instance VI_1 {
    state BACKUP
    interface enp0s8
    virtual_router_id 51
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.56.10
    }
}
```
* ここまで行ってから、MASTER → BACKUP の順番に keepalived を起動する。

```
# systemctl start keepalived
```
すると、MASTER 側には VIP である 192.168.56.10 が割り当てられている。

```
[root@centos7-ip11 ~]# hostname -I
10.0.2.15 192.168.56.11 192.168.56.10 

[root@centos7-ip12 ~]# hostname -I
10.0.2.15 192.168.56.12 
```
* これで VIP の割り当てが完了したので、ブラウザからも 192.168.56.10 にアクセスできる、「確認したいこと」で述べた「設定した VIP にブラウザからアクセスすると、MASTER の nginx のページが表示されるか？」も確認完了・・・・・・と思いきや、アクセスできない。Chrome 曰く「192.168.56.10 からデータが送信されませんでした。」とのこと。```ping``` を VIP 向けに実施しても、timeout が続く。。VIP の割り当て自体はうまくいってそうなのだが。
* 調べてみると、[keepalivedがどうやってVRRPを取るのか裏側の動きを理解する～これがマルチキャストか～](https://qiita.com/uturned0/items/860c99783550d9be323e) に参考情報が。keepalived.conf における ```vrrp_strict``` が原因らしい。というわけで、それぞれの CentOS7 について、/etc/keepalived/keepalived.conf から、```vrrp_strict``` の記載(以下、下から 2 行目)を削除。

```
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_strict ← こいつを削除。
   vrrp_garp_interval 0
```
* 上記実施後、それぞれの CentOS7 において keepalived を再起動。すると、ブラウザで 192.168.56.10 にアクセスする際に以下の nginx の画面が表示される。これで、「設定した VIP にブラウザからアクセスすると、MASTER の nginx のページが表示される」ことを確認できた。
![figure3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001161/e2077639-bc9f-8c8e-7d24-9cfb71f59648.png)

### MASTER の keepalived を停止

* MASTER の keepalived を停止した場合の挙動を確認してみる。

```
# systemctl stop keepalived
```

* すると、BACKUP の CentOS7 に VIP である 192.168.56.10 が割り当てられる。また、ブラウザで 192.168.56.10 にアクセスした場合には、192.168.56.12 の nginx 画面が表示される。これで、「MASTER の CentOS7 について keepalived を停止した場合に、BACKUP 側に VIP が振り直される」ことを確認できた。
* そのほかにも確認しておくべき点があるかもだが、基本的な挙動は確認できたので、本記事はこれで終わりにしておく。

# 参考情報

* ```vrrp_strict``` については [Default behaviour of adding iptables DROP rule?](https://github.com/acassen/keepalived/issues/474) において挙動が説明されている。
* keepalived により VIP 設定は、[CentOS 7 と keepalived でクラスタ環境を構築する](https://mseeeen.msen.jp/build-cluster-with-keepalived-on-centos-7/) もわかりやすく、参考とさせてもらった。