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

使用 Open vSwitch (OVS)+ VLAN 组网

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2021-10-8 15:50:46 | 显示全部楼层 |阅读模式
Neutron 基于 VLAN 模式的 tenant network 同 provider network 一样,都必须使用物理的 VLAN 网络。
1 x8 q6 _1 E% Y. F* \) t) [2.1 物理 VLAN 网络配置, U) S% u5 x' h3 D/ f4 s7 D# |
本例子中,交换机上划分了三个 VLAN 区域:
6 q6 D: H' \. e! e管理网络,用于 OpenStack 节点之间的通信,假设 VLAN ID 范围为 50 - 99.
2 J; Y4 C& `( X+ ?6 s$ O数据网络,用于虚拟机之间的通讯。由于Vlan模式下,租户建立的网络都具有独立的 Vlan ID,故需要将连接虚机的服务器的交换机端口设置为 Trunk 模式,并且设置所允许的 VLAN ID 范围,比如 100~300。3 k# v- z, l4 O" V0 D6 l# G
外部网络,用于连接外部网络。加上 VLAN ID 范围为 1000-1010。9 W7 \2 s, [* A6 z

: O0 t5 @2 e; a关于网段之间的路由:
1 l- a6 Q# j( Y0 Q% `3 [如果该物理交换机接到一个物理路由器并做相应的配置,则数据网络可以使用这个物理路由器,而不需要使用 Neutron 的虚拟路由器。
8 Y  Y. Q2 ~* f0 V! M# e! ]$ y如果不使用物理的路由器,可以在网络节点上配置虚拟路由器。
6 T, E  u. M# l% M! I1 b2.2 Neutron 配置
- T4 [/ a9 Z, {( o1 k2.2.1 配置进行
% s; f- Z- O; n% p3 R7 t" @控制节点上:
4 B: x! F! e+ M2 Q# vim /etc/neutron/plugins/ml2/ml2_conf.ini
5 v; v6 v  [0 \. D) D7 R[ml2]
% t; t6 \% U. H1 H- }type_drivers = flat,vlan ! l5 G8 E: c  y# _/ d: g8 X6 W
tenant_network_types = vlan. v- B) @  l1 }1 ~6 R6 w
mechanism_drivers = openvswitch
) {7 L2 l; D. c9 Q4 F[ml2_type_flat]/ g5 q7 P8 o% h; \
flat_networks = external
# j5 _& U+ n7 j7 ~) J4 T[ml2_type_vlan] 3 X# m  J5 v( h3 |. w. ~3 a
network_vlan_ranges = physnet1:100:300, e; g5 u9 C/ U% l/ I

2 t" m, x  ]% L1 N* L2 L" g  V网络节点上:
# L2 u" P2 w0 d7 m; A#为连接物理交换机的网卡 eth2 和 eth3 建立 OVS physical bridge,其中,eth2 用于数据网络,eth3 用于外部网络
) j! d* x3 _. qovs-vsctl add-br br-eth23 }( z6 G7 i. {  d* w
ovs-vsctl add-br br-ex
3 y: p6 G* p( ?: s1 f" I5 Kovs-vsctl add-port br-eth2 eth2
0 \; D0 J- w, O1 bovs-vsctl add-port br-ex eth3" z: _  o% e1 U$ D& \
# vim /etc/neutron/plugins/ml2/ml2_conf.ini % n" Q2 Y& R" @0 D
[m12]
6 X( H" f0 s0 {+ ~9 r  gtype_drivers = flat,vlan
: F; {3 L2 I; E7 Etenant_network_types = vlan* |% x. Q% o! k3 O/ \
mechanism_drivers = openvswitch# @' x. R, t/ v0 o$ ]7 G) D( r
[ml2_type_flat]4 ~. S$ `: c$ l; I: s
flat_networks = external
) H1 D$ _* ^( ]/ N[ml2_type_vlan]
( `2 y. z% _3 q# c, _# A) ?& o/ wnetwork_vlan_ranges = physnet1:100:300,external:1000:1010
1 M4 ~, X0 c  i8 y[ovs] " }2 h9 S: S( l9 }
bridge_mappings = physnet1:br-eth2,external:br-ex
! r6 o% }: L2 s4 d( J/ G5 J9 g& h' K, P  ~; O$ f
计算节点上:
' E6 j6 l' [2 C9 ?#为连接物理交换机的网卡 eth2 建立 OVS physical bridge
# }: L- S0 u3 S* D) \ovs-vsctl add-br br-eth2* F9 \) L1 N* Q$ R$ e% X' }% N
ovs-vsctl add-port br-eth2 eth23 d; |% q! T( \8 E! A9 m
# vim /etc/neutron/plugins/ml2/ml2_conf.ini
, e' q$ L1 t7 v: ^3 W7 Z2 c' D  P$ S[m12]8 }+ k; f8 r0 j3 v* t& y, s. P( s3 L
type_drivers = vlan
( Z/ [. h* W- Z2 P1 d. d& W( A$ `tenant_network_types = vlan
- x: Q# b& X( b( Smechanism_drivers = openvswitch
/ _5 p% n' Q% {$ ][ml2_type_vlan]
, ~8 B4 M* i$ ~6 z1 a+ `network_vlan_ranges = physnet1:100:300 " l: F. h( r* K/ a4 P7 |- P
[ovs] 0 j# ^3 L1 D& @# |) J# D/ O
bridge_mappings = physnet1:br-eth24 ^7 K# Z2 T" z/ D/ D

% z- h& n+ J3 c) s9 K4 A注意:& f2 z4 c; ~' L' R7 e9 R4 f; Z
network_vlan_ranges 中的 VLAN ID 必须和物理交换机上的 VLAN ID 区间一致。
- H- l- ~6 Z! y4 L) b* C1 M8 K) ^bridge_mappings 中所指定的 bridge 需要和在个节点上手工创建的 OVS bridge 一致。1 O- v: E" G& ?1 n' G8 o
然后重启相应的 Neutron 服务。# o, }+ g* w" Y5 ?& ~6 T
2.2.2 配置生效过程
8 V1 m4 x9 g; }3 @; N当 Neutron L2 Agent (OVS Agent 或者 Linux Bridge agent)在计算和网络节点上启动时,它会根据各种配置在节点上创建各种 bridge。以 OVS Agent 为例,
1 \" c  [9 r  |- \! t9 U2 Y8 s+ S(1)创建 intergration brige(默认是 br-int);如果 enable_tunneling = true 的话,创建 tunnel bridge (默认是 br-tun)。
% j2 @: p) g2 j$ V; s6 s(2)根据 bridge_mappings,配置每一个 VLAN 和 Flat 网络使用的 physical network interface 对应的预先创建的 OVS bridge。: S4 t! p+ S2 v' X: _
(3)所有虚机的 VIF 都是连接到 integration bridge。同一个虚拟网络上的 VM VIF 共享一个本地 VLAN (local VLAN)。Local VLAN ID 被映射到虚拟网络对应的物理网络的 segmentation_id。
2 Q! Q% R  |8 \7 L0 y3 ?8 R& U(4)对于 GRE 类型的虚拟网络,使用 LSI (Logical Switch identifier)来区分隧道(tunnel)内的租户网络流量(tenant traffic)。这个隧道的两端都是每个物理服务器上的 tunneling bridge。使用 Patch port 来将 br-int 和 br-tun 连接起来。
3 R* ?: f1 V  ~- C' U4 ?(5)对于每一个 VLAN 或者 Flat 类型的网络,使用一个 veth 或者一个 patch port 对来连接 br-int 和物理网桥,以及增加 flow rules等。1 G- [" h2 B6 X- m: X* K7 n" L' M
(6)最后,Neutron L2 Agent 启动后会运行一个RPC循环任务来处理 端口添加、删除和修改。管理员可以通过配置项 polling_interval 指定该 RPC 循环任务的执行间隔,默认为2秒。
# _4 I7 b( W5 O) a2.3 创建虚拟网络和子网
( @  _9 G6 i/ f: Z8 y2.3.1 创建命令
" @5 w! I, ~/ T3 Q2 e% us1@controller:~$ neutron net-create net1 (或者 Admin 用户运行 neutron net-create net1 --provider:network_type vlan --provider:physical_network physnet1 --provider:segmentation_id 101。效果相同)7 A! o3 Z6 s( ^) J" X
Created a new network:. G9 u, s1 I/ V/ {" N5 l
+---------------------------+--------------------------------------+
: W! s5 r: L4 L| Field                     | Value                                |
/ F6 r) N2 a4 R2 b- w" K+ X$ ?+---------------------------+--------------------------------------+7 H. p5 {8 @5 B$ F. _  _1 I3 `
| admin_state_up            | True                                 |1 g* E- `3 t0 r! t4 b3 m% b: Y
| id                        | dfc74f44-a9f2-4497-a53d-1723804a49a8 |2 O8 B% L/ B) _) t6 q' t. X
| name                      | net1                                  |; \6 Z; H$ [, _/ j  _7 W
| provider:network_type     | vlan                                 |  Y( y! P5 @4 c, D2 h
| provider:physical_network | physnet1                             |$ \+ Y* l0 p! k* A9 z
| provider:segmentation_id  | 101                                  |* O, N; _& j" U1 G4 @
| router:external           | False                                |
& o! M( N: J0 J| shared                    | False                                |) j# q& ?8 ^6 O& K
| status                    | ACTIVE                               |+ F+ E/ s0 Y3 q
| subnets                   |                                      |
$ S$ Z% ~2 w* d( e& y/ k1 p2 H| tenant_id                 | 74c8ada23a3449f888d9e19b76d13aab     |+ _( a. O/ {1 Z5 f0 o
+---------------------------+--------------------------------------+   2 s% T% w% o# l
s1@controller:~$ neutron subnet-create subnet1 10.0.0.0/24 --name net1
" j2 K9 ]! w, z" ^  p- g$ r+ S! J4 G
2.3.2 Neutron 代码实现
8 G. r; j7 m0 q% f! V做完以上的步骤之后,用户就可以在 subnet 上 boot 虚机了。
$ V9 \0 T, ?2 O! ]& qboot 虚机的过程中,Nova 依次会:
; v; T) h0 i- H(1)调用 Neutron REST API 申请一个或者多个 port。Neutron 会根据数据库中的配置来进行分配。
5 j0 I6 q! }* ?% E% p. j0 e; x8 t1 A(2)在计算节点上,Nova 调用 ovs-vsctl 命令将虚机的 VIF 被 plug 到 br-int 上。
- t# t8 z0 ~- y) V(3)启动虚机。
- w- X% Q2 u* I# l4 ~9 X$ ENeutron L2 Agent 的循环任务每隔两秒会依次:
2 |7 W. [% K0 ?1 \4 F: ]( _* H2 L(1)调用 ”ovs-vsctl list-ports“ 命令获取到 br-int 上的 port,再根据上次保存的历史数据,生成所有变更端口的列表(包括添加的、更新的、删除的端口)。比如:
$ s4 s- m( q, Q5 q: i5 D  e# 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'])}
2 ]2 O* S4 q. r1 w6 a& B* u10 x- C# W% [" U/ \. z( P
(2)为每一个待处理端口,根据其 ID 从 DB 中取得其详细信息。比如:
2 Y3 `( r  d1 c. [8 Q6 f{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'}
+ F0 I! h1 S% R3 T% ?% l$ o6 n15 G! C& [9 l/ e8 u7 M$ w$ j
(3)针对每一个增加或者变更的 port,设置 local VLAN Tag;调用 ”ovs-ofctl mod-flows “ 命令来设置 br-tun 或者 物理 bridge 的 flow rules;并设置 db 中其状态为 up。
, u; a: A2 v1 S5 \% I7 }6 y7 o4 Z(4)针对每一个被删除的 port,设置 db 中其状态为 down。5 R, r: r% G& H# d6 y5 w; J5 y
2.4 Neutron 虚拟网络" @2 n$ E2 D% ^  s9 H
(1)一个计算节点上的网络实例
; F+ T) ]1 I# N3 M1 p1 [- k$ _它反映的网络配置如下:
% O4 o4 }) c4 `% S- P2 p3 a$ V, s  zNeutron 使用 Open vSiwtch。
- `& a5 m1 c, J$ }( C0 g! [一台物理服务器,网卡 eth1 接入物理交换机,预先配置了网桥 br-eth1。' X# L/ Y' E/ H) X* B+ h" Y) Y
创建了两个 neutron VLAN network,分别使用 VLAN ID 101 和 102。
0 F- C1 L/ B) C该服务器上运行三个虚机,虚机1 和 2 分别有一个网卡接入 network 1;虚机2 和 3 分别有一个网卡接入 network 2.$ I3 D" Q# U, d3 ~9 ~/ V
, r) j- r8 E; J9 F. U& u3 q
Neutron 在该计算节点上做的事情:
( X4 ~5 K; w/ N# m创建了 OVS Integration bridge br-int。它的四个 Access 端口中,两个打上了内部 Tag 1,连接接入 network 1 的两个网卡;另两个端口的 VLAN Tag 为 2。7 G$ `- M$ ?9 s" z9 V
创建了一对 patch port,连接 br-int 和 br-eth1。0 f# \0 r! E! ?& J& Z. a, E2 ^
设置 br-int 中的 flow rules。对从 access ports 进入的数据帧,加上相应的 VLAN Tag,转发到 patch port;从 patch port 进入的数据帧,将 VLAN ID 101 修改为 1, 102 修改为 2,再转发到相应的 Access ports。
& i( r) B8 I- r3 z, h% P设置 br-eth1 中的 flow rules。从 patch port 进入的数据帧,将内部 VLAN ID 1 修改为 101,内部 VLAN ID 2 修改为 102,再从 eth1 端口发出。对从 eth1 进入的数据帧做相反的处理。
1 M3 [2 }& J$ C: V(2)再加上另一个连接到同一个物理交换机的服务器(加上 neutron 网络使用的 VLAN ID 为 100,物理 brige 为 br-eth0):
. W" k, Z+ \" y" ~: n8 z6 c
. U* T7 v9 `1 ?6 ~1 b- gNeutron 实现了基于物理 VLAN 交换机的跨物理服务器二层虚拟网络。7 l0 F) ]( l6 Y3 ^$ ]* l5 \+ L+ A
(3)连接到同一物理交换机的网络节点的情况
0 j8 l: P- b. h% o+ X' |% x/ X9 s; |. u# {6 C, W3 ~# `
(4)网络流向
5 d5 B  ?! P6 ]2 X# \不同物理服务器上的虚机,如果 VM1 和 VM2 属于同一个 tenant network 的同一个subnet,那么两者的通信直接经过 物理交换机 进行,不需要做到网络节点。如图10 所示。
/ X1 u  L' F( R# V5 S相同物理服务器上的虚机,如果 VM1 和 VM2 属于同一个 tenant network 的同一个subnet,那么两者的通信直接经过 br-int 进行。
# S3 o1 y# g# a( s* B% }. B5 a6 z3 K7 K9 v; N4 Q" z
对其他虚机之间数据交换情形,都算作跨子网的数据流向,都需要经过网络节点中的 Router 进行 IP 包的路由。(也可以直接使用连接物理交换机的物理路由器)。
9 _* B1 G  ^( ?* @$ [, g2 E
  @! {( D! B. M
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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