OpenStack の仮想ネットワーク ~Neutron の今~ Akihiro Motoki (@ritchey98) NEC / 日本 OpenStack ユーザー会 Oct 11 st , 2013
OpenStack の仮想ネットワーク~Neutron の今~
Akihiro Motoki (@ritchey98)NEC / 日本 OpenStack ユーザー会
Oct 11st , 2013
自己紹介
• 元木顕弘 (@ritchey98)– NEC 情報・ナレッジ研究所– IPルータ、広域Ethernet装置、迷惑メールフィルタなどの開発をやっていました。
– ここ数年は、ネットワーク仮想化、OpenStack, OpenFlow 周りで活動しています。
• OpenStack Developer– Neutron and Horizon Core Developer– I18N team
• Linux JM (日本語マニュアル) Project Maintainer
OpenStack Networking (Neutron)
• Network-as-a-Service (NaaS) を提供する
–テナントが自由なネットワーク操作を提供
• 複数のプライベートなネットワークの作成
• IPアドレスの制御
– L2/L3 に限らず、さまざまなネットワークサービスの提供
• Neutron API– API は論理操作のみを定義。物理操作を分離。
–物理操作は Neutron Plugin が行う
OpenStack の仮想ネットワークモデル
• ネットワークの自由な作成• IP overlapping Tenant Networks
TenantA-VM110.0.0.2
TenantA-VM110.0.0.2
TenantA-VM3TenantA-VM39.0.0.2
TenantA-VM210.0.0.3
TenantA-VM210.0.0.3
External
88.0.0.0/18
External Net
88.0.0.0/18
Tenant-A Net110.0.0.0/24
Tenant-A Net29.0.0.0/24
L2 virtual networkvirtual port
virtual servervirtual interface (VIF)
virtual subnet
SNAT for external trafficFloating IP
• 複数 NIC を持った VM の)作成
• ルータ経由で Subnet 間通信• Floating IP での外部からの接続 (Elastic IP@AWS)
Network API の例• API モデルは基本的に REST • 一般ユーザー向けの API では、論理情報のみが見える• 管理者権限であれば、物理情報を指定した操作も一部では定義。
GET http://localhost:9696/v2.0/networks/20b49737-c718-4f10-8edc-7fe9f8ee7cfd
{"network": {
"admin_state_up": true,"id": "20b49737-c718-4f10-8edc-7fe9f8ee7cfd","name": "net1","router:external": false,"shared": false,"status": "ACTIVE","subnets": [
"644f729f-1c86-48b3-91a2-761e29398e81"],"tenant_id": "be11ce3cabc74ee68d4f22253ffbb5e8"
}}
GET http://localhost:9696/v2.0/networks/20b49737-c718-4f10-8edc-7fe9f8ee7cfd
{"network": {
"admin_state_up": true,"id": "20b49737-c718-4f10-8edc-7fe9f8ee7cfd","name": "net1","router:external": false,"shared": false,"status": "ACTIVE","subnets": [
"644f729f-1c86-48b3-91a2-761e29398e81"],"tenant_id": "be11ce3cabc74ee68d4f22253ffbb5e8","provider:network_type": "vlan","provider:physical_network": "physnet_1","provider:segmentation_id": 201
}}一般ユーザー 管理者ユーザー
Network Service Insertion
Network 1 Network 2
External Network
VPN Connection
Service Insertion
Nova
Neutron の基本構造• API に対応して、物理操作を行う Plugin が存在
– Plugin を切り替えることで、様々なネットワーク技術を利用可能– 複数のPlugin (Core + Service *N) が併存。一つのPluginで複数のAPIも対応可
• OpenStack の一部だが、Neutron 単体でも利用可能– Neutron API を使うことで、特定のベンダーAPI に Lock-In されにくくなるかも
Neutron Compute Node
VM VM
vSwitch
HW Switch
L2/L3 PluginFWaaSPlugin
LBaaSPlugin
Agent
L2 APIL3 APIFWaaSAPI
LBaaSAPI
NetworkController
OpenFlow Controller など
Neutron API
L3Agent
HAProxyAgent
Compute API
XXXDriver
VM
VMvSW
ルータの振りをしてnexthopのARPに応答
仮想ルータの実現方法• Network Namespace (l3-agent)
– Linux Kernel の名前空間機能を利用
• Distributed Router– 仮想スイッチ、OpenFlow スイッチをコントローラで制御して実現
• Router as Service VM– 仮想ルータ単位に VM を用意する。通常の VM と同じ。
• VRF on normal router– いわゆるハードウェアルータで、複数の論理ルーティングテーブルがあるものを利用
VM
VM vSW
net1 net2R VMVMVM
現状の Neutron では下線付きのものが存在
分散ルータの例
Controller
ルータの振りをしてnexthopのARPに応答
同じサブネットならそのまま転送
L3-agent での仮想ルータ• Linux Kernel の機能を組み合わせて実現
– Network Namespace + iptables• Network Namespace (netns)
– ネットワークのプロトコル・スタックを一つの OS 上に複数持つ仕組み。IPアドレスや NW インタフェース等が分離した空間を複数構成可能。
– LXC などのコンテナ技術で発展
netns for router1 netns for router2
qg-xxx qr-yz1 qr-yz2 qr-zz1 qr-zz2
qg-xxx qr-yz1 qr-yz2 qr-zz1 qr-zz2
veth pair
Routing + iptables Routing + iptables
eth1 eth2
Open vSwitch
おまけ
l3-agent netns example (1/3)ubuntu@ostack02:~$ ip netnsqdhcp-07b6df1f-bb88-4cc5-8903-45c543143f9fqdhcp-373ed983-b2e9-4c6b-90f2-92c347302675qrouter-6ce6df1a-0eb8-4bf8-8ad6-fe6855d5e648qrouter-b920913b-22ca-48ad-843b-e8ab78ae22a7qdhcp-20b49737-c718-4f10-8edc-7fe9f8ee7cfd
ubuntu@ostack02:~$ neutron router-list+--------------------------------------+---------+--------------------------------------------------------+| id | name | external_gateway_info |+--------------------------------------+---------+--------------------------------------------------------+| 6ce6df1a-0eb8-4bf8-8ad6-fe6855d5e648 | router2 | null || b920913b-22ca-48ad-843b-e8ab78ae22a7 | router1 | {"network_id": "e4ad0d48-d0ee-42f8-889b-72283fdd607f", || | | "enable_snat": true} |+--------------------------------------+---------+--------------------------------------------------------+
l3-agent netns example (2/3)(router1)ubuntu@ostack02:~$ sudo ip netns exec qrouter-b920913b-22ca-48ad-843b-e8ab78ae22a7 ip link1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:002: qr-656aebdc-61: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
link/ether fa:16:3e:a2:1b:62 brd ff:ff:ff:ff:ff:ff3: qg-215b9b04-9e: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
link/ether fa:16:3e:f3:c9:4c brd ff:ff:ff:ff:ff:ff4: qr-8357d717-fa: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
link/ether fa:16:3e:c9:c9:41 brd ff:ff:ff:ff:ff:ffubuntu@ostack02:~$ sudo ip netns exec qrouter-b920913b-22ca-48ad-843b-e8ab78ae22a7 netstat -nrKernel IP routing tableDestination Gateway Genmask Flags MSS Window irtt Iface0.0.0.0 172.24.4.225 0.0.0.0 UG 0 0 0 qg-215b9b04-9e10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 qr-656aebdc-6110.2.2.0 0.0.0.0 255.255.255.0 U 0 0 0 qr-8357d717-fa172.24.4.224 0.0.0.0 255.255.255.240 U 0 0 0 qg-215b9b04-9e
l3-agent netns example (3/3)(router2)ubuntu@ostack02:~$ sudo ip netns exec qrouter-6ce6df1a-0eb8-4bf8-8ad6-fe6855d5e648 ip link1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:002: qr-04c3c871-55: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
link/ether fa:16:3e:ef:af:b6 brd ff:ff:ff:ff:ff:ff4: qr-1b1091ed-41: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
link/ether fa:16:3e:da:9e:50 brd ff:ff:ff:ff:ff:ffubuntu@ostack02:~$ sudo ip netns exec qrouter-6ce6df1a-0eb8-4bf8-8ad6-fe6855d5e648 ip route10.2.2.0/24 dev qr-1b1091ed-41 proto kernel scope link src 10.2.2.210.3.3.0/24 dev qr-04c3c871-55 proto kernel scope link src 10.3.3.1