2014年11月20日木曜日

OpenStack Juno ML2 PluginでDVRを動かしてみた

※2014/11/21追記 問題は解決しました。

Ubuntu1404上にOpenStack Junoをインストールし、Neutron DVRを動かしたのでメモ

ML2のインストールまではひとまずうまく設定できた。
参考にしたのは日本仮想化株式会社さんのOpenStack構築手順書オフィシャルドキュメントOpenStackWiki

Neutronインストール時に忘れててはまった事柄
データベースの作成。これを忘れると当然エラーになる。
コンフィグの変更が終わったら、走らすこと。
su -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf \
  --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade juno" neutron

通常のインストールが終わってから、DVRの設定を行う。
JunoからDVR(Distributed Virual Router)が実装されたことで、L3エージェントのモードが追加になっている。
今までのnetworkノードのみを使う実装は"legacy"モードになり、DVRのモードは"dvr-snat"と"dvr"の二つがある。
DVRを使っても、DHCPとSNATはnetworkノードで行う。Floating IPはNova Computeで行うようだ。(未確認)
この、SNATを行うノードは"dvr-snat"のモードとなり、Nova Computeは"dvr"のモードで動く。
Nova ComputeでもL3エージェントが動くことになるので、Networkノード同様ex-brの設定とL3エージェントをインストールしておく。

コンフィグが必要なのは以下の3つのファイル
neutron.conf
l3_agent.ini
ml2_conf.ini

neutron.confの設定
#router_distributed = false を router_distributed = true に変更する。

Neutronサーバのコンフィグ例
[DEFAULT]
core_plugin = ml2
service_plugins = router
auth_strategy = keystone
allow_overlapping_ips = True
rpc_backend = neutron.openstack.common.rpc.impl_kombu
rabbit_host = controller
rabbit_password = password
notify_nova_on_port_status_changes = True
notify_nova_on_port_data_changes = True
nova_url = http://controller:8774/v2
nova_admin_username = nova
router_distributed = True 
lock_path = $state_path/lock
core_plugin = ml2
nova_admin_tenant_id = f5c9d49a31ba4b3c900e56c656ecd146
nova_admin_password = password
nova_admin_auth_url = http://controller:35357/v2.0
rabbit_port=5672
[matchmaker_redis]
[matchmaker_ring]
[quotas]
[agent]
root_helper = sudo /usr/bin/neutron-rootwrap /etc/neutron/rootwrap.conf
[keystone_authtoken]
auth_uri = http://controller:5000
uth_host = controller
auth_port = 35357
auth_protocol = http
admin_tenant_name = service 
admin_user = neutron
admin_password = password
[database]
connection = mysql://neutron:password@10.0.0.71/neutron
[service_providers]
service_provider=LOADBALANCER:Haproxy:neutron.services.loadbalancer.drivers.haproxy.plugin_driver.HaproxyOnHostPluginDriver:default
service_provider=VPN:openswan:neutron.services.vpn.service_drivers.ipsec.IPsecVPNDriver:default

Networkノード,Nova computeのコンフィグ例
[DEFAULT]
core_plugin = ml2
service_plugins = router
auth_strategy = keystone
allow_overlapping_ips = True
rpc_backend = neutron.openstack.common.rpc.impl_kombu
rabbit_host = controller
rabbit_password = password
router_distributed = True 
lock_path = $state_path/lock
core_plugin = ml2
dvr_base_mac = fa:16:3f:00:00:00
rabbit_port=5672
[matchmaker_redis]
[matchmaker_ring]
[quotas]
[agent]
root_helper = sudo /usr/bin/neutron-rootwrap /etc/neutron/rootwrap.conf
[keystone_authtoken]
auth_uri = http://controller:5000
auth_host = controller
auth_port = 35357
auth_protocol = http
admin_tenant_name = service
admin_user = neutron
admin_password = password
[database]
connection = mysql://neutron:password@10.0.0.71/neutron 
[service_providers]
service_provider=LOADBALANCER:Haproxy:neutron.services.loadbalancer.drivers.haproxy.plugin_driver.HaproxyOnHostPluginDriver:default
service_provider=VPN:openswan:neutron.services.vpn.service_drivers.ipsec.IPsecVPNDriver:default
※keystoneとdatabaseの設定はいらないかも?

ml2_conf.iniの設定
tenant_network_typesにl2populationを追加
NetworkノードとNova Computeは[ovs]セクションに以下の2つを設定
l2_population = True
enable_distributed_routing = True
Wikiにトンネルタイプはvxlanを使えと書いてあるが、nova boot時にエラーがでるので、個々ではGREを使用。

Neutronサーバのコンフィグ例
[ml2]
type_drivers = flat,vlan,gre,vxlan
tenant_network_types = vlan,gre,vxlan
mechanism_drivers = openvswitch,l2population
[ml2_type_flat]
[ml2_type_vlan]
[ml2_type_gre]
tunnel_id_ranges = 1:1000
[ml2_type_vxlan]
[securitygroup]
firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
enable_security_group = True

Networkノード,Nova computeのコンフィグ例
[ml2]
type_drivers = flat,vlan,gre,vxlan
tenant_network_types = vlan,gre,vxlan
mechanism_drivers = openvswitch,l2population
[ml2_type_flat]
[ml2_type_vlan]
[ml2_type_gre]
tunnel_id_ranges = 1:1000
[ml2_type_vxlan]
[securitygroup]
firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
enable_security_group = True
[ovs]
local_ip = 10.0.1.72
tunnel_type = gre 
enable_tunneling = True
l2_population = True
enable_distributed_routing = True
tunnel_bridge=br-tun
int_peer_patch_port=patch-tun
tun_peer_patch_port=patch-int

