易陆发现互联网技术论坛

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

使用 Open vSwitch (OVS)+ VLAN 组网

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

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

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

x
Neutron 基于 VLAN 模式的 tenant network 同 provider network 一样,都必须使用物理的 VLAN 网络。
! X! j! a- c$ t. j! o' y) p+ W2.1 物理 VLAN 网络配置, _9 u( W/ X( w6 N+ S# _( I
本例子中,交换机上划分了三个 VLAN 区域:
5 \0 ^! [+ J: I* H管理网络,用于 openstack 节点之间的通信,假设 VLAN ID 范围为 50 - 99.
# P# D% z% V' K. e9 g: u( _数据网络,用于虚拟机之间的通讯。由于Vlan模式下,租户建立的网络都具有独立的 Vlan ID,故需要将连接虚机的服务器的交换机端口设置为 Trunk 模式,并且设置所允许的 VLAN ID 范围,比如 100~300。
# O) Z1 K% e9 W外部网络,用于连接外部网络。加上 VLAN ID 范围为 1000-1010。! S0 L3 {/ o& }$ ~
2 i8 h" S' D9 X7 I6 u
关于网段之间的路由:: h/ g* R' O+ D: x& X+ l% ^
如果该物理交换机接到一个物理路由器并做相应的配置,则数据网络可以使用这个物理路由器,而不需要使用 Neutron 的虚拟路由器。# |; p; T- `# ]% ^. l
如果不使用物理的路由器,可以在网络节点上配置虚拟路由器。0 Y7 p* M. F4 Y3 T: @6 B
2.2 Neutron 配置! Q$ b$ x2 a/ u- V
2.2.1 配置进行' I9 a& ~- H/ H+ w% H
控制节点上:  n2 L5 _5 {  D7 W
# vim /etc/neutron/plugins/ml2/ml2_conf.ini, H* B# i+ E4 n: E* P+ q& A
[ml2] 6 @' d- `! [% x& |) M& z0 S- _
type_drivers = flat,vlan 7 d% S5 b2 w) t
tenant_network_types = vlan8 b# p0 p# ?$ ~3 y
mechanism_drivers = openvswitch
7 o" S! g! z6 l4 Y* w' B4 s[ml2_type_flat]
+ M; D. v6 X1 i' [flat_networks = external
) [: `/ y3 y* a! s# o" R1 L) k[ml2_type_vlan]
# Q9 m- W/ _" n1 c& q- `! anetwork_vlan_ranges = physnet1:100:300
% Y* ^* z$ i' S! |) r/ i  G% I  U; ^3 b8 A3 H$ k
网络节点上:- _5 \$ {. H( v1 I$ }
#为连接物理交换机的网卡 eth2 和 eth3 建立 OVS physical bridge,其中,eth2 用于数据网络,eth3 用于外部网络! Y1 h/ ]) z) J% b( h: n. I
ovs-vsctl add-br br-eth24 ^9 D9 n4 b% k( d5 {
ovs-vsctl add-br br-ex9 Z7 _7 z2 a, m: y
ovs-vsctl add-port br-eth2 eth2
% @9 f, I1 u8 i( N, a" Eovs-vsctl add-port br-ex eth3
! b( u. B8 K, w/ B# vim /etc/neutron/plugins/ml2/ml2_conf.ini
. B* H$ n" f. y( f" b[m12]
) `' z& j/ n; J3 jtype_drivers = flat,vlan
1 s4 C- |+ U; _% b+ J( ytenant_network_types = vlan# p8 K' Z1 Z/ w4 R% a0 c* C
mechanism_drivers = openvswitch. A* S9 }$ g' N/ z$ D
[ml2_type_flat]
$ I( B& F" [: A+ J/ r5 }7 ?flat_networks = external' O) o( X) p! s) I2 r( L6 w" g
[ml2_type_vlan] . o4 I0 e2 L2 ]3 o) E& }( w
network_vlan_ranges = physnet1:100:300,external:1000:1010 , f+ C6 p1 K; R: \' a) w: K8 }
[ovs] 4 C, ~3 s5 o  P( ~7 [. @
bridge_mappings = physnet1:br-eth2,external:br-ex- F- ]& I, e% j* C$ E

! n: W7 M9 Q3 L( ^% i计算节点上:7 D5 t: C$ @# R4 ]9 `% C
#为连接物理交换机的网卡 eth2 建立 OVS physical bridge1 A2 G1 P9 O) k5 S) B
ovs-vsctl add-br br-eth2
( H6 T, V, `* \; [: movs-vsctl add-port br-eth2 eth2# @( C" R" \: p
# vim /etc/neutron/plugins/ml2/ml2_conf.ini
  F% V7 B3 b2 C* V$ D0 Y[m12]
- U( k( I9 a& l' s  Y! W# S% l' ntype_drivers = vlan
( _6 O9 p) B3 ?) Wtenant_network_types = vlan
1 G9 ]( r0 T* Smechanism_drivers = openvswitch7 ^5 C3 v. i; B
[ml2_type_vlan]
4 m" K3 p, F# [, ~1 ?  `4 k% l, Anetwork_vlan_ranges = physnet1:100:300 . s- i8 k) M: Y1 B
[ovs]
* c% p. P6 Z8 q% o! ^bridge_mappings = physnet1:br-eth2
& N( o- u2 V* k# X) P6 ~0 ?# b( E+ C1 F( T9 F7 q2 Z  @
注意:6 C5 v( L$ D7 c3 p6 Y$ |
network_vlan_ranges 中的 VLAN ID 必须和物理交换机上的 VLAN ID 区间一致。8 `) P) q$ u) w$ v4 I9 a4 S) n) s
bridge_mappings 中所指定的 bridge 需要和在个节点上手工创建的 OVS bridge 一致。
+ K! A8 Z# B6 y/ J! N, w9 p然后重启相应的 Neutron 服务。
6 t2 {; @- Z5 k8 G2.2.2 配置生效过程& O. y7 n! ?! m6 k2 X) a( J/ `
当 Neutron L2 Agent (OVS Agent 或者 Linux Bridge agent)在计算和网络节点上启动时,它会根据各种配置在节点上创建各种 bridge。以 OVS Agent 为例,
: W. y" a3 k6 H# ](1)创建 intergration brige(默认是 br-int);如果 enable_tunneling = true 的话,创建 tunnel bridge (默认是 br-tun)。0 y8 b" D$ I0 z+ Q
(2)根据 bridge_mappings,配置每一个 VLAN 和 Flat 网络使用的 physical network interface 对应的预先创建的 OVS bridge。7 l- G' g3 l( }  k" _+ X. D  Z
(3)所有虚机的 VIF 都是连接到 integration bridge。同一个虚拟网络上的 VM VIF 共享一个本地 VLAN (local VLAN)。Local VLAN ID 被映射到虚拟网络对应的物理网络的 segmentation_id。$ K# D+ X. V. j% R; j4 y5 n$ l7 s
(4)对于 GRE 类型的虚拟网络,使用 LSI (Logical Switch identifier)来区分隧道(tunnel)内的租户网络流量(tenant traffic)。这个隧道的两端都是每个物理服务器上的 tunneling bridge。使用 Patch port 来将 br-int 和 br-tun 连接起来。
9 d. R7 R9 c3 i) T+ e(5)对于每一个 VLAN 或者 Flat 类型的网络,使用一个 veth 或者一个 patch port 对来连接 br-int 和物理网桥,以及增加 flow rules等。& G5 J3 Z: C( g( s
(6)最后,Neutron L2 Agent 启动后会运行一个RPC循环任务来处理 端口添加、删除和修改。管理员可以通过配置项 polling_interval 指定该 RPC 循环任务的执行间隔,默认为2秒。
  ^  C  ^5 O" r' R2 K2.3 创建虚拟网络和子网0 G7 o% q( x7 p0 o# d1 N9 c! z
2.3.1 创建命令
$ i# P" E! s2 o% Rs1@controller:~$ neutron net-create net1 (或者 Admin 用户运行 neutron net-create net1 --provider:network_type vlan --provider:physical_network physnet1 --provider:segmentation_id 101。效果相同)
3 I" `# \- {4 G: t$ w, u# tCreated a new network:
& b, k, p1 q* m" J* b2 K8 x$ F: o+---------------------------+--------------------------------------+2 |# y/ k! F/ T. w# S4 r* S
| Field                     | Value                                |
  z2 F/ q' t' r6 @+---------------------------+--------------------------------------+1 z0 c8 D% J' `2 ~4 ]% Z$ E) a
| admin_state_up            | True                                 |
5 x" m, m, @, O; B& w6 q4 N9 ]| id                        | dfc74f44-a9f2-4497-a53d-1723804a49a8 |
& ]: q' n9 c: K5 _| name                      | net1                                  |& x7 p3 i$ n( y" j# f
| provider:network_type     | vlan                                 |5 a: f! j6 _- V! r& p3 j
| provider:physical_network | physnet1                             |0 N: ?% b) @- t4 o- Z
| provider:segmentation_id  | 101                                  |
; Y4 M5 r; w8 U7 a; ?/ H| router:external           | False                                |
% ~, v% U. r( V: `2 o| shared                    | False                                |
( G3 z2 w* j% d  f: G1 S; q| status                    | ACTIVE                               |3 h4 G; E' ^+ m8 n3 O8 x
| subnets                   |                                      |, w/ L6 l) `8 C
| tenant_id                 | 74c8ada23a3449f888d9e19b76d13aab     |3 p9 B+ R' S( t. `# a1 q% z
+---------------------------+--------------------------------------+   * K* t) [/ U1 b+ C
s1@controller:~$ neutron subnet-create subnet1 10.0.0.0/24 --name net1$ t, q2 S+ m- {# f0 t0 V2 z9 ?" o
4 o0 d3 Y9 \9 A
2.3.2 Neutron 代码实现# O+ ]) H# ~+ s7 U0 g
做完以上的步骤之后,用户就可以在 subnet 上 boot 虚机了。
7 j4 c% s" G. F, X! g, G5 c! w# Pboot 虚机的过程中,Nova 依次会:& w& w/ c' l6 {& `( i1 b% s
(1)调用 Neutron REST API 申请一个或者多个 port。Neutron 会根据数据库中的配置来进行分配。1 K. u2 r1 X5 F& f, U6 B# F
(2)在计算节点上,Nova 调用 ovs-vsctl 命令将虚机的 VIF 被 plug 到 br-int 上。" t0 C7 l& c; U
(3)启动虚机。/ @% v- p6 K# l5 o+ i1 y
Neutron L2 Agent 的循环任务每隔两秒会依次:  I, _' [; o8 U% x3 R5 |
(1)调用 ”ovs-vsctl list-ports“ 命令获取到 br-int 上的 port,再根据上次保存的历史数据,生成所有变更端口的列表(包括添加的、更新的、删除的端口)。比如:
5 K" s  c" C, Y! z5 Q" O" m& h0 U{'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'])}5 c' t0 Y1 |. f5 d! U% R* t
1
' o  e2 u' h) q) Q% q; `, u$ _: T$ S(2)为每一个待处理端口,根据其 ID 从 DB 中取得其详细信息。比如:
) |1 t( j$ i- R/ }' s3 }{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'}) `2 \$ Z* @) l
1
- P8 v' K% X# K(3)针对每一个增加或者变更的 port,设置 local VLAN Tag;调用 ”ovs-ofctl mod-flows “ 命令来设置 br-tun 或者 物理 bridge 的 flow rules;并设置 db 中其状态为 up。" N; [  s0 B: E+ \( |
(4)针对每一个被删除的 port,设置 db 中其状态为 down。$ }( g- K: N5 ^: }. z4 ^7 g" o
2.4 Neutron 虚拟网络
' w6 r) v( e2 Q& k7 X1 t(1)一个计算节点上的网络实例
! ^( p7 ?; y# u( A$ ~5 X- w8 L它反映的网络配置如下:) l1 c( M- h0 k+ d2 q5 n# P2 K4 B
Neutron 使用 Open vSiwtch。
" _7 I# X- I' Q; W0 w- @! J一台物理服务器,网卡 eth1 接入物理交换机,预先配置了网桥 br-eth1。
* t+ Y3 C$ m7 s" X# D# e' U创建了两个 neutron VLAN network,分别使用 VLAN ID 101 和 102。
1 c4 I7 W3 I' x( L8 d该服务器上运行三个虚机,虚机1 和 2 分别有一个网卡接入 network 1;虚机2 和 3 分别有一个网卡接入 network 2.$ @' [4 s# v- o  S8 P

8 j# b# w! ~0 }/ |$ v4 H6 ]Neutron 在该计算节点上做的事情:
/ C0 u% K6 @* u  `6 m- g创建了 OVS Integration bridge br-int。它的四个 Access 端口中,两个打上了内部 Tag 1,连接接入 network 1 的两个网卡;另两个端口的 VLAN Tag 为 2。0 c$ J" C9 l9 ]
创建了一对 patch port,连接 br-int 和 br-eth1。
3 T  z/ D, B4 F" R设置 br-int 中的 flow rules。对从 access ports 进入的数据帧,加上相应的 VLAN Tag,转发到 patch port;从 patch port 进入的数据帧,将 VLAN ID 101 修改为 1, 102 修改为 2,再转发到相应的 Access ports。
/ e. r) q" a- B+ t( t, |* Q5 _3 ]设置 br-eth1 中的 flow rules。从 patch port 进入的数据帧,将内部 VLAN ID 1 修改为 101,内部 VLAN ID 2 修改为 102,再从 eth1 端口发出。对从 eth1 进入的数据帧做相反的处理。/ {2 \8 H  |8 {3 y
(2)再加上另一个连接到同一个物理交换机的服务器(加上 neutron 网络使用的 VLAN ID 为 100,物理 brige 为 br-eth0):
) y: t; C* s; L7 [2 a/ `+ o
1 c/ t; J1 ]8 m1 WNeutron 实现了基于物理 VLAN 交换机的跨物理服务器二层虚拟网络。
1 t1 s; `7 u4 X9 U$ I(3)连接到同一物理交换机的网络节点的情况9 P  i0 x$ U0 j/ g& h5 |/ V
% i( k4 G7 R/ K, Q# d
(4)网络流向
0 u0 F* S$ J' p. K- g- x( C不同物理服务器上的虚机,如果 VM1 和 VM2 属于同一个 tenant network 的同一个subnet,那么两者的通信直接经过 物理交换机 进行,不需要做到网络节点。如图10 所示。
1 T( o1 q1 |0 P相同物理服务器上的虚机,如果 VM1 和 VM2 属于同一个 tenant network 的同一个subnet,那么两者的通信直接经过 br-int 进行。
3 [4 L9 s' ^8 m0 L
$ I/ J8 U6 r% i0 x$ N0 }对其他虚机之间数据交换情形,都算作跨子网的数据流向,都需要经过网络节点中的 Router 进行 IP 包的路由。(也可以直接使用连接物理交换机的物理路由器)。# D8 p5 t& U4 ]: c) l2 ^

. X( @) D1 _5 Z$ w- g) |+ ]) l
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

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

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

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

GMT+8, 2026-4-8 21:20 , Processed in 0.047650 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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