Mirantis vmware-dvsドライバによるOpenStack + VMwareのネットワーク統合

## vmware-dvsとは
https://github.com/Mirantis/vmware-dvs
Mirantisが開発を行っているVMware vSphere用のML2(MoudleLayer2)のメカニズムドライバの一つだ。ご存じのとおりML2はメカニズムドライバを変更することでネットワークの実装部分を変更する事ができる。おおよその人たちは、1度はOpen vSwitchの設定をしただろう(昨今はLinuxBridge？)。それに追加してこのvmware-dvsドライバを入れることで、VMware vSphereでのネットワーク構築、またOpenvSwitchと連携してKVM等他ハイパーバイザの混在環境を作成できる。

一般的に、ESXiをハイパーバイザとした場合にはVMware NSXなどのSDN製品が必要になったりするが、高価であったり、試用ができなかったりと敷居が高い。しかしこのドライバであれば、vSphere Distributed Switchが使える環境であれば問題ない、vSphere Enterprise Plusがあれば利用が可能である。この製品はMy VMwareに登録すれば60日間試用が可能だ。

基本的な動きは、OpenStackでネットワーク作成->Distributed SwitchにPortGroupを作成、OpenStackでサブネット作成->PortGroupにVLANを設定する、という単純なフローとなる。

## 検証環境
![20151225162809.png](https://qiita-image-store.s3.amazonaws.com/0/50813/a9abb434-a3bb-2ede-ed9d-c83f8f3f82bc.png)

(様々な検証を行っていたので、ごちゃごちゃしていてすみません。。。)

全てvSphere上のVMを用いてOpenStackを構築した。OpenStackはController1台とComputeとNetworkの兼任(Compute自身にVMを立てるわけでは無いので負荷が低いため)が1台、vSphere上にnovaを経由してVMを立てるためのマシンが1台となる。このVMを立てるマシンには、Distributed Switchを設定してある。

各OSはCentOS 7.0を使い、OpenStackのLibertyをPackStackを使ってデプロイした。その際、VMware環境がハイパーバイザであること、ネットワークとしてVLANを用いることをanswerファイル(PackStackにおける構築設定)に記入した。

## vmware-dvsの導入
無事OpenStackが入れ終わったらvmware-dvsを導入する。導入方法自体はリポジトリ内の[INSTALL.rst](https://github.com/Mirantis/vmware-dvs/blob/master/INSTALL.rst)に書かれている。

### Controllerへのインストール
pipとgitを用いてインストールする。(CentOS7.0ではデフォルトでは入っていないのでyumで入れておく)
`# pip install git+git://github.com/Mirantis/vmware-dvs.git@liberty`
行末に`@liberty`を追加することでLibertyブランチを指定している。
ここで依存関係等でERRORが出たりするので適切に処理する。(setuptoolsやsixが古いなどでERRORが出た)

また、ml2_conf.ini、neutron.confの設定をする。

```ini:/etc/neutron/plugins/ml2/ml2_conf.ini
[ml2]
...
type_drivers = vlan
tenant_network_types = vlan
mechanism_drivers =openvswitch, vmware_dvs

[ml2_type_vlan]
...
network_vlan_ranges = physnet1:1000:2999

[ml2_vmware]
vsphere_hostname = vcenter.openstack.local
vsphere_login = <vSphereのユーザ名>
vsphere_password = <vSphereのパスワード>
network_maps = physnet1:DSwitch-Compute
```
`type_drivers`や`network_vlan_ranges`はデプロイ時に設定されているはずなので、あくまで確認。`mechanism_drivers`と`[ml2_vmware]`のセクションの追記をする。`network_maps`は`vlan_ranges`が複数あればカンマ区切りで追加する。

```ini:/etc/neutron/neutron.conf
[DEFAULT]
...
nova_admin_tenant_name = <nova admin tenant name>
nova_admin_username = <nova admin user name>
nova_admin_password = <nova admin password>
nova_admin_tenant_id = <nova admin tenant_id>

notification_driver = messagingv2
notification_topics = notifications,vmware_dvs
```
`nova_admin_*`は設定されてるか確認、`notification_*`の行を設定する。

実は`nova_admin_*`の表現は古いものであり、Liberty以降で新しい設定になった模様。ただ、このままではvmware-dvsが動かない。PackStackでデプロイするとこの設定になってしまうし、[リファレンス](http://docs.openstack.org/liberty/config-reference/content/section_neutron.conf.html)で新しい設定も見つけられず、vmware-dvsの一部ソースを変更することにして対応した。

```py:/usr/lib/python2.7/site-packages/mech_vmware_dvs/compute_util.py
    params = dict(
         #元々のソース 42行目~
         #username=cfg.nova.username,
         #api_key=cfg.nova.password,
         #project_id=cfg.nova.tenant_name,
         #auth_url=cfg.nova.auth_url+”v2.0/”,
         
         #変更点ここから
         username=cfg.nova_admin_username,
         api_key=cfg.nova_admin_password,
         project_id=cfg.nova_admin_tenant_name,
         auth_url=cfg.nova_admin_auth_url,
         #変更点ここまで
         bypass_url=bypass_url,
    )
```

### Computeへのインストール
ComputeではNovaにパッチを当てる必要がある(patchはCentOS7.0では入っていないのでyumで入れておく)。nova.patchはvmware-dvsのリポジトリにあるのでそこから入手する。

`patch -p1 -d /usr/lib/python2.7/site-packages/ < nova.patch`


これでドライバの導入は完了。各コンポーネントをrestartするなり、マシンごとリブートして、導入したドライバが使えるようにする。

## デモ
### ネットワークの作成
Horizonからネットワークの作成を行った。
![20151225175124.png](https://qiita-image-store.s3.amazonaws.com/0/50813/b5eefd28-c937-182b-0d96-70339e96f28a.png)
OpenStack上で作成したネットワークのIDと同じ名前のポートグループがDistributed Switchに作成されている事がわかる。またVLAN IDが設定され、説明には*Managed By Neutron*となっていることも確認できる。

### インスタンスを接続
インスタンスを新しく作成し、先ほど作成したネットワークに接続してみた。
![20151225181028.png](https://qiita-image-store.s3.amazonaws.com/0/50813/9d9d1265-f8cd-a79b-9ecb-733a496e8e8d.png)
インスタンスが作成したネットワークに接続されたことが確認できた。

## 所感
SDN製品を使ったり、[OVSvApp](http://www.slideshare.net/ShingoKitayama/introduction-ovsvapp)、[VMware Integrated OpenStack](http://www.vmware.com/jp/products/openstack)などを使うのに比較して、手軽にVMware vSphere込みのOpenStack環境を作ることができます。現状は開発中のため若干不安定なところはありますが、今後もFW機能等も増えてくる模様です。