Mirantis OpenStack 9.0 (Mitakaベース) で LBaaS(V2) を使用する

# 概要
Mirantis OpenStack 9.0(以下、MOS9.0) 上で、LBaaS(V2) 機能が使用できるようにしていきたいと思います。

# セットアップ手順

## Fuel LBaaS Plugin の準備
MOS9.0 に対応した LBaaS Plugin のインストールパッケージを準備します。
[こちら](https://github.com/falcon39/openstack-plugins/blob/master/fuel-plugin-neutron-lbaas/lbaas-1.0-1.0.3-1.noarch.rpm)から作成済みのものをダウンロードするか、
以下の手順に従ってソースコードから作成してください。

### パッケージ作成
はじめに、パッケージのビルドに必要なパッケージをインストールします。
fuel-plugin-builder パッケージは、Fuel Plugin のビルドに使用されます。

```bash
$ sudo apt-get update
$ sudo apt-get install createrepo rpm dpkg-dev
$ sudo apt-get install git

$ sudo easy_install pip
$ sudo pip install fuel-plugin-builder
```

作業用PC（今回は Ubuntu を使用）に接続し、[GitHub](https://github.com/openstack/fuel-plugin-neutron-lbaas) から `9.0` ブランチのクローンを取得します。

```bash
$ cd
$ git clone https://github.com/openstack/fuel-plugin-neutron-lbaas
Cloning into 'fuel-plugin-neutron-lbaas'...
remote: Counting objects: 94, done.
remote: Compressing objects: 100% (14/14), done.
remote: Total 94 (delta 2), reused 0 (delta 0), pack-reused 78
Unpacking objects: 100% (94/94), done.
Checking connectivity... done.
```

・ビルドを実施します。

```bash
$ cd
$ fpb --build ./fuel-plugin-neutron-lbaas/
Plugin is built
```

rpm ファイルが作成されたことを確認します。

```bash
$ ls -al ./fuel-plugin-neutron-lbaas/*.rpm
-rw-rw-r-- 1 ubuntu ubuntu 17086 Aug 23 05:08 ./fuel-plugin-neutron-lbaas/lbaas-1.0-1.0.3-1.noarch.rpm
```

## Fuel LBaaS Plugin のインストール
作成した rpm ファイルを Fuel Master へ配置した後、以下のコマンドを実行して、インストールします。

```
# fuel plugins --install lbaas-1.0-1.0.3-1.noarch.rpm
Loaded plugins: fastestmirror, priorities
Examining lbaas-1.0-1.0.3-1.noarch.rpm: lbaas-1.0-1.0.3-1.noarch
Marking lbaas-1.0-1.0.3-1.noarch.rpm to be installed
Resolving Dependencies
--> Running transaction check
---> Package lbaas-1.0.noarch 0:1.0.3-1 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

=================================================================================================================================================
 Package                        Arch                        Version                         Repository                                      Size
=================================================================================================================================================
Installing:
 lbaas-1.0                      noarch                      1.0.3-1                         /lbaas-1.0-1.0.3-1.noarch                       25 k

Transaction Summary
=================================================================================================================================================
Install  1 Package

Total size: 25 k
Installed size: 25 k
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : lbaas-1.0-1.0.3-1.noarch                                                                                                      1/1
  Verifying  : lbaas-1.0-1.0.3-1.noarch                                                                                                      1/1

Installed:
  lbaas-1.0.noarch 0:1.0.3-1

Complete!
Plugin lbaas-1.0-1.0.3-1.noarch.rpm was successfully installed.
```

Fuel LBaaS Plugin がインストールされたことを確認します。
正常にインストールが完了している場合、Fuel プラグイン一覧に表示されます。

```
# fuel plugins
id | name  | version | package_version | releases
---+-------+---------+-----------------+--------------------
1  | lbaas | 1.0.3   | 3.0.0           | ubuntu (mitaka-9.0)
```

Fuel コンソールの [PLUGINS] タブを開き、以下の通り表示されてれば問題ありません。
<font color="red">※ MOS バージョンに対応していない等で利用できない場合は、感嘆符(!)が表示されます。</font>
<img src="https://qiita-image-store.s3.amazonaws.com/0/129198/713b1e44-4422-294b-8640-892b865a1b59.jpeg" width=900px></img>

正常にインストールされている場合、
Environment 画面の [Settings]-[Other] に "LBaaS plugin for Neutron" が表示されているので、
チェックを入れてからデプロイを開始します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/129198/3b1455f6-551d-18f4-25ce-6c0513d63ad0.jpeg" width=900px></img>

# LBaaS 設定
## 設定確認
neutron.conf に LBaaS 関連のプラグインが設定されていることが確認できます。

```
# grep "lbaas" /etc/neutron/neutron.conf
service_plugins =neutron.services.l3_router.l3_router_plugin.L3RouterPlugin,neutron.services.metering.metering_plugin.MeteringPlugin,neutron_lbaas.services.loadbalancer.plugin.LoadBalancerPluginv2
service_provider=LOADBALANCERV2:Haproxy:neutron_lbaas.drivers.haproxy.plugin_driver.HaproxyOnHostPluginDriver:default
```

neutron のサービスプロバイダとして、`LOADBALANCERV2`が表示されます。

```
# neutron service-provider-list
+----------------+---------+---------+
| service_type   | name    | default |
+----------------+---------+---------+
| LOADBALANCERV2 | haproxy | True    |
+----------------+---------+---------+
```

# 動作確認
<img src="https://qiita-image-store.s3.amazonaws.com/0/129198/8a99ca62-1e1e-6c9c-75d0-2e945a438ac8.png" width="800px"></img>

## LBaaS V2
###ロードバランサの設定
Load Balancer の作成を行っていきます。
ここでは、`private-subnet` からアクセスを受け付ける想定で作成しています。

```
# neutron lbaas-loadbalancer-create --name lb-test private_network_subnet
```

作成したロードバランサが以下の状態となることを確認します。

- operating_status: "ONLINE" となっていること
- provisioning_status: "ACTIVE" となっていること
- vip_address: 指定したサブネットの IP が割り当てられていること

```
# neutron lbaas-loadbalancer-show lb-test
+---------------------+--------------------------------------+
| Field               | Value                                |
+---------------------+--------------------------------------+
| admin_state_up      | True                                 |
| description         |                                      |
| id                  | 2e9bdc22-a12b-400c-b9c2-7d11aca04ba8 |
| listeners           |                                      |
| name                | lb-test                              |
| operating_status    | ONLINE                               |
| pools               |                                      |
| provider            | haproxy                              |
| provisioning_status | ACTIVE                               |
| tenant_id           | 8933cf2d02004242bebeefa933146b70     |
| vip_address         | 10.16.0.3                            |
| vip_port_id         | f9f98325-6a11-4414-ba23-99ee65c2745f |
| vip_subnet_id       | 6c022960-6447-49be-8be3-3029e3ce2634 |
+---------------------+--------------------------------------+
```

### セキュリティグループの設定
作成したロードバランサのネットワークポートに設定するセキュリティグループの作成を行います。
まず、セキュリティグループを作成し、以下の通りルールを追加します。

|DIRECTION|PROTOCOL|PORT RANGE MIN|PORT RANGE MAX|REMOTE IP PREFIX|
|:--|:--|:--|:--|:--|
|受信|tcp|80|80|0.0.0.0/0|
|受信|tcp|443|443|0.0.0.0/0|
|受信|icmp|-|-|-|

```
# neutron security-group-create sg-lb-test

# neutron security-group-rule-create \
  --direction ingress \
  --protocol tcp \
  --port-range-min 80 \
  --port-range-max 80 \
  --remote-ip-prefix 0.0.0.0/0 \
  sg-lb-test

# neutron security-group-rule-create \
  --direction ingress \
  --protocol tcp \
  --port-range-min 443 \
  --port-range-max 443 \
  --remote-ip-prefix 0.0.0.0/0 \
  sg-lb-test

# neutron security-group-rule-create \
  --direction ingress \
  --protocol icmp \
  sg-lb-test
```

作成したセキュリティグループを確認します。

```
# neutron security-group-list --name  sg-lb-test
+--------------------------------------+------------+-----------------------------------------------------+
| id                                   | name       | security_group_rules                                |
+--------------------------------------+------------+-----------------------------------------------------+
| 75f25159-8239-44dc-b60b-d0a00973fb2e | sg-lb-test | egress, IPv4                                        |
|                                      |            | egress, IPv6                                        |
|                                      |            | ingress, IPv4, 443/tcp, remote_ip_prefix: 0.0.0.0/0 |
|                                      |            | ingress, IPv4, 80/tcp, remote_ip_prefix: 0.0.0.0/0  |
|                                      |            | ingress, IPv4, icmp                                 |
+--------------------------------------+------------+-----------------------------------------------------+
```

作成したセキュリティグループをロードバランサのネットワークポートに関連付けします。
<font color="blue">※ 引数で指定するネットワークポートが知りたい場合は、
&nbsp;&nbsp;&nbsp;&nbsp;"lbaas-loadbalancer-show" コマンドを実行し、"vip_port_id" の値をご参照ください。</font>

```
# neutron port-update --security-group sg-lb-test f9f98325-6a11-4414-ba23-99ee65c2745f
Updated port: f9f98325-6a11-4414-ba23-99ee65c2745f
```

"security_groups" 項目にセキュリティグループ ID が設定されていることを確認します。

```
# neutron port-show f9f98325-6a11-4414-ba23-99ee65c2745f -F name  -F security_groups
+-----------------+---------------------------------------------------+
| Field           | Value                                             |
+-----------------+---------------------------------------------------+
| name            | loadbalancer-2e9bdc22-a12b-400c-b9c2-7d11aca04ba8 |
| security_groups | 75f25159-8239-44dc-b60b-d0a00973fb2e              |
+-----------------+---------------------------------------------------+
```

###ロードバランサまでの疎通確認
このロードバランサの設定が完了したら、次のステップへ行く前にロードバランサまでの疎通を ping コマンドで確認しておきます。

```
$ ping -c 3 192.168.1.22
```

### Listener の設定
Load Balancer が ONLINE の状態で、HTTP Listener と HTTPS Listener をそれぞれ作成します。

```
# neutron lbaas-listener-create \
  --name listener-test-http \
  --loadbalancer lb-test \
  --protocol HTTP \
  --protocol-port 80

# neutron lbaas-listener-create \
  --name listener-test-https \
  --loadbalancer lb-test \
  --protocol HTTPS \
  --protocol-port 443

# neutron lbaas-listener-list
+--------------------------------------+-----------------+---------------------+----------+---------------+----------------+
| id                                   | default_pool_id | name                | protocol | protocol_port | admin_state_up |
+--------------------------------------+-----------------+---------------------+----------+---------------+----------------+
| bc3f818e-285b-4f22-99de-528c34638011 |                 | listener-test-http  | HTTP     |            80 | True           |
| df8692f8-a3d8-4e50-bada-df0fab37f348 |                 | listener-test-https | HTTPS    |           443 | True           |
+--------------------------------------+-----------------+---------------------+----------+---------------+----------------+
```

### Pool の設定
続けて HTTP と HTTPS の Pool をそれぞれ作成します。
今回、ロードバランシングのアルゴリズムは、HTTP は "ROUND_ROBIN"、HTTPS は "LEAST_CONNECTIONS" としています。

```
# neutron lbaas-pool-create \
  --name pool-test-http \
  --lb-algorithm ROUND_ROBIN \
  --listener listener-test-http \
  --protocol HTTP

# neutron lbaas-pool-create \
  --name pool-test-https \
  --lb-algorithm LEAST_CONNECTIONS \
  --listener listener-test-https \
  --protocol HTTPS

# neutron lbaas-pool-list
+--------------------------------------+-----------------+----------+----------------+
| id                                   | name            | protocol | admin_state_up |
+--------------------------------------+-----------------+----------+----------------+
| 45207ead-24b2-4802-a873-6351603f7945 | pool-test-https | HTTPS    | True           |
| c13a05b7-ca6d-4b1f-a008-0936d3d086f6 | pool-test-http  | HTTP     | True           |
+--------------------------------------+-----------------+----------+----------------+
```

### Member の設定
HTTP のプールメンバを作成し、HTTP のプール(pool-test-http)と関連付けます。

```
# neutron lbaas-member-create \
  --subnet private_network_subnet \
  --address 10.16.0.8 \
  --protocol-port 80 \
  pool-test-http
# neutron lbaas-member-create \
  --subnet private_network_subnet \
  --address 10.16.0.9 \
  --protocol-port 80 \
  pool-test-http

# neutron lbaas-member-list pool-test-http
+--------------------------------------+------+-----------+---------------+--------+--------------------------------------+----------------+
| id                                   | name | address   | protocol_port | weight | subnet_id                            | admin_state_up |
+--------------------------------------+------+-----------+---------------+--------+--------------------------------------+----------------+
| 94eaaa07-d9de-4c76-8a12-458f678ba016 |      | 10.16.0.8 |            80 |      1 | 6c022960-6447-49be-8be3-3029e3ce2634 | True           |
| 9433d8b7-d341-4a4e-86df-3d642586960b |      | 10.16.0.9 |            80 |      1 | 6c022960-6447-49be-8be3-3029e3ce2634 | True           |
+--------------------------------------+------+-----------+---------------+--------+--------------------------------------+----------------+
```

HTTPS のプールメンバも同様に、作成した後、HTTPS のプール(pool-test-https)と関連付けます。

```
# neutron lbaas-member-create \
  --subnet private_network_subnet \
  --address 10.16.0.8 \
  --protocol-port 443 \
  pool-test-https
# neutron lbaas-member-create \
  --subnet private_network_subnet \
  --address 10.16.0.9 \
  --protocol-port 443 \
  pool-test-https

# neutron lbaas-member-list pool-test-https
+--------------------------------------+------+-----------+---------------+--------+--------------------------------------+----------------+
| id                                   | name | address   | protocol_port | weight | subnet_id                            | admin_state_up |
+--------------------------------------+------+-----------+---------------+--------+--------------------------------------+----------------+
| 9f558822-ad80-4a62-bb53-2d93ffa2afcf |      | 10.16.0.8 |           443 |      1 | 6c022960-6447-49be-8be3-3029e3ce2634 | True           |
| a5431ccb-a0e6-4d2f-a950-ddc520b41071 |      | 10.16.0.9 |           443 |      1 | 6c022960-6447-49be-8be3-3029e3ce2634 | True           |
+--------------------------------------+------+-----------+---------------+--------+--------------------------------------+----------------+
```

### Health Monitor 設定
接続できない Member をプールから除外するように、Health Monitor を設定します。
ヘルスチェックの値は、アプリケーションの特性やサービスレベルに合わせて、任意の値に変更してください。

```
# neutron lbaas-healthmonitor-create \
  --delay 5 \
  --max-retries 2 \
  --timeout 10 \
  --type HTTP \
  --pool pool-test-http

# neutron lbaas-healthmonitor-create \
  --delay 5 \
  --max-retries 2 \
  --timeout 10 \
  --type HTTPS \
  --pool pool-test-https

# neutron lbaas-healthmonitor-list
+--------------------------------------+------+-------+----------------+
| id                                   | name | type  | admin_state_up |
+--------------------------------------+------+-------+----------------+
| dfd8c872-c5fd-49f1-9c1e-01eb4c1195ed |      | HTTP  | True           |
| e0dde485-0495-4447-afa4-6d20a24bdcd9 |      | HTTPS | True           |
+--------------------------------------+------+-------+----------------+
```

### Floating IP の割り当て
ロードバランサが、パブリックまたはプロバイダーネットワークにデプロイされている場合、外部からロードバランサの VIP にアクセスすることができます。

しかし、プライベートネットワークや隔離されたネットワークにデプロイされている場合は、そのままでは、ロードバランサにアクセスすることができません。
その場合、"neutron floatingip-associate" コマンドを使用して Floating IP をロードバランサに割り当てることで、
外部からロードバランサの VIP へアクセスできるようにすることができます。

```
### neutron floatingip-associate <割り当てる Floating IP の ID> <ロードバランサのポート ID>

# neutron floatingip-associate 357d04e6-e658-4969-9f53-3966fb36d858 f9f98325-6a11-4414-ba23-99ee65c2745f
Associated floating IP 357d04e6-e658-4969-9f53-3966fb36d858
```

### ロードバランサの統計情報の取得
LBaaS v2 agent は、以下の４つの項目について、それぞれのロードバランサから６秒ごとに統計情報を収集します。

- active_connections
- bytes_in
- bytes_out
- total_connections

"lbaas-loadbalancer-stats" コマンドを使用することで、それらの値を確認することができます。

```
# neutron lbaas-loadbalancer-stats lb-test
+--------------------+-------+
| Field              | Value |
+--------------------+-------+
| active_connections | 0     |
| bytes_in           | 234   |
| bytes_out          | 35292 |
| total_connections  | 3     |
+--------------------+-------+
```
"active_connections" のカウント値は、データ取得時点で、アクティブとなっている総コネクション数で、
他の３つの項目については、ロードバランサが起動してからの累積値を表示しています。

# 備考
UI の設定方法については、確認でき次第追記していきます。

## 2016/08/29
[公式の GitHub](https://github.com/openstack/fuel-plugin-neutron-lbaas)にて、MOS9.0対応がされたようなので、URL を変更しました。
Horizon のメニューについては、変わらず表示されていませんでした。


# 参考 URL
[GitHub] fuel-plugin-neutron-lbaas
- https://github.com/openstack/fuel-plugin-neutron-lbaas

[GitHub] fuel-plugin-neutron-lbaas (Qiitaブログ用)
- https://github.com/falcon39/fuel-plugins/tree/master/fuel-plugin-neutron-lbaas

[公式マニュアル]ロードバランサas a Service (LBaaS)
- http://docs.openstack.org/mitaka/ja/networking-guide/adv-config-lbaas.html