l3_agent.iniの設定
コンフィグ自体はシンプルでl3_agent.iniの"agent_mode"を変更するだけ。
Networkノードは"dvr-snat"に設定し、Nova Computeは"dvr"に設定する。

Networkノードのコンフィグ例
[DEFAULT]
interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
use_namespaces = True
agent_mode = dvr_snat

Nova computeのコンフィグ例
[DEFAULT]
interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
use_namespaces = True
agent_mode = dvr 

NetworkノードとNova Computeのインターフェイスの設定は以下のようにした。
外部接続用ネットワークbr-ex 10.0.0.0/24、VXLAN用ネットワーク10.0.1.0/24

Networkノード
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet manual 
        up ip address add 0/0 dev $IFACE
        up ip link set $IFACE up
        down ip link set $IFACE down
auto eth1                                                                                                                                    
iface eth1 inet static                                                                                                                       
        address 10.0.1.72                                                                                                                    
        netmask 255.255.255.0                                                                                                                
        network 10.0.1.0 
auto br-ex
iface br-ex inet static
        address 10.0.0.72
        netmask 255.255.255.0
        network 10.0.0.0
        broadcast 10.0.0.255
        gateway 10.0.0.1

Nova computeノード
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet manual 
        up ip address add 0/0 dev $IFACE
        up ip link set $IFACE up
        down ip link set $IFACE down
auto eth1                                                                                                                                    
iface eth1 inet static                                                                                                                       
        address 10.0.1.73                                                                                                                    
        netmask 255.255.255.0                                                                                                                
        network 10.0.1.0 
auto br-ex
iface br-ex inet static
        address 10.0.0.73
        netmask 255.255.255.0
        network 10.0.0.0
        broadcast 10.0.0.255
        gateway 10.0.0.1


neutron agent-listを確認すると、Nova ComputeでもL3エージェントとMetadataエージェントが動いているのが確認できる。
root@juno1:~# neutron agent-list                                                                                                             
+--------------------------------------+--------------------+-------+-------+----------------+---------------------------+
| id                                   | agent_type         | host  | alive | admin_state_up | binary                    |
+--------------------------------------+--------------------+-------+-------+----------------+---------------------------+
| 30e8bef4-e34e-48f4-b88c-ff0f9af6c443 | Metadata agent     | juno3 | :-)   | True           | neutron-metadata-agent    |
| 7186a9af-44de-4edb-a0a8-dd94ac195e14 | Metadata agent     | juno2 | :-)   | True           | neutron-metadata-agent    |
| ae77c965-0bdc-4a48-8c55-2c30a5858929 | L3 agent           | juno2 | :-)   | True           | neutron-l3-agent          |
| cf370cb4-5c5c-4f62-8031-47d193eccaab | Open vSwitch agent | juno3 | :-)   | True           | neutron-openvswitch-agent |
| e2703d91-9d63-47eb-833a-b9f8f1921cd2 | Open vSwitch agent | juno2 | :-)   | True           | neutron-openvswitch-agent |
| e39cdd3c-3354-4361-8467-429d08746e49 | L3 agent           | juno3 | :-)   | True           | neutron-l3-agent          |
| eb56764c-d90e-4a32-8699-afc51a25a87b | DHCP agent         | juno2 | :-)   | True           | neutron-dhcp-agent        |
+--------------------------------------+--------------------+-------+-------+----------------+---------------------------+

また、テナントにneutron routerを作成し仮想マシンを作成すると、NetworkノードとNova Computeに同じNamespaceが作られているのが見える

Neutronサーバー
root@juno1:~# neutron router-list
+--------------------------------------+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| id                                   | name        | external_gateway_info                                                                                                                                                                  |
+--------------------------------------+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 78adafc5-d491-460b-8102-ace0e97e603b | demo-router | {"network_id": "b96a6e84-e558-4a5a-b5ca-2057f6c384db", "enable_snat": true, "external_fixed_ips": [{"subnet_id": "8025dae3-ca36-440f-9249-73d424266580", "ip_address": "10.0.0.200"}]} |
+--------------------------------------+-------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Networkノード
root@juno2:~# ip netns
qdhcp-02cba930-706e-49be-8a04-8fb115f2590f
snat-78adafc5-d491-460b-8102-ace0e97e603b
qrouter-78adafc5-d491-460b-8102-ace0e97e603b
qdhcp-8f99d500-2b11-4e13-b35f-e36f68f8c260
Nova Compute
root@juno3:~# ip netns
qrouter-78adafc5-d491-460b-8102-ace0e97e603b

floating-ipを割り当てると、Nova Computeにfip-hogehogeというNSができる。
Neutronサーバー
root@juno1:~# neutron floatingip-list 
+--------------------------------------+------------------+---------------------+--------------------------------------+
| id                                   | fixed_ip_address | floating_ip_address | port_id                              |
+--------------------------------------+------------------+---------------------+--------------------------------------+
| 7a41c505-db06-460f-b75f-4e9208b9b2a5 | 192.168.0.4      | 10.0.0.206          | 2237c4d4-f936-4475-b609-f0253bc0dc83 |
+--------------------------------------+------------------+---------------------+--------------------------------------+
Nova Compute
root@juno3:~# ip netns 
fip-b96a6e84-e558-4a5a-b5ca-2057f6c384db
qrouter-78adafc5-d491-460b-8102-ace0e97e603b

問題
Nova ComputeにNamespaceができるが、依然としてNetworkノードを使っている。
しかもFloating IPを設定しても全てSNATされてしまっている。fip-hogehogeのIPアドレスを確認したところ、Floating IPのIPアドレスとは違うIPアドレスが新たに作られており、そのアドレスがアサインされていた。
バグなのか、なにかコンフィグ間違えているのか不明・・・

0 件のコメント:

コメントを投稿