Mirantis OpenStack DVR 徹底解剖（第一回）

OpenStack Liberty ベースである Mirantis OpenStack（以下、MOS）8.0 をベースに
DVR の動作を確認してみました。

これから複数回に分けて紹介していきたいと思います。

第一回は、DVRの説明と環境の説明をしてきます。

# DVR とは
まず、DVR とは何かについて説明してきたいと思います。

従来の Neutron を使用したネットワークでは、外部ネットワークへの通信や異なるサブネットへの通信は、
すべて Network Node 上の仮想ルータを通る仕組みとなっています。

<img width="500px" alt="スライド1.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/121387/8c679219-c18d-7f94-3b56-1ecc544bbcdf.png"><br>
しかし、上記の構成の場合、
Network Node の仮想ルータがSPOF（Single Point of Failure, 単一障害点）となっており、
負荷の集中によるレスポンス低下なども起こりうる状態となっています。

その問題を解消するため、DVRが登場しました。
DVRを使用した場合、
外部ネットワークへの通信、異なるサブネットへの通信ともに自ホストの仮想ルータを使用するため、
負荷が分散され、万が一仮想ルータに障害が発生した場合の影響範囲を自ホストのみに最小化することが可能となります。

>注：ただし、North-South 通信で、Floating IP を使用せず NAT を使用する場合は、
DVR 構成の場合でも、DVR を使用しない場合と同様、Network Node の仮想ルータを使用します。

<img width="400px" alt="スライド2.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/121387/62f23969-283c-f85a-5088-bed1b492057a.png">

# 使用環境
まず検証した環境を以下に示します。
今回は、Compute ノードと Storage ノードを１台に集約し、
OpenStack としては、合計２台の構成を取っています。
![apc-env.png](https://qiita-image-store.s3.amazonaws.com/0/121387/f4928b9a-2fd4-a97d-9647-6963792d0d9f.png)

## ネットワーク
以下、ネットワークについて簡単な説明となります。

|ネットワーク名|説明|
|---|---|
|Public|外部ネットワークへの接続に使用|
|Management|OpenStack の管理用ネットワーク|
|Private|OpenStack の内部通信用ネットワーク|
|Storage|ストレージ用ネットワーク|
|Admin(PXE)|Fuel Master(※) と各ノードとの通信で使用| 

# デプロイ後の設定確認
## 全体構成
上記の環境でデプロイすると出来上がった環境がこちらになります。
![blog_default_controller (1).png](https://qiita-image-store.s3.amazonaws.com/0/121387/e9c2696a-3880-705d-6539-e750c80809bf.png)
![blog_default_compute (1).png](https://qiita-image-store.s3.amazonaws.com/0/121387/1a4a8ea7-df31-1638-0cad-a3f5b54057ea.png)
青背景：UP している NIC およびスイッチ
グレー：DOWN している NIC およびスイッチ（br-int および br-tun はポートのみ UP している状態）

少々複雑なので、次回以降、簡略化した以下の図を用いて説明していきます。
![simple_default_controller (1).png](https://qiita-image-store.s3.amazonaws.com/0/121387/c62bd700-96bb-b187-c5d9-ac48aaad9890.png)
![simple_default_compute (1).png](https://qiita-image-store.s3.amazonaws.com/0/121387/8173d085-7359-5ae9-ae80-8a941969a358.png)

VRRP(L3HA) については、今回省略しました。
別の記事で別途記載させていただこうと思います。

## 詳細
### Linux ブリッジ
#### controller01 / compute01
|名称|説明|
|---|---|
|br-fw-admin|Admin(PXE) ネットワーク通信用ブリッジ|
|br-mgmt|Management ネットワーク通信用ブリッジ|
|br-ex|Public ネットワーク通信用ブリッジ|
|br-mesh|Private ネットワーク通信用ブリッジ|
|br-storage|Storage ネットワーク通信用ブリッジ|
|qbr\*\*\*|仮想マシンと br-int をつなぐためのブリッジ|

### OVS ブリッジ
#### controller01 / compute01
|名称|説明|
|---|---|
|br-floating|Floating IP 使用時、および外部通信時に使用されるブリッジ|
|br-tun|VXLAN や GRE トンネル使用して内部ホスト間での通信に使用されるブリッジ|
|br-int|内部通信で主に使用されるブリッジ|

### NameSpace
#### controller01
|名称|説明|
|---|---|
|snat-\*\*\*|仮想 NAT|
|qrouter-\*\*\*|仮想ルータ|
|qdhcp-\*\*\*|仮想 DHCP|
|haproxy-\*\*\*|HAProxy|

#### compute01
|名称|説明|
|---|---|
|fip-\*\*\*|Floating IP|
|qrouter-\*\*\*|仮想ルータ|

### Neutron 設定

#### /etc/neutron/neutron.conf（抜粋）
##### controller01
```bash
[DEFAULT]
router_distributed = True   # DVRを使用するため 'True' を設定
core_plugin = neutron.plugins.ml2.plugin.Ml2Plugin
service_plugins =neutron.services.l3_router.l3_router_plugin.L3RouterPlugin,neutron.services.metering.metering_plugin.MeteringPlugin
l3_ha = False
# dvr_base_mac = fa:16:3f:00:00:00    # DVRを使用する際、使用する自ホストのMAC（後述）は、デフォルト値を使用
```
##### compute01
```bash
[DEFAULT]
core_plugin = neutron.plugins.ml2.plugin.Ml2Plugin
service_plugins =neutron.services.l3_router.l3_router_plugin.L3RouterPlugin,neutron.services.metering.metering_plugin.MeteringPlugin
auth_strategy = keystone
# dvr_base_mac = fa:16:3f:00:00:00    # DVRを使用する際、使用する自ホストのMAC（後述）は、デフォルト値を使用
```

#### /etc/neutron/l3_agent.ini（抜粋）
##### controller01
```bash
[DEFAULT]
agent_mode = dvr_snat    # DVRおよびNAT機能
```
##### compute01
```bash
[DEFAULT]
agent_mode = dvr    # DVR機能
```

#### /etc/neutron/plugins/ml2/ml2_conf.ini（抜粋）
##### controller01
```bash
[ml2]
type_drivers = local,flat,vlan,gre,vxlan
tenant_network_types = flat,vxlan
mechanism_drivers =openvswitch,l2population
extension_drivers =port_security
[ml2_type_gre]
tunnel_id_ranges =2:65535
[ml2_type_vxlan]
vni_ranges =2:65535
vxlan_group =224.0.0.1
[securitygroup]
enable_security_group = True
[ovs]
tunnel_bridge=br-tun
enable_tunneling=True
integration_bridge=br-int
bridge_mappings=physnet1:br-floating
[agent]
enable_distributed_routing=True   # DVRを使用するため 'True' を設定
prevent_arp_spoofing=True
arp_responder=True
polling_interval=2
drop_flows_on_start=False
vxlan_udp_port=4789
l2_population=True
tunnel_types=vxlan
```
##### compute01
```bash
[ovs]
tunnel_bridge=br-tun
enable_tunneling=True
integration_bridge=br-int
bridge_mappings=physnet1:br-floating
[agent]
enable_distributed_routing=True   # DVRを使用するため 'True' を設定
prevent_arp_spoofing=True
arp_responder=True
polling_interval=2
drop_flows_on_start=False
vxlan_udp_port=4789
l2_population=True
tunnel_types=vxlan
```

# 注釈
※ Fuel Master ・・・ MOS のデプロイおよび管理用ノード