【CoreOS】冗長化構成　Keepalived+NginxLB+NginxWEB(完)

# CoreOSでKeepalivedを使った冗長化＋負荷分散

![スライド4.jpg](https://qiita-image-store.s3.amazonaws.com/0/93976/0a28e3b3-0cb5-7468-72d5-d44d1220fab1.jpeg)

## 前回記事の続きになります

[【CoreOS】冗長化構成　Keepalived+NginxLB+NginxWEB(1)](http://qiita.com/xshsaku/items/c3e2fe12d60fc9535b8b)

*今回は実際の8080ポートの構成設定を行っていきたいと思います。

## バックエンドサーバー用Unitファイルの作成

注(1)：実際にはnginx-web@1/2と2つのファイルを作成してください
注(2)：X-FLEETのマシンIDはcore01/core04の固有のIDを指定してください

```shell-session:nginx-web@1.service
[Unit]
Description=NginxWEB
After=docker.service
Requires=docker.service

[Service]
EnvironmentFile=/etc/environment
TimeoutStartSec=0
Restart=always
ExecStartPre=/usr/bin/docker pull nginx:1.7.10
ExecStartPre=-/usr/bin/docker kill %p
ExecStartPre=-/usr/bin/docker rm %p
ExecStart=/usr/bin/docker run --rm \
  --name %p \
  --net host \
  -v /srv/lb/web.conf:/etc/nginx/nginx.conf:ro \
  -v /srv/share/html:/usr/share/nginx/html \
  nginx:1.7.10 \
  nginx
ExecStop=/usr/bin/docker stop -t 2 %p

[X-Fleet]
MachineID=5b1639bd3cc347cf8fac0b9f597369e3
```

## Nginx用configファイル作成

```shell-session:web.conf
daemon off;
worker_processes 4;

events {
  worker_connections 1024;
}

http {
  server {
    listen       *:8080;
    root /usr/share/nginx/html;
    location / {
        index   index.html;
    }
  }
}
```

## nginx用configの配置及び、index.html作成

```shell-session
#core01サーバーへ配布
scp web.conf core@192.168.0.10:/home/core
ssh core@192.168.0.10
sudo cp -a web.conf /srv/lb/
sudo mkdir -p /srv/share/html
sudo echo "server 1" > /srv/share/html/index.html

#core04サーバーへ配布
scp web.conf core@192.168.0.11:/home/core
ssh core@192.168.0.11
sudo cp -a web.conf /srv/lb/
sudo mkdir -p /srv/share/html
sudo echo "server 2" > /srv/share/html/index.html
```

## Unitファイル登録

```shell-session
fleetctl submit nginx-web@{1,2}
fleetctl load nginx-web@{1,2}
fleetctl start nginx-web@{1,2}

fleetctl list-units
UNIT			MACHINE				ACTIVE	SUB
keepalived@1.service	5b1639bd.../192.168.0.10	active	running
keepalived@2.service	6d283167.../192.168.0.11	active	running
nginx-lb@1.service	5b1639bd.../192.168.0.10	active	running
nginx-lb@2.service	6d283167.../192.168.0.11	active	running
nginx-web@1.service	5b1639bd.../192.168.0.10	active	running
nginx-web@2.service	6d283167.../192.168.0.11	active	running
```
バッチリサービス起動していることが確認できました。

http://192.168.0.50にアクセスしてみましょう！

![server1.png](https://qiita-image-store.s3.amazonaws.com/0/93976/3fc7654d-119b-d0d6-b2fb-b38e613065b8.png)

上記のようにサーバーの名称が出てくると思います。

ただし今回の設定はRRと呼ばれる1/2に振り分ける設定ではなくip-hashと呼ばれる、同一クライアントからは常に同じサーバーにアクセスする設定となります。

※前項参照：

> #ロードバランサ設定
upstream backend {
      ip_hash;
      server 192.168.0.10:8080 max_fails=3 fail_timeout=30s ;
      server 192.168.0.11:8080 max_fails=3 fail_timeout=30s ;
      server 127.0.0.1:8080  down;
}

もし簡単に切り替え確認をしたい場合は、ip_hashを省いてリロードすると簡単にバランシングがされているかチェックできます！

## 続いてサーバーがダウンした場合のフェイルオーバーについて

現在、VIPをcoreos01のサーバーが保持しています。

```
ssh core@192.168.0.10
$ ip a
〜〜〜
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:79:c4:9d brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.10/24 brd 192.168.0.255 scope global enp0s3
       valid_lft forever preferred_lft forever
    inet 192.168.0.50/24 scope global secondary enp0s3 <=ここ
       valid_lft forever preferred_lft forever
```

core01のを強制的にダウンさせ、core04にVIPが移行されるか確認してみます。

**イメージ図**
![スライド5.jpg](https://qiita-image-store.s3.amazonaws.com/0/93976/693a71c3-642e-7d31-0ebc-a12dcaad2629.jpeg)


```shell-session
#core01の停止
ssh core@192.168.0.10
$ sudo shutdown -h now

#core04にアクセスしVIPが委譲されているか確認
ssh core@192.168.0.11
core@coreos-04 ~ $ ip a
〜〜〜
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:ad:bd:0f brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.11/24 brd 192.168.0.255 scope global enp0s3
       valid_lft forever preferred_lft forever
    inet 192.168.0.50/24 scope global secondary enp0s3
$ exit
#unitの確認
fleetctl --tunnel 192.168.0.11 list-units
UNIT			MACHINE				ACTIVE	SUB
keepalived@2.service	6d283167.../192.168.0.11	active	running
nginx-lb@2.service	6d283167.../192.168.0.11	active	running
nginx-web@2.service	6d283167.../192.168.0.11	active	running
```

## ブラウザで表示確認

http://192.168.0.50/へアクセス！

![server2.png](https://qiita-image-store.s3.amazonaws.com/0/93976/8e20e22b-69f9-bc12-a1db-5a993d135877.png)

リロードしても「server 2」しかもちろん出ませんが、VIPも移行されサービスも冗長化できていることが確認できました。

※lbのタイムアウト設定はご自身の環境に合わせて変更して下さい。今回は30sの3回失敗した場合に、もう1台へ転送するという設定です

> upstream backend {
      ip_hash;
      server 192.168.0.10:8080 max_fails=3 fail_timeout=30s ;
      server 192.168.0.11:8080 max_fails=3 fail_timeout=30s ;
      server 127.0.0.1:8080  down;
}


### 前回記事ご紹介：
[【CoreOS】fleet + docker + keepalived(VRRP+VIPのみ)で簡単LB](http://qiita.com/xshsaku/items/e9d13563e0e523def2db)
[【CoreOS】cloud-config解説〜インストール](http://qiita.com/xshsaku/items/1ba3f930ff80bef685a6)
[Mac + Virtualbox + CoreOS + etcd2 + fleet の基本設定(1)](http://qiita.com/xshsaku/items/5be3837c39bb8c9bd4e7)
[Mac + Virtualbox + CoreOS + etcd2 + fleet の基本設定(2)](http://qiita.com/xshsaku/items/a5b57fafa0b41740bd7f)
[Mac + Virtualbox + CoreOS + etcd2 + fleet の基本設定(完)](http://qiita.com/xshsaku/items/3b1c92a60f3d7e401061)