2014年11月21日金曜日

OpenStack Juno ML2 PluginでDVRが正常に動いた

以前のエントリーでDVRが動かないと書いたが、動いたので報告です。
原因はml2_conf.iniの [agent] セクションの設定を書いていなかったのが原因。
 というわけで、再度設定方法のまとめ。
 ※ソースまで読んで確認してないので、無駄な設定が入っているかも知れません。

OpenStackの通常のインストールが終わってから、DVRの設定を行う。
NeutronもNeutron Server、Network Node、Nova Computeへ適切にインストールを行う。
Nova ComputeでもL3エージェントが動くことになるので、Networkノード同様ex-brの設定とL3エージェントをインストールしておく。

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"のモードで動く。
 
コンフィグが必要なのは以下の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][agent]セクションに以下の2つを設定[ovs]
tunnel_type = vxlan
enable_vxlan = True
vni_ranges = 1:1000
enable_tunneling = true
l2_population = True
enable_distributed_routing = True
[agent]
l2_population = True
enable_distributed_routing = true

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

Networkノード,Nova computeのコンフィグ例
[ml2]
type_drivers = flat,vxlan
tenant_network_types = vxlan
mechanism_drivers = openvswitch,l2population
enable_distributed_routing = true
[ml2_type_flat]
[ml2_type_vlan]
[ml2_type_gre]
tunnel_id_ranges = 1:1000
[ml2_type_vxlan]
vni_ranges = 1:1000
vxlan_group = 239.1.1.1
[securitygroup]
firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
enable_security_group = True
[ovs]
local_ip = 10.0.1.72
tunnel_type = vxlan
enable_vxlan = True
vni_ranges = 1:1000
enable_tunneling = true
l2_population = True
enable_distributed_routing = True
tunnel_bridge = br-tun
ent_peer_patch_port = patch-tun
tun_peer_patch_port = patch-int
tenant_network_type = vxlan
[agent]
root_helper = sudo neutron-rootwrap /etc/neutron/rootwrap.conf
tunnel_types = vxlan
vxlan_udp_port = 4789
l2_population = True
enable_distributed_routing = true

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サーバにOpen vSwitch Agentの情報を確認すると、l2_populationとenable_distributed_routingがTrueになっているのが確認できる。
root@juno1:~# neutron agent-show cf370cb4-5c5c-4f62-8031-47d193eccaab
+---------------------+-------------------------------------------+
| Field               | Value                                     |
+---------------------+-------------------------------------------+
| admin_state_up      | True                                      |
| agent_type          | Open vSwitch agent                        |
| alive               | True                                      |
| binary              | neutron-openvswitch-agent                 |
| configurations      | {                                         |
|                     |      "arp_responder_enabled": false,      |
|                     |      "tunneling_ip": "10.0.1.73",         |
|                     |      "devices": 5,                        |
|                     |      "l2_population": true,               |
|                     |      "tunnel_types": [                    |
|                     |           "vxlan"                         |
|                     |      ],                                   |
|                     |      "enable_distributed_routing": true,  |
|                     |      "bridge_mappings": {}                |
|                     | }                                         |
| created_at          | 2014-11-18 18:29:55                       |
| description         |                                           |
| heartbeat_timestamp | 2014-11-19 19:49:06                       |
| host                | juno3                                     |
| id                  | cf370cb4-5c5c-4f62-8031-47d193eccaab      |
| started_at          | 2014-11-19 17:22:12                       |
| topic               | N/A                                       |
+---------------------+-------------------------------------------+

後は通常通り仮想マシンを作成すると、DVRの機能を使って通信できる。 Floating IPを設定するとNova ComputeでNATするため、Nova Computeのex-brは外部ネットワークに通信できるようにしておくこと。

2014年11月20日木曜日

Neutron ML2 Plugin DVRのFloating IP問題


Ubuntu1404上にOpenStack Junoをインストールし、Neutron DVRを動かししたが、Floating IPの動作が顕著におかしいのでメモ。

Neutronで作ったFloating IPのアドレスと、Floating IP用のNamespaceに割り当てられるIPアドレスが違う。

