易陆发现互联网技术论坛

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

使用 Open vSwitch (OVS)+ VLAN 组网

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

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

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

x
Neutron 基于 VLAN 模式的 tenant network 同 provider network 一样,都必须使用物理的 VLAN 网络。
* X  x: s9 a5 N% H' r2.1 物理 VLAN 网络配置$ b( I9 S4 C% G  F
本例子中,交换机上划分了三个 VLAN 区域:2 ]/ V0 D) q5 k5 d
管理网络,用于 openstack 节点之间的通信,假设 VLAN ID 范围为 50 - 99.
+ O5 i7 q1 ?& W7 e) P数据网络,用于虚拟机之间的通讯。由于Vlan模式下,租户建立的网络都具有独立的 Vlan ID,故需要将连接虚机的服务器的交换机端口设置为 Trunk 模式,并且设置所允许的 VLAN ID 范围,比如 100~300。( Z) K. q4 x# g. ~
外部网络,用于连接外部网络。加上 VLAN ID 范围为 1000-1010。$ h$ G4 x: j2 ^3 j
6 F' y$ z$ O$ V- ?- s
关于网段之间的路由:, o: G7 U* a# X: x
如果该物理交换机接到一个物理路由器并做相应的配置,则数据网络可以使用这个物理路由器,而不需要使用 Neutron 的虚拟路由器。
) H' `$ x$ z) N- v5 U如果不使用物理的路由器,可以在网络节点上配置虚拟路由器。4 ?4 j! R. A: y. z% g5 x! i7 |  q
2.2 Neutron 配置' R, }& z+ s7 y/ ?* A
2.2.1 配置进行
3 s! |  l* q( E控制节点上:
+ E0 z4 v  m. d) K" {# vim /etc/neutron/plugins/ml2/ml2_conf.ini
% m; ^5 W, W- \[ml2] 7 V/ j7 n8 B; ~
type_drivers = flat,vlan
7 n% I, C* r2 a$ k5 \tenant_network_types = vlan, e$ G0 v3 o  e) m9 s" p
mechanism_drivers = openvswitch/ C7 t2 I' N1 }. v6 H" [* g
[ml2_type_flat]0 R0 \+ y6 d) j0 @
flat_networks = external
, D( x# D% z1 }% a2 Q1 ~[ml2_type_vlan]
9 F9 I- X, x+ U, {7 C2 P2 }+ rnetwork_vlan_ranges = physnet1:100:300
" ^" D/ ?5 n# n9 Q  x; Q
) P7 M; o0 V0 c/ q. M" i0 v网络节点上:
: g3 e  c7 {; c+ a7 n#为连接物理交换机的网卡 eth2 和 eth3 建立 OVS physical bridge,其中,eth2 用于数据网络,eth3 用于外部网络7 _( O% E/ O+ ~5 i. C6 X
ovs-vsctl add-br br-eth2
  }2 ^$ ?- P- r. c1 }ovs-vsctl add-br br-ex
  m) E2 g6 i+ _, G1 h5 ?2 P3 Wovs-vsctl add-port br-eth2 eth28 q7 S! ~* S; _4 v4 _
