易陆发现互联网技术论坛

 找回密码
 开始注册
查看: 1554|回复: 0
收起左侧

使用 Open vSwitch (OVS)+ VLAN 组网

[复制链接]
发表于 2021-10-8 15:50:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?开始注册

x
Neutron 基于 VLAN 模式的 tenant network 同 provider network 一样,都必须使用物理的 VLAN 网络。2 b# y2 ?# [1 ?( R; a2 g
2.1 物理 VLAN 网络配置
6 Z/ T. Z# R  W- P' c  A本例子中,交换机上划分了三个 VLAN 区域:4 C' L- e) d& P! k- |
管理网络,用于 openstack 节点之间的通信,假设 VLAN ID 范围为 50 - 99.2 w; ]  ?; Y8 u, E: U, r
数据网络,用于虚拟机之间的通讯。由于Vlan模式下,租户建立的网络都具有独立的 Vlan ID,故需要将连接虚机的服务器的交换机端口设置为 Trunk 模式,并且设置所允许的 VLAN ID 范围,比如 100~300。
" F& O7 R. f; x% S* Y, [外部网络,用于连接外部网络。加上 VLAN ID 范围为 1000-1010。
6 I& a& r3 E; ]* t2 o' t: U8 Z
& a/ z% n2 l1 T. b关于网段之间的路由:
0 c$ ~( Q. L! w# k+ X- {. B如果该物理交换机接到一个物理路由器并做相应的配置,则数据网络可以使用这个物理路由器,而不需要使用 Neutron 的虚拟路由器。9 N+ z& z; X( v/ v) w( r. P& |8 T
如果不使用物理的路由器,可以在网络节点上配置虚拟路由器。
/ Q0 ?8 L* b+ O% h$ [0 a; T2.2 Neutron 配置
, V3 K$ _) B  A% F2.2.1 配置进行
/ Q5 B* U" p% l" M) \控制节点上:2 M& v7 `+ x- W2 [
# vim /etc/neutron/plugins/ml2/ml2_conf.ini5 l4 S7 A1 w# F6 y  L$ B
[ml2] 3 n# W  I. q/ E. z5 c# f- L- A' ~
type_drivers = flat,vlan
8 ?3 R$ M. {# G1 D- X7 P7 G& _/ Ctenant_network_types = vlan' O+ X% e, T5 u
mechanism_drivers = openvswitch) K: T# ]) H  d/ M
[ml2_type_flat]
$ v. B& R$ T, }$ Mflat_networks = external2 F, L8 v% h5 v3 W
[ml2_type_vlan] 1 T$ a9 J# T& s/ a' z1 H
network_vlan_ranges = physnet1:100:300
9 L6 @: Z7 A% O) n3 Q" G3 b
$ M4 c: Q9 P0 v2 @6 J网络节点上:, C) Q* Z' D" F  A5 u
#为连接物理交换机的网卡 eth2 和 eth3 建立 OVS physical bridge,其中,eth2 用于数据网络,eth3 用于外部网络
. E2 g! I( `# z; fovs-vsctl add-br br-eth2. H- n1 d* V: a  ]3 L
ovs-vsctl add-br br-ex
2 H- v( O* ^6 C  iovs-vsctl add-port br-eth2 eth2
- I  A0 D9 D7 `  aovs-vsctl add-port br-ex eth37 Z% y. v' Q8 E1 ?
# vim /etc/neutron/plugins/ml2/ml2_conf.ini
7 y" v3 _% o& j2 N' W$ D4 Q[m12]# E' m: V; _* b( I
type_drivers = flat,vlan9 c9 u+ H  U' w) c- A
tenant_network_types = vlan+ |9 o- X! q4 B+ `! e
mechanism_drivers = openvswitch! S" L4 F; P$ Z6 f* S$ g3 n
[ml2_type_flat]
- j: |1 j6 Z8 v: wflat_networks = external
4 Z# ]* F/ u% x( b[ml2_type_vlan]
5 z; {( n4 d. ~" _) r9 C! Inetwork_vlan_ranges = physnet1:100:300,external:1000:1010 ' R6 j9 s0 Y# W$ f: b# i' Q
[ovs]
8 H. w6 g" g9 g9 t/ I/ l& Mbridge_mappings = physnet1:br-eth2,external:br-ex
; a* d( t3 q& v# U( K  ]% f
* ^$ B# N4 o" H& I0 @1 T计算节点上:
$ }9 D0 |% A6 _# [7 X- E#为连接物理交换机的网卡 eth2 建立 OVS physical bridge
# X+ K* S5 d7 ~: A! Y& j1 ?, Eovs-vsctl add-br br-eth29 j& z$ p5 K$ k1 C! f
ovs-vsctl add-port br-eth2 eth2
0 c9 o7 H. b$ Y7 {# vim /etc/neutron/plugins/ml2/ml2_conf.ini
; F" M7 a, L$ z' j; x3 S[m12]3 C, Y8 B3 ~# ^/ N( M  d* Q% _3 N
type_drivers = vlan* l7 _) {  L9 ]2 w
tenant_network_types = vlan# b& K9 f& z% N8 z0 e
mechanism_drivers = openvswitch
  ]* [' U  J# N[ml2_type_vlan]
9 G; B' Y5 \% T* [3 C" H. g3 J. |network_vlan_ranges = physnet1:100:300 1 d8 V; q( @* d
[ovs]
8 Q$ m7 c7 F; z( C3 i+ @! Jbridge_mappings = physnet1:br-eth2
" w8 ^+ {  l, K- Z
2 L" s. r  c2 J注意:
: [( O- W- p( e) D* c/ K% knetwork_vlan_ranges 中的 VLAN ID 必须和物理交换机上的 VLAN ID 区间一致。0 \" E4 I% w' Y" G) D2 ^8 V
bridge_mappings 中所指定的 bridge 需要和在个节点上手工创建的 OVS bridge 一致。
" ]- N# ?  I: ?9 y$ v7 P" U; d4 V然后重启相应的 Neutron 服务。
. m4 K+ J+ ?! ?; h/ W2.2.2 配置生效过程
8 P5 i+ Y, h9 w1 @! R0 i( V当 Neutron L2 Agent (OVS Agent 或者 Linux Bridge agent)在计算和网络节点上启动时,它会根据各种配置在节点上创建各种 bridge。以 OVS Agent 为例,& v6 f5 {' \3 C# P6 W% q
(1)创建 intergration brige(默认是 br-int);如果 enable_tunneling = true 的话,创建 tunnel bridge (默认是 br-tun)。7 x. O" [2 ~5 O' M$ N2 D% r
(2)根据 bridge_mappings,配置每一个 VLAN 和 Flat 网络使用的 physical network interface 对应的预先创建的 OVS bridge。
8 m; k: v2 v. l(3)所有虚机的 VIF 都是连接到 integration bridge。同一个虚拟网络上的 VM VIF 共享一个本地 VLAN (local VLAN)。Local VLAN ID 被映射到虚拟网络对应的物理网络的 segmentation_id。! F2 _3 b2 \  j+ _$ J/ q
(4)对于 GRE 类型的虚拟网络,使用 LSI (Logical Switch identifier)来区分隧道(tunnel)内的租户网络流量(tenant traffic)。这个隧道的两端都是每个物理服务器上的 tunneling bridge。使用 Patch port 来将 br-int 和 br-tun 连接起来。  {9 ]/ Q5 a5 W4 g
(5)对于每一个 VLAN 或者 Flat 类型的网络,使用一个 veth 或者一个 patch port 对来连接 br-int 和物理网桥,以及增加 flow rules等。
+ b' v3 f+ A/ e# _0 Q/ l(6)最后,Neutron L2 Agent 启动后会运行一个RPC循环任务来处理 端口添加、删除和修改。管理员可以通过配置项 polling_interval 指定该 RPC 循环任务的执行间隔,默认为2秒。. D' o  I4 U# [) z1 I" `; S
2.3 创建虚拟网络和子网* X) L2 t- X2 B4 b& J0 T5 R4 `
2.3.1 创建命令
2 C& f% _: [5 z  F& L- ~s1@controller:~$ neutron net-create net1 (或者 Admin 用户运行 neutron net-create net1 --provider:network_type vlan --provider:physical_network physnet1 --provider:segmentation_id 101。效果相同)
, q  F" t- |" }1 pCreated a new network:. m6 k- [1 o* P. ~0 F9 i7 ~
+---------------------------+--------------------------------------+
1 ?: |  W1 @2 l+ N0 F$ k& y| Field                     | Value                                |/ C7 R2 l/ {) O0 H% @  M2 V8 ]5 s* [
+---------------------------+--------------------------------------+
3 o) O9 D  Z* s( G* c7 f  @| admin_state_up            | True                                 |# R* N& I2 R$ z; k1 E+ {
| id                        | dfc74f44-a9f2-4497-a53d-1723804a49a8 |
. O3 ?" ~6 K9 |# ?7 N) R| name                      | net1                                  |: U1 W0 X) S. ?/ b3 _; [
| provider:network_type     | vlan                                 |, V" |0 t1 p; U& |
| provider:physical_network | physnet1                             |
( S8 k+ ?2 Q! }$ ?, D, Z! t6 w5 S| provider:segmentation_id  | 101                                  |
/ X- g  R. R- |; @$ o| router:external           | False                                |6 E5 ?1 T5 M  O: B
| shared                    | False                                |: v! n' k- `( `# P: R0 J
| status                    | ACTIVE                               |# B% ]% o0 J# H2 j$ {# p5 g
| subnets                   |                                      |# d1 J1 P/ A# q+ u: G% V
| tenant_id                 | 74c8ada23a3449f888d9e19b76d13aab     |
, J' C7 n' {; ~+ Z- P( m+---------------------------+--------------------------------------+   
  M3 y' u7 m$ \( K. @s1@controller:~$ neutron subnet-create subnet1 10.0.0.0/24 --name net19 d0 A- ~5 s$ q8 }

. E% ]+ z' p9 b2.3.2 Neutron 代码实现' ?( k2 r$ m1 L  \6 f
做完以上的步骤之后,用户就可以在 subnet 上 boot 虚机了。
* J+ n/ s9 e$ `7 H" Y, iboot 虚机的过程中,Nova 依次会:) B9 W1 D  G( }$ ~# E
(1)调用 Neutron REST API 申请一个或者多个 port。Neutron 会根据数据库中的配置来进行分配。3 h# R. n% Y& t0 O+ n( q
(2)在计算节点上,Nova 调用 ovs-vsctl 命令将虚机的 VIF 被 plug 到 br-int 上。% Z  b) n& h' [) }# T6 ^5 U, Z
(3)启动虚机。
: X2 s* {8 @; n5 c# ~/ @; q  SNeutron L2 Agent 的循环任务每隔两秒会依次:0 X- e; O  s+ q" s( r
(1)调用 ”ovs-vsctl list-ports“ 命令获取到 br-int 上的 port,再根据上次保存的历史数据,生成所有变更端口的列表(包括添加的、更新的、删除的端口)。比如:/ _8 G) d" e& ]
{'current': set([u'04646b21-78a0-429e-85be-3167042b77be', u'592740b0-0768-4e57-870d-6495e6c22135']), 'removed': set([]), 'added': set([u'04646b21-78a0-429e-85be-3167042b77be', u'592740b0-0768-4e57-870d-6495e6c22135'])}; O0 \8 O6 r/ _* ]
1' }4 v, `7 ~+ q! p: A
(2)为每一个待处理端口,根据其 ID 从 DB 中取得其详细信息。比如:3 c* Z0 u8 x" V9 ]
{u'profile': {}, u'admin_state_up': True, u'network_id': u'e2022937-ec2a-467a-8cf1-f642a3f777b6', u'segmentation_id': 4, u'device_owner': u'compute:nova', u'physical_network': phynet1, u'mac_address': u'fa:16:3e:fd:ed:22', u'device': u'592740b0-0768-4e57-870d-6495e6c22135', u'port_id': u'592740b0-0768-4e57-870d-6495e6c22135', u'fixed_ips': [{u'subnet_id': u'13888749-12b3-462e-9afe-c527bd0a297e', u'ip_address': u'91.1.180.4'}], u'network_type': u'vlan'}& L$ @4 d) D6 S$ S7 Q
1' s! n% s# a* W3 r' b3 R
(3)针对每一个增加或者变更的 port,设置 local VLAN Tag;调用 ”ovs-ofctl mod-flows “ 命令来设置 br-tun 或者 物理 bridge 的 flow rules;并设置 db 中其状态为 up。
7 Q/ ?( T* H2 A* ~: z' V' r(4)针对每一个被删除的 port,设置 db 中其状态为 down。0 g5 C/ l; j" C4 m, O7 M! ]  m. Q% I
2.4 Neutron 虚拟网络0 K6 Z- S2 U5 c, D% G5 k4 [
(1)一个计算节点上的网络实例
' v2 e  I, k) g' I它反映的网络配置如下:& U9 W. J) W, j' b7 W' _2 C  Z" h
Neutron 使用 Open vSiwtch。
/ G. L/ Z: F; d7 m/ P一台物理服务器,网卡 eth1 接入物理交换机,预先配置了网桥 br-eth1。
- W% U+ v; k& E  `创建了两个 neutron VLAN network,分别使用 VLAN ID 101 和 102。
- z' A- X# e) E) p该服务器上运行三个虚机,虚机1 和 2 分别有一个网卡接入 network 1;虚机2 和 3 分别有一个网卡接入 network 2.; U+ |$ |$ g, C+ ^3 _+ m# y
$ u! J. X4 c3 z# V! W
Neutron 在该计算节点上做的事情:
+ y' ?/ I4 O+ {" _创建了 OVS Integration bridge br-int。它的四个 Access 端口中,两个打上了内部 Tag 1,连接接入 network 1 的两个网卡;另两个端口的 VLAN Tag 为 2。
6 e6 l! Q# q; [7 u创建了一对 patch port,连接 br-int 和 br-eth1。
+ S# h2 g4 i+ H设置 br-int 中的 flow rules。对从 access ports 进入的数据帧,加上相应的 VLAN Tag,转发到 patch port;从 patch port 进入的数据帧,将 VLAN ID 101 修改为 1, 102 修改为 2,再转发到相应的 Access ports。
  A$ t! n$ w3 }2 ^设置 br-eth1 中的 flow rules。从 patch port 进入的数据帧,将内部 VLAN ID 1 修改为 101,内部 VLAN ID 2 修改为 102,再从 eth1 端口发出。对从 eth1 进入的数据帧做相反的处理。
$ c0 d; F( w; \* d6 i9 h+ T6 W(2)再加上另一个连接到同一个物理交换机的服务器(加上 neutron 网络使用的 VLAN ID 为 100,物理 brige 为 br-eth0):: N8 Y/ p0 r$ `6 J0 e% ^2 j1 V
2 u6 H. {; h& c  c7 T* r
Neutron 实现了基于物理 VLAN 交换机的跨物理服务器二层虚拟网络。/ ]1 O$ B! b4 J  F, ?. s$ P$ j2 R
(3)连接到同一物理交换机的网络节点的情况: p8 c$ K1 u- @0 h9 w! i
5 P1 ?* w+ [. ?5 R1 `  j* ?: h
(4)网络流向( v! o' a$ U4 u1 j
不同物理服务器上的虚机,如果 VM1 和 VM2 属于同一个 tenant network 的同一个subnet,那么两者的通信直接经过 物理交换机 进行,不需要做到网络节点。如图10 所示。
3 V2 b$ T9 c! R% s+ W* f相同物理服务器上的虚机,如果 VM1 和 VM2 属于同一个 tenant network 的同一个subnet,那么两者的通信直接经过 br-int 进行。
% k: V2 b1 [% S, K; ]/ y) K& k, m% t6 O
对其他虚机之间数据交换情形,都算作跨子网的数据流向,都需要经过网络节点中的 Router 进行 IP 包的路由。(也可以直接使用连接物理交换机的物理路由器)。
( t  m5 H  t3 t
2 P* Q  L' t8 B; d. }# d- \% G
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

北京云银创陇科技有限公司以云计算运维,代码开发

QQ|返回首页|Archiver|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )点击这里给我发消息

GMT+8, 2026-4-8 23:55 , Processed in 0.055178 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

快速回复 返回顶部 返回列表