root@juno1:~# nova list
+--------------------------------------+------+--------+------------+-------------+----------------------------------+
| ID                                   | Name | Status | Task State | Power State | Networks                         |
+--------------------------------------+------+--------+------------+-------------+----------------------------------+
| 1a7fbf85-dd65-4549-b5d7-4f34d6034bbe | VM1  | ACTIVE | -          | Running     | demo-net=192.168.0.2             |
| d1994120-fad7-4c49-98e5-5c25809c3a1d | VM2  | ACTIVE | -          | Running     | demo-net=192.168.0.4, 10.0.0.206 |
| 33ec7049-f1b4-4369-b340-9b38b407dc52 | VM3  | ACTIVE | -          | Running     | demo-net2=192.168.1.3            |
+--------------------------------------+------+--------+------------+-------------+----------------------------------+
VM2のIPアドレスは192.168.0.4でFloaging IPは10.0.0.206が確認できる。
neutron floatingip-listの結果も問題なし
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のNamespaceをみると、IPアドレスがおかしい。10.0.0.208が割り当てられている。
root@juno3:~# ip netns 
fip-b96a6e84-e558-4a5a-b5ca-2057f6c384db
qrouter-78adafc5-d491-460b-8102-ace0e97e603b
root@juno3:~# ip netns exec fip-b96a6e84-e558-4a5a-b5ca-2057f6c384db ifconfig
fg-5ebf1570-6a Link encap:Ethernet  HWaddr fa:16:3e:db:b5:3b  
          inet addr:10.0.0.208  Bcast:10.0.0.255  Mask:255.255.255.0
          inet6 addr: fe80::f816:3eff:fedb:b53b/64 Scope:Link
          UP BROADCAST RUNNING  MTU:1500  Metric:1
          RX packets:8434 errors:0 dropped:8 overruns:0 frame:0
          TX packets:1867 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:1146254 (1.1 MB)  TX bytes:174634 (174.6 KB)