ovs-vsctl add-port br-ex eth3
3 w* n) C1 t$ d5 p6 |/ [" h# vim /etc/neutron/plugins/ml2/ml2_conf.ini
$ G  i. i4 I4 S0 j, m9 [[m12]7 i; k: ^4 N0 L
type_drivers = flat,vlan
6 l  `) k) R" q  }) B, N" h3 F: |tenant_network_types = vlan; C* W" ~5 V! \: x
mechanism_drivers = openvswitch
+ W; ~+ E7 j! d8 N4 ]  D9 s[ml2_type_flat]
' r4 m1 @  H, U2 Bflat_networks = external
- W  @* d1 q% ?[ml2_type_vlan]
0 O" N1 D; `7 a. ~# J* o! `" bnetwork_vlan_ranges = physnet1:100:300,external:1000:1010   N5 _0 q2 ~6 z0 x( Z
[ovs]
- }: A/ S$ h# k6 r+ nbridge_mappings = physnet1:br-eth2,external:br-ex! E; G, S: Z+ N" y
6 j2 r% z$ j) \3 P& k
计算节点上:
. H5 W: q& J% t' k: @8 M- R" r: q#为连接物理交换机的网卡 eth2 建立 OVS physical bridge
- K5 A, |, n9 u4 e" H; Sovs-vsctl add-br br-eth20 o# X/ a$ j& X: x
ovs-vsctl add-port br-eth2 eth2
. t$ e! ~3 Y6 l6 E# vim /etc/neutron/plugins/ml2/ml2_conf.ini * W4 S& s* f) r' l
[m12]3 v# Y: V( }9 t2 I" F( Y
type_drivers = vlan" u, r$ S) a/ N
tenant_network_types = vlan
9 {7 s4 l6 m- L! e5 S( ]2 Nmechanism_drivers = openvswitch+ i4 p& I7 G) p: a* z; G9 O1 T, j% C
[ml2_type_vlan]
( C) b4 m2 @- G7 nnetwork_vlan_ranges = physnet1:100:300 1 `/ h* o% E8 ?# O& ^& x
[ovs] 7 Y9 s! Z5 b% d% R3 E* c
bridge_mappings = physnet1:br-eth28 H% ]0 Z) y( M+ W2 n
1 U/ Q" Z5 D/ b1 k5 V& N% u$ O
注意:2 M" E: ]' a" U5 x6 a
network_vlan_ranges 中的 VLAN ID 必须和物理交换机上的 VLAN ID 区间一致。
+ k, X8 ]1 _  hbridge_mappings 中所指定的 bridge 需要和在个节点上手工创建的 OVS bridge 一致。
4 d3 E& U3 m' Q7 T* T) N; P, d: \然后重启相应的 Neutron 服务。
7 d+ {. {  m& ~8 C. U2.2.2 配置生效过程5 U. t6 ^( ^4 t3 V+ o( t. j
当 Neutron L2 Agent (OVS Agent 或者 Linux Bridge agent)在计算和网络节点上启动时,它会根据各种配置在节点上创建各种 bridge。以 OVS Agent 为例,
$ Z+ \5 Q6 W7 f! b# w(1)创建 intergration brige(默认是 br-int);如果 enable_tunneling = true 的话,创建 tunnel bridge (默认是 br-tun)。
" J, N2 C) P1 R- W% t(2)根据 bridge_mappings,配置每一个 VLAN 和 Flat 网络使用的 physical network interface 对应的预先创建的 OVS bridge。
% W6 Z3 ~4 u/ [6 D(3)所有虚机的 VIF 都是连接到 integration bridge。同一个虚拟网络上的 VM VIF 共享一个本地 VLAN (local VLAN)。Local VLAN ID 被映射到虚拟网络对应的物理网络的 segmentation_id。1 G7 g& e" L% B% g1 p' W4 r% _
(4)对于 GRE 类型的虚拟网络,使用 LSI (Logical Switch identifier)来区分隧道(tunnel)内的租户网络流量(tenant traffic)。这个隧道的两端都是每个物理服务器上的 tunneling bridge。使用 Patch port 来将 br-int 和 br-tun 连接起来。
* V) \+ m/ j, l(5)对于每一个 VLAN 或者 Flat 类型的网络,使用一个 veth 或者一个 patch port 对来连接 br-int 和物理网桥,以及增加 flow rules等。$ ?  Z$ K6 z- k1 H* m+ |
(6)最后,Neutron L2 Agent 启动后会运行一个RPC循环任务来处理 端口添加、删除和修改。管理员可以通过配置项 polling_interval 指定该 RPC 循环任务的执行间隔,默认为2秒。
) c* u& [" {1 V- N2.3 创建虚拟网络和子网
/ z  p8 }6 j' ^! r: S% T2.3.1 创建命令" R5 K+ L: n+ O& ^) a' P' i
s1@controller:~$ neutron net-create net1 (或者 Admin 用户运行 neutron net-create net1 --provider:network_type vlan --provider:physical_network physnet1 --provider:segmentation_id 101。效果相同)
# }0 y) G# R. g$ o6 oCreated a new network:
/ W5 ^* w; z. `/ W& l' c2 W. j+---------------------------+--------------------------------------+
# r9 {: ~3 E* K; S7 T| Field                     | Value                                |$ t8 B- M, Y2 E" w- {, E
+---------------------------+--------------------------------------+% Z, k3 z1 ^- e( U; p- b- k
| admin_state_up            | True                                 |
% s4 M1 |, e: D8 |  Y3 U& Y| id                        | dfc74f44-a9f2-4497-a53d-1723804a49a8 |- Q# W$ n- y% G4 Y0 q  Q* i9 g
| name                      | net1                                  |7 O, n' B* j" F+ {6 j" T4 q
| provider:network_type     | vlan                                 |
0 Z& h9 j; c% e| provider:physical_network | physnet1                             |! G% K  B' _5 t- E
| provider:segmentation_id  | 101                                  |8 e7 @0 W; b. i! f: R$ f% _: \
| router:external           | False                                |
& ^( P# T9 Q; W! ^* G) || shared                    | False                                |
# x/ G3 `% T/ D: \, L& y( m1 S| status                    | ACTIVE                               |% H! s1 t! b8 ?' a, J+ t4 r& L
| subnets                   |                                      |9 I9 ?$ L% ]2 e' G% n$ r' X* V
| tenant_id                 | 74c8ada23a3449f888d9e19b76d13aab     |
, n& J: `. h9 J' `+---------------------------+--------------------------------------+   / O3 [. I3 S1 t, h# d, X
s1@controller:~$ neutron subnet-create subnet1 10.0.0.0/24 --name net1
, \, X6 S" D  [- ^* J
% E$ @6 E) r# L/ u* G2.3.2 Neutron 代码实现- j/ A+ Z/ y' D5 J+ A) _6 Q
做完以上的步骤之后,用户就可以在 subnet 上 boot 虚机了。
5 Q1 Z( f/ x2 z7 @5 Bboot 虚机的过程中,Nova 依次会:5 E6 m4 F7 Z* l; O3 _9 A) A
(1)调用 Neutron REST API 申请一个或者多个 port。Neutron 会根据数据库中的配置来进行分配。
" @$ R# k. M0 a! l(2)在计算节点上,Nova 调用 ovs-vsctl 命令将虚机的 VIF 被 plug 到 br-int 上。4 K; \- O: h/ Q  @. |3 \
(3)启动虚机。* H+ _8 ]  e4 [! j: M
Neutron L2 Agent 的循环任务每隔两秒会依次:. l* x# F1 h$ [5 Y
(1)调用 ”ovs-vsctl list-ports“ 命令获取到 br-int 上的 port,再根据上次保存的历史数据,生成所有变更端口的列表(包括添加的、更新的、删除的端口)。比如:
' K/ t5 S4 u7 ]5 t0 L$ H7 ^4 A& n{'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'])}9 e  Z: E9 j0 \' Z4 V  H2 N
1
3 |1 e; @& }) Y(2)为每一个待处理端口,根据其 ID 从 DB 中取得其详细信息。比如:$ V- R1 ~$ ?- _+ P
{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'}
% o( H+ |+ Z. Q2 d1
0 X5 ~# J, E, x: R% U6 x(3)针对每一个增加或者变更的 port,设置 local VLAN Tag;调用 ”ovs-ofctl mod-flows “ 命令来设置 br-tun 或者 物理 bridge 的 flow rules;并设置 db 中其状态为 up。
, c; L6 A% s2 k1 G& K/ F* b(4)针对每一个被删除的 port,设置 db 中其状态为 down。2 {6 q, {$ n  x& {' u/ {8 e4 [- d
2.4 Neutron 虚拟网络
, Y9 {& f, o( F(1)一个计算节点上的网络实例
5 `9 t% {% ^$ M4 W) Y它反映的网络配置如下:
& r% [; }) j' [- p7 Q4 VNeutron 使用 Open vSiwtch。5 }: M8 e. X  h$ C- Q
一台物理服务器,网卡 eth1 接入物理交换机,预先配置了网桥 br-eth1。
8 z9 p9 _# V3 G8 v' }创建了两个 neutron VLAN network,分别使用 VLAN ID 101 和 102。
* C- _. b+ u+ d6 q5 h7 I7 X该服务器上运行三个虚机,虚机1 和 2 分别有一个网卡接入 network 1;虚机2 和 3 分别有一个网卡接入 network 2.+ }. u4 F& {+ g/ x

! G: ^7 S1 x. q1 E: g. f  Z, WNeutron 在该计算节点上做的事情:' N4 ]" T/ Q/ J5 J& B# M
创建了 OVS Integration bridge br-int。它的四个 Access 端口中,两个打上了内部 Tag 1,连接接入 network 1 的两个网卡;另两个端口的 VLAN Tag 为 2。
# ^4 F( R* W6 k& o1 u创建了一对 patch port,连接 br-int 和 br-eth1。
4 `$ `# d" v% U+ q3 }& m) s设置 br-int 中的 flow rules。对从 access ports 进入的数据帧,加上相应的 VLAN Tag,转发到 patch port;从 patch port 进入的数据帧,将 VLAN ID 101 修改为 1, 102 修改为 2,再转发到相应的 Access ports。, R2 R. ^. Y" a( m, L3 l5 L
设置 br-eth1 中的 flow rules。从 patch port 进入的数据帧,将内部 VLAN ID 1 修改为 101,内部 VLAN ID 2 修改为 102,再从 eth1 端口发出。对从 eth1 进入的数据帧做相反的处理。$ L& x$ I) w# l, V. H* X% p7 G
(2)再加上另一个连接到同一个物理交换机的服务器(加上 neutron 网络使用的 VLAN ID 为 100,物理 brige 为 br-eth0):
$ U* R7 d! k7 {% H6 A" e' e4 d) \! r$ x6 E3 u
Neutron 实现了基于物理 VLAN 交换机的跨物理服务器二层虚拟网络。2 U, Q# \+ z8 _% f: J6 M( }/ G
(3)连接到同一物理交换机的网络节点的情况/ `# y' x( ]- G4 Q4 q

2 T( ]9 N0 {2 A& Y: P0 V  S' B9 H(4)网络流向
0 y3 B2 S$ U/ @8 m; {不同物理服务器上的虚机,如果 VM1 和 VM2 属于同一个 tenant network 的同一个subnet,那么两者的通信直接经过 物理交换机 进行,不需要做到网络节点。如图10 所示。
' u( w% p' n! R+ N相同物理服务器上的虚机,如果 VM1 和 VM2 属于同一个 tenant network 的同一个subnet,那么两者的通信直接经过 br-int 进行。
' _/ x+ F+ u2 C" i6 N  I
% f$ D9 e! \% m  t# _  V% H; u对其他虚机之间数据交换情形,都算作跨子网的数据流向,都需要经过网络节点中的 Router 进行 IP 包的路由。(也可以直接使用连接物理交换机的物理路由器)。
: B% p+ o- P$ l6 C5 b
7 p* ?! ]/ Y+ _' c2 s  t
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

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

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

QQ|返回首页|Archiver|小黑屋|易陆发现技术论坛 点击这里给我发消息

GMT+8, 2026-4-8 19:13 , Processed in 0.045827 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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