API(HTTP)
2) インタフェースの作成 3) インタフェースの設定
- インタフェースの検知
- ポート情報の取得
- インタフェースの設定
ホストの実行環境設定
ovs_neutron_plugin.ini 設定例
(vlanの範囲として、100~199を使用するとした例)
(eth2というのは一例)
tenant_network_type = vlan
network_vlan_ranges = default:100:199 bridge_mappings = default:br-eth2
vlan 100~199を通すようにしておく
compute node eth2
ovs_neutron_agent br-eth2
br-int
ホスト(compute node)起動時に行うこと• agent(ovs_neutron_agent)
の起動•
内部折り返し用(br-int)と外部通信用(br-eth2)の2つのスイッチの作成と設定補足:
Openvswitchプラグインではネットワーク分離の手段と
して、gre
、vxlan
も使用可能。構成定義やスイッチの構成 は、本例と異なる。テナント用ネットワーク作成
47
$ neutron net-create net1 Created a new network:
+---+---+
| Field | Value | +---+---+
| admin_state_up | True |
| id | fa2ba33b-b50f-47c2-8c41-ddca7a481dc6 |
| name | net1 |
| provider:network_type | vlan |
| provider:physical_network | default |
| provider:segmentation_id | 100 |
| router:external | False |
| shared | False |
| status | ACTIVE |
| subnets | |
| tenant_id | 4d447d1234fb47feaebf657ea876a845 | +---+---+
プラグイン固有属性
本例では、ネットワーク
net1
は、vlan id 100
でノード間の通信を行う。(vlan idは、ネットワーク作成時にパラメータで指定することも可能)
Neutron API (create network) の処理の中で、プラグインが
ネットワーク ID と vlan-id の対応をつけ、 DB に記録。
ポートの作成
(Neutron から見た ) 使用者が事前に作成を行う。
VM の NIC を表現するリソースとして、ポートを使用する。
$ neutron port-create net1 Created a new port:
+---+---+
| Field | Value | +---+---+
| admin_state_up | True |
| allowed_address_pairs | |
| binding:capabilities | {"port_filter": false} |
| binding:host_id | |
| binding:vif_type | unbound |
| device_id | |
| device_owner | |
| fixed_ips | {"subnet_id": "0b5be9b5-571b-4d26-bb2a-d25d661909dc", "ip_address": "20.0.0.11"} |
| id | 8c77dea8-0d25-4dde-9165-9d2595cd9375 |
| mac_address | fa:16:3e:b5:54:65 |
| name | |
| network_id | fa2ba33b-b50f-47c2-8c41-ddca7a481dc6 |
| security_groups | 855c2304-a4f0-4f07-a60c-e8e6ae8e5674 |
| status | DOWN |
| tenant_id | 4d447d1234fb47feaebf657ea876a845 | +---+---+
ip
アドレス、mac
アドレスは、この段階で確定。インタフェースの作成
49
VM
を起動するホストが決まると、nova-compute
は、VM
の起動に 先立ち、ホスト上にポートに対応するインタフェースを作成する。nova-compute
に組み込まれたInterface
ドライバが以下を実施。br-int
VM
tap8c77dea8-0d
• VM
の仮想NICに対応するtapデバイスを作成し、br-intに接続する。デバイス名は、”tap”+ポートIDの先頭11桁
• ovs
ポートのInterface
テーブルに必要な情報を設定しておく。- external-ids:iface-id
にポートID
- external-ids:attached-mac にmacアドレス
ポイント:
後でagent等がインタフェースとポートの対応を特定できるようにしておく。
$ ifconfig ...
tap8c77dea8-0d Link encap:Ethernet HWaddr 1a:fe:53:16:54:45
inet6 addr: fe80::18fe:53ff:fe16:5445/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:373 errors:0 dropped:0 overruns:0 frame:0 TX packets:179 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:500
RX bytes:68692 (68.6 KB) TX bytes:35044 (35.0 KB)
$ sudo ovs-vsctl list-ports br-int int-br-eht2
tap8c77dea8-0d
$ sudo ovs-vsctl list Interface
_uuid : d13469a0-a5f6-4b36-bed6-709c22e82e1b admin_state : up
...
external_ids : {attached-mac="fa:16:3e:b5:54:65",
iface-id="8c77dea8-0d25-4dde-9165-9d2595cd9375", iface-status=active,
vm-uuid="a66595e0-b318-49ae-98d5-564b7b42bfbf"}
ingress_policing_burst: 0 ingress_policing_rate: 0 lacp_current : []
link_resets : 1
link_speed : 10000000 link_state : up
mac : []
mtu : 1500
name : "tap8c77dea8-0d"
ofport : 11 ...
Interfaceの作成、OVSへの接続、
OVSのInterfaceテーブルへの情報設
定は、Nova
のInterface
ドライバが実施。インタフェースの検知
51
インタフェースの作成を検知する手段を用意している。
ovs_neutron_agent では:
• br-int を定期的に監視し、 ovs ポートの作成を認識
他の検知方法としては、
• VM からの最初の送出パケットで認識
• openvswitch の ovs ポート作成を認識
などが考えられる。
ポート情報の取得
インタフェースに対応するポートの情報を取得する。
ovs_neutron_agent では:
• RPC を使用し、 neutron-server ( 内 openvswitch プラグイン ) から取得。
デバイス名をパラメータとし、ポートおよびネットワーク情報を 返す RPC が用意されている。 ( ポート ID の先頭 11 桁で識別 )
ポート ID として、 ovs ポートに設定された情報を使用することも可能。
インタフェースの設定
53
実際に通信できるための設定を行う。
ovs_neutron_agent では:
• ovs ポートへの tag の設定
これを行うまで、 VM の通信はできない。
• ノード間通信に必要な設定
ネットワークに割り当てられた vlan タグはノード間通信時のみ 付加される。 ( 細かい設定内容は割愛 )
• その他、セキュリティグループの設定なども agent で行っている。
補足:
ポートの更新・削除については、
neutron-server
からovs_neutron_agent
への通知(非同期RPC
)を契機に 必要な処理を行っている。参考: Havana の ML2 プラグイン
Open vSwitchプラグインとLinuxBridgeプラグインが統合された、
ML2
プラグインというものができた(devstack
のデフォルトもML2
になった)
。 ML2
とはタイプドライバ、メカニズムドライバの
2
つの階層からなる。•
タイプドライバ物理ネットワークの分離タイプに応じて処理を実行。
タイプ: vlan、gre、vxlan、、、
•
メカニズムドライバ物理インタフェースの種別に応じて処理を実行。
Ex. openvswitch
、linuxbridge
、、、
新規のコアプラグインをサポートしたい場合、個別のプラグインを 作成する代わりに、ML2
のメカニズムドライバという形で実装する 選択肢ができた。
これまでのスライドで説明した内容は、ML2
になっても変わらない。ML2
でOpen vSwitch
メカニズムドライバを使用したときと同じ動き(Agent
側は変わらない)
。L3 拡張機能の実装
55
L3 拡張機能の実装
neutron-l3-agent
プロセスが処理を行う。
ルータの実体は、Linux上の独立したネットワーク名前空間で定義され たインタフェース、ルーティングテーブル、iptables
。 neutron-server
からの通知(
リソース作成・更新・削除)
を契機に処理を 行う。通知を受けたら、neutron-server
からリソースの情報を取得し、リ ソースの現状値に物理的実装を合わせる。•
ルータ作成時ルータ用のネットワーク名前空間を作成。
•
外部ネットワークポート、内部ネットワークポート接続時 ポートに対応するインタフェース作成、設定(
l3_agent
に組み込まれたインタフェースドライバが作成し、
ovs_neutron_agent
が検知、設定を実施。)•
フローティングIP
が固定IP
に関係付けられたときiptables(NAT) の設定を行う。
57
br-eth2 br-int
ルーティングテーブル
iptables
ovs_neutron_agent
routerB routerA
作成、設定、削除
VM間通信用
外部ネットワークbr-ex
ルーティングテーブル
iptables
neutron-l3-agent
interfaceドライバ
neutron-server RPC
通信できるまでの仕掛けは、 L2 のときと同様。
以下の読み替えを行えばよい。
compute node nova-compute VM
VM のポート、インタフェース ovs_neutron_agent
network node neutron-l3-agent ルータ用 namespace
ルータのポート、インタフェース
同左
59
$ ip netns list
qdhcp-c6943641-2937-4e68-b010-53e14002d954 qrouter-5e37b0c6-9f85-40cd-9d06-fb6f814448e6
$ sudo ip netns exec qrouter-5e37b0c6-9f85-40cd-9d06-fb6f814448e6 ifconfig lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0 ...
qg-f1e3b587-81 Link encap:Ethernet HWaddr fa:16:3e:47:f1:9b
inet addr:192.168.0.2 Bcast:192.168.0.255 Mask:255.255.255.0 ...
qr-e84c655e-8a Link encap:Ethernet HWaddr fa:16:3e:1f:7e:7a inet addr:10.0.0.1 Bcast:10.0.0.255 Mask:255.255.255.0 ...
qr-f03226bf-a4 Link encap:Ethernet HWaddr fa:16:3e:61:4b:81 inet addr:10.0.1.1 Bcast:10.0.1.255 Mask:255.255.255.0 ...
$ sudo ip netns exec qrouter-5e37b0c6-9f85-40cd-9d06-fb6f814448e6 route -n Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 qg-f1e3b587-81 10.0.0.0 0.0.0.0 255.255.255.0 U 0 0 0 qr-e84c655e-8a 10.0.1.0 0.0.0.0 255.255.255.0 U 0 0 0 qr-f03226bf-a4 192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 qg-f1e3b587-81
$ sudo ip netns exec qrouter-5e37b0c6-9f85-40cd-9d06-fb6f814448e6 iptables -L -t nat ...
DNAT all -- anywhere 192.168.0.3 to:10.0.0.3 ...
SNAT all -- 10.0.0.0/24 anywhere to:192.168.0.2 SNAT all -- 10.0.1.0/24 anywhere to:192.168.0.2 ...
名前空間
interface
net-ext net1
net2
ルーティング テーブル