fpr-78adafc5-d Link encap:Ethernet  HWaddr 56:94:88:0a:24:88  
          inet addr:169.254.30.21  Bcast:0.0.0.0  Mask:255.255.255.254
          inet6 addr: fe80::5494:88ff:fe0a:2488/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1840 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1812 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:173484 (173.4 KB)  TX bytes:170740 (170.7 KB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

neutron port-listみると、確かにIPアドレスが割り当てられている。

root@juno1:~# neutron port-list
+--------------------------------------+------+-------------------+------------------------------------------------------------------------------------+
| id                                   | name | mac_address       | fixed_ips                                                                          |
+--------------------------------------+------+-------------------+------------------------------------------------------------------------------------+
| 0751f133-464a-41e7-aa0b-d5e79c47aaf4 |      | fa:16:3e:d3:77:13 | {"subnet_id": "7b95c656-79bd-4b5d-9d28-8a59978ddfbc", "ip_address": "192.168.0.3"} |
| 16ab7536-1198-47b8-8d4a-d7a5f2467885 |      | fa:16:3e:ae:1e:9c | {"subnet_id": "846978d0-2de9-47db-a477-5eacf5432d07", "ip_address": "192.168.1.4"} |
| 1718fcf2-e8f3-49e2-8085-f037a774116e |      | fa:16:3e:76:8f:3e | {"subnet_id": "846978d0-2de9-47db-a477-5eacf5432d07", "ip_address": "192.168.1.5"} |
| 2197f8fd-ae65-41f0-b824-bc5d12112bdc |      | fa:16:3e:33:02:c7 | {"subnet_id": "7b95c656-79bd-4b5d-9d28-8a59978ddfbc", "ip_address": "192.168.0.2"} |
| 2237c4d4-f936-4475-b609-f0253bc0dc83 |      | fa:16:3e:41:92:55 | {"subnet_id": "7b95c656-79bd-4b5d-9d28-8a59978ddfbc", "ip_address": "192.168.0.4"} |
| 49029318-1b55-426c-87a1-3982af9b0ef3 |      | fa:16:3e:1e:91:22 | {"subnet_id": "8025dae3-ca36-440f-9249-73d424266580", "ip_address": "10.0.0.207"}  |
| 4946e58f-f97f-4864-9981-271a2e1de360 |      | fa:16:3e:09:ba:16 | {"subnet_id": "8025dae3-ca36-440f-9249-73d424266580", "ip_address": "10.0.0.206"}  |
| 4fe091eb-4ce4-451b-b6a1-b6e459f3ebf7 |      | fa:16:3e:da:41:79 | {"subnet_id": "8025dae3-ca36-440f-9249-73d424266580", "ip_address": "10.0.0.203"}  |
| 5ebf1570-6a93-424d-a4f7-3e4fa5412800 |      | fa:16:3e:db:b5:3b | {"subnet_id": "8025dae3-ca36-440f-9249-73d424266580", "ip_address": "10.0.0.208"}  |
| 87c31452-5563-49d5-bbd5-deb1ccbcf181 |      | fa:16:3e:80:eb:a2 | {"subnet_id": "846978d0-2de9-47db-a477-5eacf5432d07", "ip_address": "192.168.1.1"} |
| b86050f1-0cd8-46a3-a7d5-dcca5ccbc131 |      | fa:16:3e:df:ac:65 | {"subnet_id": "7b95c656-79bd-4b5d-9d28-8a59978ddfbc", "ip_address": "192.168.0.6"} |
| f785512e-c1fb-430d-8e49-440e7ce9859c |      | fa:16:3e:0a:cd:ca | {"subnet_id": "7b95c656-79bd-4b5d-9d28-8a59978ddfbc", "ip_address": "192.168.0.1"} |
| fafb3d54-7ad3-4ce2-b7bd-c37d59fe39c9 |      | fa:16:3e:20:f3:c6 | {"subnet_id": "846978d0-2de9-47db-a477-5eacf5432d07", "ip_address": "192.168.1.3"} |
+--------------------------------------+------+-------------------+------------------------------------------------------------------------------------+

バグみたいな感じに見える・・・

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アドレスが新たに作られており、そのアドレスがアサインされていた。
バグなのか、なにかコンフィグ間違えているのか不明・・・

2014年11月13日木曜日

既存OpenStackとOpenContrailの接続

既存のOpenStackとOpenContrailをOpenContrailのfabスクリプトを使用して構築する。
今回は冗長構成は組まず、OpenStack,OpenContrail共にシングル構成

環境
ベースOS Ubuntu14.04.1
サーバ1 : Keystone, Nova Server, Cinder, Glance
サーバ2 : コンピュートノード
サーバ3 : OpenContrail Neutron

準備
サーバ1にNeutron以外のOpenStackに必要なノードを構築する。
サーバ2にnova-computeだけインストールする。
構築方法は割愛。Neutron以外正常稼動することを確認しておく。NeutronはOpenContrailのFabでインストールするので、インストールする必要はないです。
(日本仮想化技術株式会社のOpenStack構築手順書はすごく参考になります。)

ここからサーバ3にOpenContrailをインストールしますが、Novaのvifドライバーとプラグインのインストールが必要なので、全てのサーバにOpenContrialのリポジトリの登録と、必要なパッケージのダウンロードを行う。

リポジトリの登録
(HOSTS="SV1 SV2 SV3"; for H in ${HOSTS}; do
ssh root@$H <<EOF
apt-get install -y curl;
curl -L http://www.opencontrail.org/ubuntu-repo/repo_key| sudo apt-key add -;
curl -L http://www.opencontrail.org/ubuntu-repo/add-apt-and-update| sudo OPENSTACK=icehouse CONTRAIL=r120 DISTRO=ubuntu1404 sh;
EOF
done;)
プロビジョニングツールをインストール
curl –L http://www.opencontrail.org/ubuntu-repo/install-tools-key-and-prep | sudo HOSTS="SV1 SV2 SV3" sh
fabricのtestbed.pyを編集
セットアップするサーバはSV1です
cd /opt/contrail/utils/
vi fabfile/testbeds/testbed.py
testbed.pyを編集します。
from fabric.api import env
#Management ip addresses of hosts in the cluster
host1 = 'root@SV1'
host2 = 'root@SV2'
host3 = 'root@SV3'
#External routers if any
#for eg.
#ext_routers = [('mx1', '10.204.216.253')]
ext_routers = []
#Autonomous system number
router_asn = 64512
#Host from which the fab commands are triggered to install and provision
host_build = 'root@SV1'
#Role definition of the hosts.
env.roledefs = {
    'all': [host1, host2, host3],
    'cfgm': [host1],
    'openstack': [host2],
    'control': [host1],
    'compute': [host3],
    'collector': [host1],
    'webui': [host2],
    'database': [host1],
    'build': [host_build],
    'storage-master': [host1],
    'storage-compute': [host3],
}
env.hostnames = {
    'all': ['a0s1', 'a0s2', 'a0s3']
}
#Openstack admin password
env.openstack_admin_password = 'secret123'
env.password = 'secret123'
#Passwords of each host
env.passwords = {
    host1: 'secret',
    host2: 'secret',
    host3: 'secret',
    host_build: 'juniper123',
}
#For reimage purpose
env.ostypes = {
    host1: 'ubuntu',
    host2: 'ubuntu',
    host3: 'ubuntu',
}
testbed.pyを作成したら依存ファイルをインストールしてスクリプトを実行
SV1にnodejsをインストールする
apt-get install nodejs=0.8.15-1contrail1
SV1の/opt/contrail/utilsディレクトリで以下を実行
fab install_without_openstack:manage_nova_compute='no'
fab setup_without_openstack:manage_nova_compute='no'
※コンピュートノードがリブート

コンピュートノードの設定を変更
SV2で以下のコマンドを実行
sudo echo 'cgroup_device_acl = [' >> /etc/libvirt/qemu.conf
sudo echo '    "/dev/null", "/dev/full", "/dev/zero",' >> /etc/libvirt/qemu.conf
sudo echo '    "/dev/random", "/dev/urandom",' >> /etc/libvirt/qemu.conf
sudo echo '    "/dev/ptmx", "/dev/kvm", "/dev/kqemu",' >> /etc/libvirt/qemu.conf
sudo echo '    "/dev/rtc", "/dev/hpet","/dev/net/tun",' >> /etc/libvirt/qemu.conf
sudo echo ']' >> /etc/libvirt/qemu.conf
service libvirt-bin restart
openstack-config --set /etc/nova/nova.conf DEFAULT neutron_admin_auth_url http://:5000/v2.0
service nova-compute restart
Novaサーバーの設定を確認 
[DEFAULT]
 neutron_url = http://SV3:9696
SV3の部分がサーバ3のIPアドレスになっていること

DashboardをOpenContrailに対応させるため、SV1で以下のファイルをダウンロード
apt-get install contrail-openstack-dashboard
Dashboardの設定変更
SV1で以下のコマンドを実行
sudo echo "HORIZON_CONFIG['customization_module'] = 'contrail_openstack_dashboard.overrides'" >> /etc/openstack-dashboard/local_settings.py
service apatch2 restart
endpoint-serviceの確認
fabスクリプトでプロビジョニングすると、Neutronのregionが"RegionOne"になっている。このためkeystone endpoint-list でNeutronのregionが他のregionと同じか確認する。
regionが異なっているとHorizonでNetwork関係のタブをクリックするとエラーになるため、一度keystone endpoint-deleteで削除して作りなおす。
OpenContrail1.20 with Ubuntu1404はバグがあるため、Networkingのタブをクリックするとエラーになります。

※11/16highlight.jsを導入しました。

2014年11月11日火曜日

OpenContrailのSimple Gatewayの作り方

※2015/10/07 改訂版を作成しました。 GitのWikiにMXなどのハードウェアゲートウェイを使わないで、仮想ネットワークと物理ネットワークを接続するSimple Gatewayが紹介されているが、ドキュメントバグがあったので、こちらに掲載。
(オリジナルGithub

Simple GatewayはコンピュートノードのvRouterをゲートウェイとして利用し、コンピュートノードのルーティングテーブルを使用するため、コンピュートノードコマンドを実行する
まず、以下のディレクトリをexport

export PYTHONPATH=/usr/lib/python2.7/dist-packages/contrail_vrouter_api/gen_py/instance_service/
export PYTHONPATH=/usr/lib/python2.7/dist-packages/nova_contrail_vif/gen_py/instance_service/
次に、provision_vgw_interface.pyでゲートウェイを作成する
python /opt/contrail/utils/provision_vgw_interface.py --oper create --interface <ゲートウェイの名前> --subnets <仮想ネットワークのプレフィックス> --route <物理ネットワークのプレフィックス> --vrf <仮想ネットワーク名>

ここで指定する仮想ネットワークの情報はContrailで持っている仮想ネットワークの情報とあわせる。
例えば、Floating IPの仮想ネットワーク名を<public >とし、IPアドレスを<203.0.113.0/24>とする。インターネットへの接続なので、物理ネットワークのプレフィックスを<0.0.0.0/0>とすると、

python /opt/contrail/utils/provision_vgw_interface.py --oper create --interface vgw1 --subnets 203.0.113.0/24 --route 0.0.0.0/0 --vrf default-domain:public:public:public
となる。

--vrfの項目を default-domain:domain名:仮想NW名:仮想NW名 と仮想NW名を重ねるのがミソ。

vRouterの情報を確認すると、prefix 0.0.0.0/0 Next hop type interface vgw1というのが追加されている。



この設定をすると、コンピュートノードはvhost経由で外部ネットワークと通信を行う。
インターネットのゲートウェイルータやゲートウェイサーバには仮想ネットワークに通信できるようにルーティングの追加を忘れないように。

以下はインターネットへ接続しているサーバのルーティングテーブル。(コンピュートノードのNextHopサーバ)
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.0.0.0        0.0.0.0         255.255.255.0   U     0      0        0 eth1
203.0.113.0     10.0.0.36       255.255.255.0   UG    0      0        0 eth1
172.27.112.0    0.0.0.0         255.255.252.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1003   0        0 eth1
0.0.0.0         172.27.112.1    0.0.0.0         UG    0      0        0 eth0
仮想ネットワークの203.0.113.0/24 Gateway 10.0.0.36(コンピュートノードのVhostのIPアドレス)が追加されているのが確認できる。

バグ?
Simple Gatewayを使った場合、対象の仮想ネットワークをNeutron routerの外部ネットワークに指定した場合、SNATが正常に動作しない。