找回密码
 注册
查看: 1555|回复: 0

使用 Open vSwitch (OVS)+ VLAN 组网

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2021-10-8 15:50:46 | 显示全部楼层 |阅读模式
Neutron 基于 VLAN 模式的 tenant network 同 provider network 一样,都必须使用物理的 VLAN 网络。
2 p2 j) Y# z9 C( X: m) Q2.1 物理 VLAN 网络配置! S. i+ \7 I; \% o8 @2 W5 U6 X# e8 v# Q
本例子中,交换机上划分了三个 VLAN 区域:
& e2 m+ K0 g, b% \' @+ c2 Q管理网络,用于 OpenStack 节点之间的通信,假设 VLAN ID 范围为 50 - 99.
  z1 k  P( \" c7 e- q8 r( b  l数据网络,用于虚拟机之间的通讯。由于Vlan模式下,租户建立的网络都具有独立的 Vlan ID,故需要将连接虚机的服务器的交换机端口设置为 Trunk 模式,并且设置所允许的 VLAN ID 范围,比如 100~300。2 Q: I9 m$ j* m
外部网络,用于连接外部网络。加上 VLAN ID 范围为 1000-1010。* S0 t) \4 Z+ @

( P( Y  f) j/ l1 v0 g关于网段之间的路由:
. B6 c) [; K/ l$ _5 a( L& n7 Z如果该物理交换机接到一个物理路由器并做相应的配置,则数据网络可以使用这个物理路由器,而不需要使用 Neutron 的虚拟路由器。5 B0 J% R$ m7 l' ^. d
如果不使用物理的路由器,可以在网络节点上配置虚拟路由器。
" R0 U3 U2 s" W4 I7 z4 Y- `2.2 Neutron 配置
6 j( g7 Z  z7 G6 r9 ]* `3 p2.2.1 配置进行
- P! K. _" u* J3 t- f控制节点上:: O. ]: ~8 |8 `. W' n
# vim /etc/neutron/plugins/ml2/ml2_conf.ini
# }* v5 D8 R  w) D[ml2] ' n9 S1 b% I0 E( a
type_drivers = flat,vlan
: Y! f$ ?/ d% t+ |tenant_network_types = vlan
! x  n* v: _( z; d" fmechanism_drivers = openvswitch
0 Y& u! R) Q7 N6 ^8 \$ f8 T8 D[ml2_type_flat]8 Z8 \( ~$ _4 H0 w0 C9 s  p
flat_networks = external
" {- v+ L/ B- ?# ~0 k6 x5 C( o[ml2_type_vlan] $ Q2 ^+ Y: m& h4 R; h- }$ |0 L
network_vlan_ranges = physnet1:100:300
4 V% }1 v  C  U3 g' b9 L. X. l+ ~. n. a( L1 Q' \
网络节点上:
3 Q6 {8 l# T6 J* d+ I- i" ^#为连接物理交换机的网卡 eth2 和 eth3 建立 OVS physical bridge,其中,eth2 用于数据网络,eth3 用于外部网络
4 g! t# p* N- e: Jovs-vsctl add-br br-eth2
3 ?4 ?  N* a0 movs-vsctl add-br br-ex
, h$ M& A8 D; t* Fovs-vsctl add-port br-eth2 eth2: H- D6 }$ R' _3 u2 b, `
ovs-vsctl add-port br-ex eth3. M* W: J0 C; R1 d& ]$ v$ @
# vim /etc/neutron/plugins/ml2/ml2_conf.ini ) b/ I# a9 B( r* F) L# u9 @( t4 X
[m12]0 p5 W5 ?% p' R$ E$ v# u7 I
type_drivers = flat,vlan2 _; X5 x/ i0 r0 x0 P; l
tenant_network_types = vlan9 r  m* m  J2 D: J: _1 D$ }
mechanism_drivers = openvswitch
8 _" G, e8 z5 I! [  l) n1 @4 _[ml2_type_flat]
; [- \! f' x3 U, ]9 ]( Cflat_networks = external
% K3 N0 ~0 M7 h6 j0 R" W[ml2_type_vlan] - ?# }4 Q/ X9 Y- D  D
network_vlan_ranges = physnet1:100:300,external:1000:1010 2 X' p$ i5 @; j1 v* ?5 f2 A
[ovs]
/ V) K9 V; H; ?/ i  N# v4 Zbridge_mappings = physnet1:br-eth2,external:br-ex/ G! x) C* a7 V( x: ?! [$ M
: y: @+ V$ R5 |3 N
计算节点上:
1 I7 X8 h0 I2 }# W- Y#为连接物理交换机的网卡 eth2 建立 OVS physical bridge
% ^& N! {  a7 r! jovs-vsctl add-br br-eth2" D8 |, m4 o' J( W
ovs-vsctl add-port br-eth2 eth2$ }# w# ^: r2 q8 z# Q' W# _' o
# vim /etc/neutron/plugins/ml2/ml2_conf.ini
! n5 _- `7 M  g[m12]0 l1 q' }9 i$ x
type_drivers = vlan
+ Y" C4 J1 u) v) Etenant_network_types = vlan. Q; \5 V( `' A( D3 P2 c2 }0 L
mechanism_drivers = openvswitch
' X  e$ l( P: T4 P; q[ml2_type_vlan] : M. x, \6 k$ b8 v  ^) R
network_vlan_ranges = physnet1:100:300 5 v( M( ^; `5 l: `
[ovs] 9 x0 s8 S, t9 W5 N* Z8 }4 F
bridge_mappings = physnet1:br-eth20 ~. Q/ O! A- v' e$ b0 D

3 k- E8 e" T' ?) [0 p注意:
. N; s) ?$ S& U+ p- ^8 hnetwork_vlan_ranges 中的 VLAN ID 必须和物理交换机上的 VLAN ID 区间一致。8 Y/ W6 \" Z  h
bridge_mappings 中所指定的 bridge 需要和在个节点上手工创建的 OVS bridge 一致。
3 ^6 }2 D' M9 K: e' m* U然后重启相应的 Neutron 服务。
/ Y$ v4 `6 l0 K/ }2.2.2 配置生效过程3 N/ ^4 j. M4 A/ C2 A3 @2 n
当 Neutron L2 Agent (OVS Agent 或者 Linux Bridge agent)在计算和网络节点上启动时,它会根据各种配置在节点上创建各种 bridge。以 OVS Agent 为例,
: C; a& @6 n( c- |3 S(1)创建 intergration brige(默认是 br-int);如果 enable_tunneling = true 的话,创建 tunnel bridge (默认是 br-tun)。) [% E  ^6 R4 \( ?( V. L. p7 X3 X
(2)根据 bridge_mappings,配置每一个 VLAN 和 Flat 网络使用的 physical network interface 对应的预先创建的 OVS bridge。
7 M  r$ D" R% T6 H. ?* l) \(3)所有虚机的 VIF 都是连接到 integration bridge。同一个虚拟网络上的 VM VIF 共享一个本地 VLAN (local VLAN)。Local VLAN ID 被映射到虚拟网络对应的物理网络的 segmentation_id。  a( D" ~9 j* n: L7 P: _2 ]; T
(4)对于 GRE 类型的虚拟网络,使用 LSI (Logical Switch identifier)来区分隧道(tunnel)内的租户网络流量(tenant traffic)。这个隧道的两端都是每个物理服务器上的 tunneling bridge。使用 Patch port 来将 br-int 和 br-tun 连接起来。
5 C7 T6 x  t$ k$ Z7 L: ~% Z& n(5)对于每一个 VLAN 或者 Flat 类型的网络,使用一个 veth 或者一个 patch port 对来连接 br-int 和物理网桥,以及增加 flow rules等。
% ]8 d' c' I) n(6)最后,Neutron L2 Agent 启动后会运行一个RPC循环任务来处理 端口添加、删除和修改。管理员可以通过配置项 polling_interval 指定该 RPC 循环任务的执行间隔,默认为2秒。
0 S& `- X: h( V( m) [4 f2.3 创建虚拟网络和子网
. t: d  z6 |) Z4 A1 G5 [2.3.1 创建命令
( q# N! z6 J$ ?& m, T0 Is1@controller:~$ neutron net-create net1 (或者 Admin 用户运行 neutron net-create net1 --provider:network_type vlan --provider:physical_network physnet1 --provider:segmentation_id 101。效果相同). W3 ?) \/ o% V& D- G' N8 ^
Created a new network:  Q/ W7 ^7 ?6 \
+---------------------------+--------------------------------------+6 J; A# w/ p7 V$ c9 I% U, ~3 @6 [
| Field                     | Value                                |& v; ^- @/ V$ ]+ M
+---------------------------+--------------------------------------+# G( P- z( s$ f3 v' `1 J) Y* E
| admin_state_up            | True                                 |
0 L: \& Y4 {4 F+ w3 h/ P| id                        | dfc74f44-a9f2-4497-a53d-1723804a49a8 |
# }* s& a) ?2 c- v# p3 m| name                      | net1                                  |
2 `, }; x9 u  r7 N- O: }| provider:network_type     | vlan                                 |# a- o, D3 i* ]0 r& [. q- }
| provider:physical_network | physnet1                             |2 V' ~- S& ?; @2 [) V, F
| provider:segmentation_id  | 101                                  |
2 ~) `( f1 `' G% V9 b3 \| router:external           | False                                |
+ k  N7 L$ z; x- Y8 A' D9 B7 B| shared                    | False                                |8 I; M' Q4 J% g" `3 W# C3 j
| status                    | ACTIVE                               |
  E" x& O% w! T$ R| subnets                   |                                      |& t4 G% q6 `# G9 w. Y2 I
| tenant_id                 | 74c8ada23a3449f888d9e19b76d13aab     |
& @8 [/ p) P# @+---------------------------+--------------------------------------+   
, e  i9 F2 {: a$ F' b8 Ds1@controller:~$ neutron subnet-create subnet1 10.0.0.0/24 --name net1
  q" e0 f2 R& ?' u* `0 s
( f, b0 {. d" s+ q2.3.2 Neutron 代码实现
, B: |3 j  v- i2 u4 {1 d2 [$ x做完以上的步骤之后,用户就可以在 subnet 上 boot 虚机了。) t1 e/ T$ |' B
boot 虚机的过程中,Nova 依次会:
+ }( v$ E1 P7 @3 D  O0 G5 F(1)调用 Neutron REST API 申请一个或者多个 port。Neutron 会根据数据库中的配置来进行分配。* Z. C2 ^! ^  e5 b+ [, P
(2)在计算节点上,Nova 调用 ovs-vsctl 命令将虚机的 VIF 被 plug 到 br-int 上。* z. l6 ]# c, z3 c0 R' p4 g
(3)启动虚机。/ {' A; w- P* K' l
Neutron L2 Agent 的循环任务每隔两秒会依次:
" J4 D7 g( q7 p. {(1)调用 ”ovs-vsctl list-ports“ 命令获取到 br-int 上的 port,再根据上次保存的历史数据,生成所有变更端口的列表(包括添加的、更新的、删除的端口)。比如:4 {3 r/ S: v( A: {- k9 {8 B
{'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'])}0 N+ u2 I( A) R4 W& g9 U
1; z, z5 K% a. Y, A) y  _
(2)为每一个待处理端口,根据其 ID 从 DB 中取得其详细信息。比如:  h8 _( H; S5 J1 S% v; O, I, `
{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'}9 j/ A; F" I+ u" v3 J
1
2 {8 i$ H$ g4 K3 p; t( B& X(3)针对每一个增加或者变更的 port,设置 local VLAN Tag;调用 ”ovs-ofctl mod-flows “ 命令来设置 br-tun 或者 物理 bridge 的 flow rules;并设置 db 中其状态为 up。
0 `& w  [1 g$ R* n(4)针对每一个被删除的 port,设置 db 中其状态为 down。
1 H6 E' A! a" Z9 t; U2 K4 z2 @2 a2.4 Neutron 虚拟网络  C7 f0 o( k: g
(1)一个计算节点上的网络实例1 G. \  F1 E9 g. X) T  t
它反映的网络配置如下:
$ P0 f  N/ Z/ E' TNeutron 使用 Open vSiwtch。
; F5 O1 c% F4 P) G一台物理服务器,网卡 eth1 接入物理交换机,预先配置了网桥 br-eth1。- m$ z% a. n2 |
创建了两个 neutron VLAN network,分别使用 VLAN ID 101 和 102。  x6 B- [* H! K1 }1 N5 q! L
该服务器上运行三个虚机,虚机1 和 2 分别有一个网卡接入 network 1;虚机2 和 3 分别有一个网卡接入 network 2.
3 S7 @% g  _  v' ]5 v3 {; I: [8 h, x7 W. b# Q  [
Neutron 在该计算节点上做的事情:: d  l  W$ B7 [8 a! y
创建了 OVS Integration bridge br-int。它的四个 Access 端口中,两个打上了内部 Tag 1,连接接入 network 1 的两个网卡;另两个端口的 VLAN Tag 为 2。
" _/ w; k( R2 B9 F1 B创建了一对 patch port,连接 br-int 和 br-eth1。
& t9 W* i8 }- h9 w  I, ]2 V' z设置 br-int 中的 flow rules。对从 access ports 进入的数据帧,加上相应的 VLAN Tag,转发到 patch port;从 patch port 进入的数据帧,将 VLAN ID 101 修改为 1, 102 修改为 2,再转发到相应的 Access ports。  X) z4 W. {" ~( Z
设置 br-eth1 中的 flow rules。从 patch port 进入的数据帧,将内部 VLAN ID 1 修改为 101,内部 VLAN ID 2 修改为 102,再从 eth1 端口发出。对从 eth1 进入的数据帧做相反的处理。$ Y2 U1 q( F3 _3 M2 f0 k( Y
(2)再加上另一个连接到同一个物理交换机的服务器(加上 neutron 网络使用的 VLAN ID 为 100,物理 brige 为 br-eth0):$ i: Y1 ^4 i  }& w( S* G+ h

3 A; \1 E. R+ v3 g4 [Neutron 实现了基于物理 VLAN 交换机的跨物理服务器二层虚拟网络。
: c8 s5 {$ `, E) H4 b5 f(3)连接到同一物理交换机的网络节点的情况
. k3 r( h6 X7 @9 }/ \  v0 U  D" c( @8 v- e7 M" Z
(4)网络流向
( I( r! Y. b) c. r不同物理服务器上的虚机,如果 VM1 和 VM2 属于同一个 tenant network 的同一个subnet,那么两者的通信直接经过 物理交换机 进行,不需要做到网络节点。如图10 所示。
* B$ V9 M" B1 t) `) E相同物理服务器上的虚机,如果 VM1 和 VM2 属于同一个 tenant network 的同一个subnet,那么两者的通信直接经过 br-int 进行。
" K# ^; e( x$ w: P) O- H5 {% r* J0 B  p1 `( S
对其他虚机之间数据交换情形,都算作跨子网的数据流向,都需要经过网络节点中的 Router 进行 IP 包的路由。(也可以直接使用连接物理交换机的物理路由器)。
1 K8 P7 W( e, g/ ^7 {9 m5 D$ q
( a* w4 }6 J7 _8 b! @% Q0 l
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-12 02:06 , Processed in 0.033660 second(s), 23 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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