Contenu connexe Similaire à ML2/OVN アーキテクチャ概観 (20) ML2/OVN アーキテクチャ概観3. 今日話すこと
● ターゲット
○ ML2/OVN の導入を検討している人
● 今日話すこと
○ OVN とは
○ ML2/OVS と ML2/OVN の主な違い
○ ML2/OVN のコントロールプレーンのアーキテクチャの概観
○ ML2/OVN のデータプレーンのアーキテクチャの概観
● 今日話さないこと
○ ML2/OVN の詳細な動作、コードの実装、トラブルシューティング方法
○ OVN への移行の詳細
○ NFV・SRIOV・DPDK
3
5. SDN と Neutron + ML2/OVS にまつわるテクノロジー
● SDN
○ Software Defined Networking
○ ネットワーク構成をソフトウェアで定義する
● オーバーレイネットワーク
○ 物理的なネットワーク(アンダーレイネットワーク)の上に、
論理的なネットワーク(オーバーレイネットワーク)を構築する
● OpenFlow
○ SDN を実現するテクノロジーのひとつ
○ パケットをどのように転送するかをフローと呼ばれるルールの
集まりで定義する
○ OpenFlow コントローラが各スイッチに対し動的にフローを
設定する
● Open vSwitch
○ OpenFlow をサポートする仮想スイッチを提供するソフトウェア
Neutron + ML2/OVS はこれらの技術を活用している
5
Open vSwitch による
オーバーレイネットワークのイメージ図
OpenFlow
コントローラ
Application 5
ノード
Open
vSwitch
ノード
Open
vSwitch
ノード
Open
vSwitch
ルータ
スイッチ
インスタンス
インスタンス
ルータ
スイッチ
インスタンス
6. ● OpenFlow コントローラを開発する必要がある
● OpenFlow のフローのひとつひとつは原始的
○ フローの一例
i. ポート N から届いたパケットのうち、宛先 MAC アドレスが
XX:XX:XX:XX:XX:XX に合致するパケットは iii. へ進む
ii. 合致しなかったパケットはドロップする
iii. TTL を減らす
iv. TTL が 0 のパケットはドロップする
v. 宛先 IP アドレスが Y.Y.Y.Y のパケットは、送信元・宛先 MAC アド
レスを書き換えた後ポート M に出力する
● OpenFlow コントローラの開発は大変
○ 複数のノードを跨ぐ論理スイッチを実装するには?
○ DHCP を提供するには?
● 複数のプロジェクトでOpenFlow コントローラの再発明が行われ
た
○ OpenStack : Neutron ML2/OVS plugin
○ Kubernetes : Open vSwitch ベースの CNI plugin
○ etc.
Open vSwitch の問題点
6
6
ルータ
スイッチ
インスタンス
インスタンス
ルータ
スイッチ
インスタンス
6
OpenFlow
コントローラ
ノード
Open
vSwitch
ノード
Open
vSwitch
ノード
Open
vSwitch
Open vSwitch による
オーバーレイネットワークのイメージ図
ここを開発する Application
7. Application
OVN のモチベーション
オーバーレイネットワークを実現するより高レベルな
コンポーネントを作って、複数のプロダクトで使い回せるよ
うにしよう
-> OVN 爆誕
● より高度な単位で論理ネットワークを定義できるよう
に
○ 例)論理スイッチを作成する
○ 例)論理ルータ A に外部 IP アドレス X と内部 IP アドレス Y
の組み合わせの SNAT を設定する
● OVN を使用するプロジェクト
○ OpenStack : Neutron ML2/OVN plugin
○ Kubernetes : CNI ovn-kubernetes plugin
○ etc.
https://networkheresy.com/ovn-bringing-native-virtual-networking-to-ovs/
ルータ
スイッチ
インスタンス
インスタンス
ルータ
スイッチ
インスタンス
7
7
7
ノード
Open
vSwitch
ノード
Open
vSwitch
ノード
Open
vSwitch
ここだけ開発する
OpenFlow
コントローラ
(OVN)
OVN による
オーバーレイネットワークのイメージ図
9. OpenStack と OVN の歴史
● Newton
○ ML2/OVN 発足。networking-ovn リポジトリが作成される [1]
● Stein
○ TripleO のデフォルトが ML2/OVN に [2]
● Ussuri
○ networking-ovn リポジトリが Neutron にマージされる [3]
○ Charmed OpenStack の推奨が ML2/OVN に [4]
● Xena
○ DevStack のデフォルトが ML2/OVN に [5]
ML2/OVN への移行が進んでいる
[1]https://github.com/openstack/networking-ovn/tree/stable/newton
[2]https://github.com/openstack/tripleo-heat-templates/commit/6053eb196488a086449f5f2e4fe807825a16bd51
[3]https://github.com/openstack/neutron/tree/stable/ussuri/neutron/plugins/ml2/drivers/ovn
[4]https://docs.openstack.org/charm-guide/latest/getting-started/index.html
[5]https://github.com/openstack/devstack/commit/e38a39ad404637ca1649cea072883aa0a4592c4f
9
10. ML2/OVS と ML2/OVN の違い
● 中間レイヤの追加
○ Neutron
○ Northbound ⇐ New
○ Southbound ⇐ New
○ Open vSwitch
● AMQP ではなく OVSDB プロトコルで通信
● デフォルトでは VXLAN ではなく GENEVE で
カプセル化
● ML2/OVS では以下のような既存の Linux の
機能・ソフトウェアが多く活用されていた
Network Namespace、Linux Bridge、
iptables、dnsmasq、keepalived
ML2/OVN ではこれらの機能の多くが br-int
内の OpenFlow に集約
10
https://docs.openstack.org/networking-ovn/latest/faq/index.html より引用
11. ML2/OVN と DVR(Distributed Virtual Router)
DVR:仮想ルータの実装を各コンピュートノードに分散する機能
11
ML2/OVS ML2/OVN
enable_distributed
_routing = Flase
enable_distributed
_routing = True
enable_distributed
_floating_ip =
False
enable_distributed
_floating_ip = True
East-West DVR 無効 DVR 有効 DVR 有効 DVR 有効
North-South
non-FIP
DVR 無効 DVR 無効 DVR 無効 DVR 無効
North-South
FIP
DVR 無効 DVR 有効 DVR 無効 DVR 有効
14. ● パラレルマイグレーション
○ ML2/OVN 環境を新規に構築してワークロードを移行する
● インプレースマイグレーション
○ TripleO 環境
https://docs.openstack.org/neutron/latest/ovn/migration.html
○ Charmed OpenStack 環境
https://docs.openstack.org/charm-guide/latest/project/procedures/ovn-migration.html
○ その他の環境では現時点では確立された手順・ドキュメントはなさそう
OpenStack 環境
ML2/OVS から ML2/OVN への移行
14
旧環境
OVS
新環境
OVN
OVS OVN
17. 参考)ML2/OVS のノード構成
● Controller ノード
○ Neutron
○ データベース
○ RabbitMQ
● Compute ノード
○ インスタンス
○ DHCP エージェント
○ メタデータエージェント
● Network ノード
○ L3エージェント(ルータ)
※TripleO のデフォルトではController・Network は
ひとつに集約される
References:
https://docs.openstack.org/neutron/latest/admin/deploy-ovs-selfservice.html
17
20. Neutron
● プロトコル
○ HTTP(S), REST API
● データ
○ 論理ネットワークの構成
■ Network
■ Subnet
■ Port
■ Router
■ Security group
■ etc.
● 設定ファイル
○ /etc/neutron/plugins/ml2/ml2_conf.ini
■ [ml2]
■ mechanism_drivers=ovn
■ [ovn]
■ ovn_nb_connection=tcp:172.16.
2.221:6641
■ ovn_sb_connection=tcp:172.16.
2.221:6642
20
21. Neutron のデータの一例
(overcloud) [stack@undercloud ~]$ openstack network list
+--------------------------------------+----------------+--------------------------------------+
| ID | Name | Subnets |
+--------------------------------------+----------------+--------------------------------------+
| 8cc44913-63e3-45b0-8834-c275c71d5dae | sample_network | 75caad86-0d98-45ef-9661-fcf1a60927c9 |
+--------------------------------------+----------------+--------------------------------------+
(overcloud) [stack@undercloud ~]$ openstack subnet list
+--------------------------------------+---------------+--------------------------------------+----------------+
| ID | Name | Network | Subnet |
+--------------------------------------+---------------+--------------------------------------+----------------+
| 75caad86-0d98-45ef-9661-fcf1a60927c9 | sample_subnet | 8cc44913-63e3-45b0-8834-c275c71d5dae | 192.168.0.0/24 |
+--------------------------------------+---------------+--------------------------------------+----------------+
(overcloud) [stack@undercloud ~]$ openstack router list
+--------------------------------------+----------------+--------+-------+----------------------------------+
| ID | Name | Status | State | Project |
+--------------------------------------+----------------+--------+-------+----------------------------------+
| 1e7225bc-e8d2-4cc8-ae0c-5b06e0299087 | example_router | ACTIVE | UP | 8348c8f988394946bbe7c2354931557d |
+--------------------------------------+----------------+--------+-------+----------------------------------+
21
22. Northbound Database
● ポート
○ 6641/tcp
● プロトコル
○ OVSDB Management Protocol
● データ
○ 論理ネットワークの構成
(desired state)
■ Logical_Switch
■ Logical_Router
■ Logical_Switch_Port
■ Logical_Router_Port
■ ACL
■ NAT
■ etc.
22
23. Northbound Database のデータの一例
[root@overcloud-controller-2 /]# ovn-nbctl show
switch fa59c807-1875-425f-b081-7c6b095f09f5 (neutron-8cc44913-63e3-45b0-8834-c275c71d5dae) (aka sample_network)
port cd787968-427c-4105-a4bc-ed7818fddcd1
type: router
router-port: lrp-cd787968-427c-4105-a4bc-ed7818fddcd1
port 4b98d1da-3481-4703-b478-91071b077912
addresses: ["fa:16:3e:3f:16:11 192.168.0.187"]
port b8cb7124-ce79-49e5-a76b-5f0ddf804611
type: localport
addresses: ["fa:16:3e:ce:b2:82 192.168.0.2"]
router 3aec0d86-110a-402e-8901-f07112c3bc30 (neutron-1e7225bc-e8d2-4cc8-ae0c-5b06e0299087) (aka example_router)
port lrp-cd787968-427c-4105-a4bc-ed7818fddcd1
mac: "fa:16:3e:fe:1e:a9"
networks: ["192.168.0.1/24"]
23
25. Southbound Database
● ポート
○ 6642/tcp
● プロトコル
○ OVSDB Management Protocol
● データ
○ 物理的ネットワーク・ノードの現在
の状況
○ オーバーレイネットワークと物理
ネットワークの関係性
○ オーバーレイネットワークの論理フ
ロー
■ Chassis
■ Gateway_Chassis
■ Logical_Flow
■ Datapath_Binding
■ Port_Binding
■ etc. 25
26. Southbound Database のデータの一例
[root@overcloud-controller-2 /]# ovn-sbctl dump-flows|grep Datapath -A2
Datapath: "neutron-1e7225bc-e8d2-4cc8-ae0c-5b06e0299087" aka "example_router" (2aa663a6-5255-4f52-9fbe-15b05c707452) Pipeline: ingress
table=0 (lr_in_admission ), priority=100 , match=(vlan.present || eth.src[40]), action=(drop;)
table=0 (lr_in_admission ), priority=50 , match=(eth.dst == fa:16:3e:fe:1e:a9 && inport ==
"lrp-cd787968-427c-4105-a4bc-ed7818fddcd1"), action=(xreg0[0..47] = fa:16:3e:fe:1e:a9; next;)
Datapath: "neutron-1e7225bc-e8d2-4cc8-ae0c-5b06e0299087" aka "example_router" (2aa663a6-5255-4f52-9fbe-15b05c707452) Pipeline: egress
table=0 (lr_out_chk_dnat_local), priority=0 , match=(1), action=(reg9[4] = 0; next;)
table=1 (lr_out_undnat ), priority=0 , match=(1), action=(next;)
Datapath: "neutron-8cc44913-63e3-45b0-8834-c275c71d5dae" aka "sample_network" (b63b90f7-2429-40d5-bedb-6a96617fb609) Pipeline: ingress
table=0 (ls_in_port_sec_l2 ), priority=100 , match=(eth.src[40]), action=(drop;)
table=0 (ls_in_port_sec_l2 ), priority=100 , match=(vlan.present), action=(drop;)
Datapath: "neutron-8cc44913-63e3-45b0-8834-c275c71d5dae" aka "sample_network" (b63b90f7-2429-40d5-bedb-6a96617fb609) Pipeline: egress
table=0 (ls_out_pre_lb ), priority=110 , match=(eth.mcast), action=(next;)
table=0 (ls_out_pre_lb ), priority=110 , match=(eth.src == $svc_monitor_mac), action=(next;)
26
27. Southbound Database のデータの一例
[root@overcloud-controller-0 /]# ovn-sbctl show
Chassis "4ef242e0-9922-47f3-87fb-258c5d7ec25c"
hostname: overcloud-controller-0.example.com
Encap geneve
ip: "172.16.0.57"
options: {csum="true"}
Chassis "8af639e8-bff6-4e40-84a4-d02cc334ea95"
hostname: overcloud-novacompute-0.example.com
Encap geneve
ip: "172.16.0.42"
options: {csum="true"}
Port_Binding "4b98d1da-3481-4703-b478-91071b077912"
Chassis "6644dcf8-bff2-42df-a369-f69fe514f14e"
hostname: overcloud-novacompute-1.example.com
Encap geneve
ip: "172.16.0.127"
options: {csum="true"}
27
28. ● データベースノードを複数台構
成にして冗長化できる
● Pacemaker による
Active-Backup クラスタ
○ Train 以前の TripleO のデフォルト
● RAFT に基づく Active-Active ク
ラスタ
○ Wallayb 以降の TripleO のデフォ
ルト
Southbound Database
の冗長化
28
https://docs.openstack.org/releasenotes/tripleo-heat-templates/wallaby.html
30. ovsdb-server
● ポート
○ 6640/tcp
○ Unic Domain Socket
● プロトコル
○ OVSDB Management Protocol
● データ
○ 各ノードごとに独自のデータを保持
○ Open vSwitch のスイッチやポート
の情報
■ Bridge
■ Port
■ Interface
■ etc.
30
32. ovs-vswitchd のデータの一例
[root@overcloud-novacompute-0 ~]# ovs-ofctl dump-flows br-int|grep arp|grep -e 192.168.0.187 -e fa:16:3e:3f:16:11
cookie=0x8ccc0b20, duration=97.462s, table=10, n_packets=2, n_bytes=84, idle_age=28,
priority=90,arp,reg14=0x3,metadata=0x3,dl_src=fa:16:3e:3f:16:11,arp_spa=192.168.0.187,arp_sha=fa:16:3e:3f:16:11
actions=resubmit(,11)
cookie=0xe2d242a0, duration=97.462s, table=26, n_packets=0, n_bytes=0, idle_age=97,
priority=100,arp,reg14=0x3,metadata=0x3,arp_tpa=192.168.0.187,arp_op=1 actions=resubmit(,27)
cookie=0x2817d9b, duration=97.464s, table=26, n_packets=0, n_bytes=0, idle_age=97,
priority=50,arp,metadata=0x3,arp_tpa=192.168.0.187,arp_op=1
actions=move:NXM_OF_ETH_SRC[]->NXM_OF_ETH_DST[],mod_dl_src:fa:16:3e:3f:16:11,load:0x2->NXM_OF_ARP_OP[],move:NXM_NX_ARP_
SHA[]->NXM_NX_ARP_THA[],load:0xfa163e3f1611->NXM_NX_ARP_SHA[],move:NXM_OF_ARP_SPA[]->NXM_OF_ARP_TPA[],load:0xc0a800bb->
NXM_OF_ARP_SPA[],move:NXM_NX_REG14[]->NXM_NX_REG15[],load:0x1->NXM_NX_REG10[0],resubmit(,37)
インスタンスが1台稼働しているコンピュードノードの br-int の OpenFlow ルールの数
[root@overcloud-novacompute-0 ~]# ovs-ofctl dump-flows br-int|wc -l
344
32
33. OVN Metadata Agent
● cloud-init 用のメタデータプロキ
シ
● ネットワークごとに
169.254.169.254:80 でリッスン
するHAProxy を立ち上げる
33
36. ● 仮想スイッチ
○ br-int の OpenFlow
● 仮想ルータ
○ br-int の OpenFlow
● ARP
○ br-int の OpenFlow
● DHCP
○ br-int の OpenFlow
● セキュリティグループ
○ br-int の OpenFlow
● メタデータプロキシ
○ HAProxy
ML2/OVN コンピュートノードの構成
36
37. 参考)ML2/OVS コンピュートノードの構成
● 仮想スイッチ
○ br-int の OpenFlow
● 仮想ルータ
○ network namespace
● ARP
○ 単に相手インスタンスに届く
● DHCP
○ dnsmasq
● セキュリティグループ
○ Linux Bridge と iptables
● メタデータプロキシ
○ HAProxy
References:
https://docs.openstack.org/neutron/latest/contributor/internals/openvswitch_agent.html
37
41. ARP
● br-int 内に OpenFlow
ルールとして実装される
● ARP パケットは通信相手
のインスタンスには到達
しない
41
<ML2/OVS では>
ARP は通信相手に届く
42. DHCP
● br-int の OpenFlow ルー
ルと、OpenFlow コント
ローラ(ovn_contorller)
によって実装される
● dnsmasq といった
DHCP サーバは存在しな
い
42
<ML2/OVS では>
dnsmasq が DHCP を提供する
43. メタデータプロキシ
● HAProxy によって実装さ
れる
● HAProxy は各ノードごと
・Neutron のネットワーク
ごとに起動する
● インスタンスとメタデータ
プロキシ
(169.254.169.254)間の
通信がノードを跨ぐことは
ない
43
<ML2/OVS では>
HAProxy がメタデータプロキシと
なる
44. East-West 同じノードの場合
● DVR が常に有効
● パケットは外部へ流れな
い
44
<ML2/OVS では>
DVR が無効の場合、異なるネット
ワーク間の通信であれば、ネット
ワークノード上に実装されたルー
タを経由する
45. East-West 異なるノードの場合
● DVR が常に有効
● パケットは GENEVE でカ
プセル化される
● Neutron のネットワークの
segmentation_id は無視さ
れる
● SB の Datapath_Binding
テーブルの tunnel_key 列
の値が VNI になる
45
<ML2/OVS では>
DVR が無効の場合、異なるネット
ワーク間の通信であれば、ネット
ワークノード上に実装されたルー
タを経由する
46. East-West 異なるノード・ネットワークの場合
● DVR が常に有効
● パケットは GENEVE で
カプセル化される
● 仮想ルータは br-int の
OpenFlow ルールとして
実装される
46
<ML2/OVS では>
DVR が無効の場合、異なるネット
ワーク間の通信であれば、ネット
ワークノード上に実装されたルー
タを経由する
47. North-South FIP が割り当てられていない場合
● 通信はゲートウェイノード
を介する
● SNAT はゲートウェイノー
ドの br-int の OpenFlow
ルールとして実装される
47
<ML2/OVS では>
DVR が無効の場合、ネットワーク
ノード上に実装されたルータからプ
ロバイダーネットワークへ送信され
る
49. North-South Distributed-FIP が無効な環境で
FIP が割り当てられている場合
● 通信はゲートウェイノード
を介する
● SNAT/DNAT はゲート
ウェイノードの br-int の
OpenFlow ルールとして
実装される
49
<ML2/OVS では>
DVR が無効の場合、ネットワーク
ノード上に実装されたルータからプ
ロバイダーネットワークへ送信され
る
50. North-South Distributed-FIP が有効な環境で
FIP が割り当てられている場合
● /etc/neutron/plugins/ml2/ml2_conf.ini
[ml2]
mechanism_drivers=ovn
[ovn]
enable_distributed_floating_ip=True
● デフォルト値は False
● TripleO のデフォルト値は True
50
51. ● ゲートウェイノードを介さ
ない
● SNAT/DNAT はコン
ピュートノードの br-int の
OpenFlow ルールとして
実装される
● コンピュートノードがプロ
バイダーネットワークに接
続するインタフェースを持
つ必要がある
North-South Distributed-FIP が有効な環境で
FIP が割り当てられている場合
51
53. BFD(ノード間のキープアライブ)
● パケットは GENEVE でカ
プセル化される
● VNI は 0
● ノード間のネットワークの疏
通状況を確認する
● 疎通しないノードが存在す
れば、仮想ルータのゲート
ウェイポートのフェールオー
バーを行う
53
<ML2/OVS では>
keepalived による VRRP でルー
タごとに冗長化される
54. まとめ
● OVN は Open vSwitch を使ってオーバーレイネットワークを構築するためのソフト
ウェア
● OpenStack では ML2/OVS から ML2/OVN への移行が進んでいる
● パフォーマンスの向上等の利点が期待される
● 制約事項(出来ないことなど)に注意
● 一部の環境向けには ML2/OVS から ML2/OVN へのマイグレーションドキュメント
が整備されている
54