VirtualBoxで作成したCentOSにOpenStackを構築する(Networking編)

[環境編](http://qiita.com/tk3fftk/items/76d696a874d829ea9fe4)
[Identity編](http://qiita.com/tk3fftk/items/546ab241ac7b89a1c3c2)
[Image編](http://qiita.com/tk3fftk/items/7899758d14cde4a9b2db)
[Compute編](http://qiita.com/tk3fftk/items/810e70533466c9307a93)
の続きです。


[公式ドキュメント](http://docs.openstack.org/liberty/ja/install-guide-rdo/neutron.html)に従ってやっていきます。
途中、プロバイダーネットワークとセルフサービスネットワークのどちらを構築するかの分岐がありますが、単純なプロバイダーネットワークの方をやっていきます。
セルフサービスネットワークはOpenStack内部でさらにネットワーク空間を切り分けられるイメージです。AWSのVPC的な？

# OpenStack Networking
> OpenStack Networking (neutron) を使うと、他の OpenStack サービスにより管理されているインターフェースデバイスを作成して、ネットワークに接続できます。様々なネットワーク装置やネットワークソフトウェアに対応するプラグインを実装することができ、 OpenStack のアーキテクチャーと環境に柔軟性をもたらします。

> OpenStack Networking は、おもに OpenStack Compute を連携して、コンピュートインスタンスにネットワークと接続性を提供します。

- neutronの概念: http://docs.openstack.org/liberty/ja/install-guide-rdo/neutron-concepts.html 
- わかりやすい参考記事: http://labs.gree.jp/blog/2015/02/13598/ 
- (メモ)フラットネットワーク: テナント(ユーザのグループ, プロジェクトとも)の通信を分離するの VLAN もトンネルも使用しない仮想ネットワーク方式。各フラットネットワークは、一般的にブリッジマッピングにより定義される専用の物理インターフェースを必要とする。ただし、フラットネットワークに複数のサブネットを割り当てることはできる。

## インストールと設定@コントローラノード
- DB作成 mysqlで以下を実行。 NEUTRON_DBPASSにはroot++

```mysql
  - `create database neutron;`
  - `GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' IDENTIFIED BY 'NEUTRON_DBPASS';`
  - `grant all privileges on neutron.* TO 'neutron'@'%' identified by 'NEUTRON_DBPASS';`
```

- neutronユーザ作成
  - `# openstack user create --domain default --password-prompt neutron`
      - NEUTRON_PASSとしてroot++を入力 
- adminロールにneutronユーザを追加
  - `# openstack role add --project service --user neutron admin`  
- neutronサービスエンティティ作成
  - `# openstack service create --name neutron --description "OpenStack Networking" network` - neutronのエンドポイント作成
  - `# openstack endpoint create --region RegionOne network public http://controller:9696` 
  - `# openstack endpoint create --region RegionOne network internal http://controller:9696`
  - `# openstack endpoint create --region RegionOne network admin http://controller:9696` 

### コンポーネントのインストール
  - `# yum install openstack-neutron openstack-neutron-ml2   openstack-neutron-linuxbridge python-neutronclient ebtables ipset`

- `# vim /etc/neutron/neutron.conf` で以下を編集

```properties:neutron.conf
# データベースへのアクセス方法を定義
[database]
connection = mysql://neutron:NEUTRON_DBPASS@controller/neutron # root++

# ML2プラグインを有効にして，追加プラグインを無効にする
[DEFAULT]
core_plugin = ml2
service_plugins =

# Rabbitメッセージキューの設定
[DEFAULT]
rpc_backend = rabbit

[oslo_messaging_rabbit]
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = RABBIT_PASS # root++

# identifyサービスへの接続
[DEFAULT]
auth_strategy = keystone

[keystone_authtoken]
auth_uri = http://controller:5000
auth_url = http://controller:35357
auth_plugin = password
project_domain_id = default
user_domain_id = default
project_name = service
username = neutron
password = NEUTRON_PASS # root++
# 他はコメントアウトする

# Networking が Compute にネットワークトポロジーの変更を通知するよう設定
[DEFAULT]
notify_nova_on_port_status_changes = True
notify_nova_on_port_data_changes = True
nova_url = http://controller:8774/v2

[nova]
auth_url = http://controller:35357
auth_plugin = password
project_domain_id = default
user_domain_id = default
region_name = RegionOne
project_name = service
username = nova
password = NOVA_PASS # root++

# ロックパスの設定
[oslo_concurrency]
lock_path = /var/lib/neutron/tmp
```

#### ML2プラグインの設定

> ML2 プラグインは、Linux ブリッジ機構を使用して、インスタンス用の L2 (ブリッジとスイッチ) 仮想ネットワークインフラを構築します

  - `# vi /etc/neutron/plugins/ml2/ml2_conf.ini` で以下を編集

```properties:ml2_conf.ini
[ml2] 
# フラットネットワーク，VLANネットワークを有効にする
type_drivers = flat,vlan

# プロジェクト(プライベート)ネットワークを無効にする
tenant_network_types =

# Linuxブリッジ機構を有効にする
mechanism_drivers = linuxbridge

# ポートセキュリティ拡張ドライバーを有効にする
extension_drivers = port_security

# パブリックフラットプロバイダーネットワークを設定
[ml2_type_flat]
flat_networks = public

# ipset を有効にし、セキュリティーグループルールの効率性を向上させます。
[ml2_type_flat]
flat_networks = public
```

#### Linuxブリッジエージェントの設定

>プライベートネットワーク向けの VXLAN トンネルなどの、インスタンス用の L2 (ブリッジおよびスイッチ) 仮想ネットワークインフラを構築して、セキュリティーグループを処理します。

- `# vi /etc/neutron/plugins/ml2/linuxbridge_agent.ini` で以下を編集

```properties:linuxbridge_agent.ini
# 仮想パブリックネットワークを物理パブリックネットワークのインタフェースに結びつける
[linux_bridge]
# public:enp0s3とした
physical_interface_mappings = public:PUBLIC_INTERFACE_NAME

# VXLANオーバレイネットワークを無効
[vxlan]
enable_vxlan = False

# ARPスプーフィングの保護を有効
[agent]
prevent_arp_spoofing = True

# セキュリティグループを有効にし、 Linux ブリッジ iptables ファイアウォールドライバーを設定
[securitygroup]
enable_security_group = True
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
```

#### DHCPエージェントの設定
  - `# vi /etc/neutron/dhcp_agent.ini` で以下を編集

```properties:dhcp_agent.ini
# Linux ブリッジインターフェースドライバー、Dnsmasq DHCP ドライバーを設定して、 isolated metadata を有効にします。これにより、パブリックネットワークにあるインスタンスがネットワーク経由でメタデータにアクセスできます。
[DEFAULT]
interface_driver = neutron.agent.linux.interface.BridgeInterfaceDriver
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
enable_isolated_metadata = True
```

#### メタデータエージェントの設定

>メタデータエージェント は、クレデンシャルなどの設定情報をインスタンスに提供する

- `# vi /etc/neutron/metadata_agent.ini`

```properties:metadata_agent.ini
# アクセスパラメータを設定
[DEFAULT]
auth_uri = http://controller:5000
auth_url = http://controller:35357
auth_region = RegionOne
auth_plugin = password
project_domain_id = default
user_domain_id = default
project_name = service
username = neutron
password = NEUTRON_PASS # root++

# メタデータホストの設定
[DEFAULT]
nova_metadata_ip = controller

# メタデータプロキシーの共有シークレットを設定します。
[DEFAULT]
metadata_proxy_shared_secret = METADATA_SECRET # meta++
```

#### Networkingを利用するためのComputeの設定
  - `# vi /etc/nova/nova.conf`

```properties:nova.conf
# アクセス用のパラメーターを設定し、メタデータプロキシーを有効にし、シークレットを設定
[neutron]
url = http://controller:9696
auth_url = http://controller:35357
auth_plugin = password
project_domain_id = default
user_domain_id = default
region_name = RegionOne
project_name = service
username = neutron
password = NEUTRON_PASS # root++
 
service_metadata_proxy = True
metadata_proxy_shared_secret = METADATA_SECRET # meta++
``` 

#### シンボリックリンクの作成
  - `# ln -s /etc/neutron/plugins/ml2/ml2_conf.ini  /etc/neutron/plugin.ini`
  - `ll /etc/neutron/` して `plugin.ini -> /etc/neutron/plugins/ml2/ml2_conf.ini` なっていればおk

#### DB展開
- `su -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutron`
  -  Failed to parse /etc/neutron/neutron.conf: at /etc/neutron/neutron.conf:3, Unexpected continuation line: ' verbose = True'
      - とでたのでコメントアウト
  - Failed to parse /etc/neutron/neutron.conf: at /etc/neutron/neutron.conf:60, Unexpected continuation line: ' core_plugin = ml2' 
      - 頭に半角スペース入っていると刺さるっぽい 刺さらないパラメータもあるが，削除しておいた方が身のためか
      - 多分↑のverboseも同じ原因
      - パラメータ前のスペースを全て消した後再度実行 -> いけた

- Compute API サービスを再実行
  - `# systemctl restart openstack-nova-api`

- 起動設定
  - `# systemctl enable neutron-server neutron-linuxbridge-agent neutron-dhcp-agent neutron-metadata-agent`
  - `# systemctl start neutron-server neutron-linuxbridge-agent neutron-dhcp-agent neutron-metadata-agent`

### インストールと設定@コンピュートノード
- コンポーネントのインストール
  - `# yum install openstack-neutron openstack-neutron-linuxbridge ebtables ipset`

- `# vi /etc/neutron/neutron.conf`

```properties:neutron.cong
# Rabbitメッセージキューの設定
[DEFAULT]
rpc_backend = rabbit

[oslo_messaging_rabbit]
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = RABBIT_PASS # root++

# identifyサービスへの接続
[DEFAULT]
auth_strategy = keystone

[keystone_authtoken]
auth_uri = http://controller:5000
auth_url = http://controller:35357
auth_plugin = password
project_domain_id = default
user_domain_id = default
project_name = service
username = neutron
password = NEUTRON_PASS # root++
# 他はコメントアウトする

# ロックパスの設定
[oslo_concurrency]
lock_path = /var/lib/neutron/tmp

```

#### Linuxブリッジエージェントの設定
  - `# vim /etc/neutron/plugins/ml2/linuxbridge_agent.ini` で以下

```properties:linuxbridge_agent.ini
# 仮想パブリックネットワークを物理パブリックネットワークのインタフェースに結びつける
[linux_bridge]
# public:enp0s3とした
physical_interface_mappings = public:PUBLIC_INTERFACE_NAME

# VXLANオーバレイネットワークを無効
[vxlan]
enable_vxlan = False

# ARPスプーフィングの保護を有効
[agent]
prevent_arp_spoofing = True

# セキュリティグループを有効にし、 Linux ブリッジ iptables ファイアウォールドライバーを設定
[securitygroup]
enable_security_group = True
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
```

#### Networkingを利用するためのComputeの設定
  - `# vim /etc/nova/nova.conf`

```properties:nova.conf
# neutronアクセス用のパラメーターを設定
[neutron]
url = http://controller:9696
auth_url = http://controller:35357
auth_plugin = password
project_domain_id = default
user_domain_id = default
region_name = RegionOne
project_name = service
username = neutron
password = NEUTRON_PASS # root++
```

- 起動設定
  - `# systemctl enable neutron-linuxbridge-agent`
  - `# systemctl start neutron-linuxbridge-agent`

## 確認
- ロード済拡張機能一覧を表示して，neutron-serverプロセスが正しく起動していることを確認する
  - `neutron ext-list`
      - オプション1を選択したのでチュートリアルの例より少ない
- neutronエージェントが正常に起動したことを確認するため，エージェント一覧を表示
  - `neutron agent-list`
      - コントローラノードに3つのエージェント，コンピュートノードに1つのエージェントがあることを確認
- ここまで終われば，基本的なインスタンスを起動するために必要なコンポーネントがOpenStack環境に追加されたことになります。