将设为首页浏览此站
开启辅助访问 天气与日历 收藏本站联系我们切换到窄版

易陆发现论坛

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

使用 Open vSwitch (OVS)+ VLAN 组网

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

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

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

x
Neutron 基于 VLAN 模式的 tenant network 同 provider network 一样,都必须使用物理的 VLAN 网络。# E+ j* H, L2 H  r+ z  u/ I
2.1 物理 VLAN 网络配置  B8 b, s% M8 K9 e9 g- _. K5 z
本例子中,交换机上划分了三个 VLAN 区域:
, j# f- A1 w" x' y8 S管理网络,用于 openstack 节点之间的通信,假设 VLAN ID 范围为 50 - 99.  z6 @8 A- R2 H) d1 y# j8 w
数据网络,用于虚拟机之间的通讯。由于Vlan模式下,租户建立的网络都具有独立的 Vlan ID,故需要将连接虚机的服务器的交换机端口设置为 Trunk 模式,并且设置所允许的 VLAN ID 范围,比如 100~300。; l3 r' F4 a4 x( ^' ?
外部网络,用于连接外部网络。加上 VLAN ID 范围为 1000-1010。
9 t) N& E+ M- r9 E0 e
  V) C1 @4 p% r- w  C* H关于网段之间的路由:  ^& [# b) i7 A7 C8 p
如果该物理交换机接到一个物理路由器并做相应的配置,则数据网络可以使用这个物理路由器,而不需要使用 Neutron 的虚拟路由器。
5 t; v% T0 k: q. p' y5 Y如果不使用物理的路由器,可以在网络节点上配置虚拟路由器。! l( ^" p) [+ p8 R4 l. \; ]2 X
2.2 Neutron 配置6 p1 g6 g. ^% e) K% J* o
2.2.1 配置进行* S9 k' X& Z  q4 \/ B% b
控制节点上:/ ^6 k0 V) x* z; b6 M3 n, A
# vim /etc/neutron/plugins/ml2/ml2_conf.ini
7 J9 h1 V5 ^& T2 [% Y, f3 c& t$ R1 U[ml2] 6 U% S( j# {) Y) ]0 \6 T
type_drivers = flat,vlan 2 P" j" ]3 _; q1 Z) n
tenant_network_types = vlan: p  g6 c0 |  f# E/ m& p
mechanism_drivers = openvswitch
1 n) N  m9 E# j[ml2_type_flat]3 J  V% c4 M/ V3 V/ V+ |, `
flat_networks = external
# Y8 i$ Y- k' k; [3 i4 ]' Y[ml2_type_vlan]
( g5 z% @, Q9 @8 u7 L4 z% m! C9 fnetwork_vlan_ranges = physnet1:100:300- h: I9 i$ ^1 o2 u, p

; r* m- m+ D( U2 C' D- ?, l网络节点上:/ C7 c7 E% a. U4 Y. _0 M# c9 ?; Z, Y
#为连接物理交换机的网卡 eth2 和 eth3 建立 OVS physical bridge,其中,eth2 用于数据网络,eth3 用于外部网络
9 F) t# K3 g* C  E- A" @ovs-vsctl add-br br-eth2
% |- [; ]. u! A) `5 L$ r! ^ovs-vsctl add-br br-ex& I6 k7 d, |( u- y2 u8 K5 b
ovs-vsctl add-port br-eth2 eth2* P8 v- w) b% D& k3 b9 ?( w
ovs-vsctl add-port br-ex eth38 }  M0 w' F1 D* b4 f6 v
# vim /etc/neutron/plugins/ml2/ml2_conf.ini 9 M4 K( ^4 a/ l$ U0 d) u, q
[m12]
2 h! w; [# S; }: b( b* z& r. _) Ptype_drivers = flat,vlan# O) j" q, C3 i  y, ]
tenant_network_types = vlan  S4 ~, P6 O, Z
mechanism_drivers = openvswitch) \9 n7 p, M; Q, r7 @3 |
[ml2_type_flat]: ?* D% f3 v3 ^
flat_networks = external
2 ~4 @% x. R" o4 O$ c1 b[ml2_type_vlan]
6 G; Q4 y+ Z+ V5 a  k  L+ X5 Vnetwork_vlan_ranges = physnet1:100:300,external:1000:1010 ( S% x) c# ]: w& ?$ z+ B
[ovs]
  R" t! e/ j) i7 B$ a- Q. Ibridge_mappings = physnet1:br-eth2,external:br-ex
! A/ j! S9 x9 N
" E; g6 M3 b( g: l3 t5 m计算节点上:
1 Y9 y! ]+ h) Z4 l$ ]& `#为连接物理交换机的网卡 eth2 建立 OVS physical bridge
; {( `" h4 _' R7 R: Q0 povs-vsctl add-br br-eth2+ h( l# F* R8 r7 k5 }, o
ovs-vsctl add-port br-eth2 eth2* q8 W+ E/ U. S% z
# vim /etc/neutron/plugins/ml2/ml2_conf.ini 3 w8 T3 E' z& m; {& `
[m12]
: a6 p) v+ I( N9 b; }# C- Btype_drivers = vlan3 @; O* }6 E- V
tenant_network_types = vlan
7 @% m+ b$ \; M: s- ymechanism_drivers = openvswitch
- \. O0 C( l9 ^! [. J0 l[ml2_type_vlan]   |) c" Q$ Z4 L8 H  x* m7 K/ b# O
network_vlan_ranges = physnet1:100:300 4 ]5 N3 a* ^8 d! k
[ovs]
4 a0 g3 X. t! H# l( x4 a! sbridge_mappings = physnet1:br-eth2& c4 E* }1 i% u+ L
& @+ n3 P7 m6 d5 _3 [
注意:
9 J! U  E2 v/ s# ]& @network_vlan_ranges 中的 VLAN ID 必须和物理交换机上的 VLAN ID 区间一致。
6 g- ?! w; p# b) Obridge_mappings 中所指定的 bridge 需要和在个节点上手工创建的 OVS bridge 一致。
; ^) u5 Z0 I- R9 ?3 b然后重启相应的 Neutron 服务。5 T% ^4 |" Q7 R: d8 j" n
2.2.2 配置生效过程$ f  _0 H2 Y3 @$ K3 z7 s, Z2 ]
当 Neutron L2 Agent (OVS Agent 或者 Linux Bridge agent)在计算和网络节点上启动时,它会根据各种配置在节点上创建各种 bridge。以 OVS Agent 为例,% ]+ }7 M, ~! S- U) a* f
(1)创建 intergration brige(默认是 br-int);如果 enable_tunneling = true 的话,创建 tunnel bridge (默认是 br-tun)。3 p8 L% r% N) z: E: v) E
(2)根据 bridge_mappings,配置每一个 VLAN 和 Flat 网络使用的 physical network interface 对应的预先创建的 OVS bridge。
2 V9 J. ~. G4 w4 t* X+ a7 t(3)所有虚机的 VIF 都是连接到 integration bridge。同一个虚拟网络上的 VM VIF 共享一个本地 VLAN (local VLAN)。Local VLAN ID 被映射到虚拟网络对应的物理网络的 segmentation_id。. u; g& B3 e6 A( V1 K8 [
(4)对于 GRE 类型的虚拟网络,使用 LSI (Logical Switch identifier)来区分隧道(tunnel)内的租户网络流量(tenant traffic)。这个隧道的两端都是每个物理服务器上的 tunneling bridge。使用 Patch port 来将 br-int 和 br-tun 连接起来。" S2 {' m) E5 C" N7 ~. g5 K. g+ z
(5)对于每一个 VLAN 或者 Flat 类型的网络,使用一个 veth 或者一个 patch port 对来连接 br-int 和物理网桥,以及增加 flow rules等。* T& h# j/ |$ S/ A' X$ \. H8 X
(6)最后,Neutron L2 Agent 启动后会运行一个RPC循环任务来处理 端口添加、删除和修改。管理员可以通过配置项 polling_interval 指定该 RPC 循环任务的执行间隔,默认为2秒。
' q1 N  q. Z) l3 r7 x2.3 创建虚拟网络和子网2 e# Z, e) M3 U& A1 f" R- B
2.3.1 创建命令6 l) F9 s+ [5 r
s1@controller:~$ neutron net-create net1 (或者 Admin 用户运行 neutron net-create net1 --provider:network_type vlan --provider:physical_network physnet1 --provider:segmentation_id 101。效果相同)
% a1 L: P0 d9 J% J$ MCreated a new network:
0 n, C2 E, x9 N$ ?2 {+---------------------------+--------------------------------------+% c; B/ p% A" l4 x/ Y
| Field                     | Value                                |: f* L% K+ \. Y$ n
+---------------------------+--------------------------------------+
" @; I9 c1 [/ U; O6 Y- D| admin_state_up            | True                                 |
7 G% p) A. q$ Z! v* l1 u% q8 m| id                        | dfc74f44-a9f2-4497-a53d-1723804a49a8 |
5 N5 w* P" K+ R$ n/ v6 i- K| name                      | net1                                  |3 U" H! `1 b& D* P- Q- }
| provider:network_type     | vlan                                 |8 V! t) s+ f0 q& K( h
| provider:physical_network | physnet1                             |+ h( o# N1 E9 D5 Z
| provider:segmentation_id  | 101                                  |0 T' J2 R# u* D5 A7 t8 ]0 B3 ^
| router:external           | False                                |; Z$ `% C+ u4 u2 y
| shared                    | False                                |. {8 p/ D8 Q9 Z- }6 ]
| status                    | ACTIVE                               |
/ e9 j$ n! u/ C| subnets                   |                                      |
7 J3 L* [3 X+ A7 J| tenant_id                 | 74c8ada23a3449f888d9e19b76d13aab     |
- [( e. i6 a' o" E+---------------------------+--------------------------------------+   
/ s0 z& W* f7 K/ `  G0 Ns1@controller:~$ neutron subnet-create subnet1 10.0.0.0/24 --name net1
: j+ B0 E& j+ u$ y' A
: z5 `& Z" {, e2.3.2 Neutron 代码实现
7 F% A$ f$ z8 f7 h* I3 L' m做完以上的步骤之后,用户就可以在 subnet 上 boot 虚机了。2 [+ N  d8 N6 w2 m; U8 R
boot 虚机的过程中,Nova 依次会:
. |2 o6 l; f# I. k- R" c9 M3 |(1)调用 Neutron REST API 申请一个或者多个 port。Neutron 会根据数据库中的配置来进行分配。9 R* Q/ \* ]: ^0 `
(2)在计算节点上,Nova 调用 ovs-vsctl 命令将虚机的 VIF 被 plug 到 br-int 上。! \$ U$ C$ f! y' {0 i
(3)启动虚机。
5 a: z+ ?6 A4 O' o& \Neutron L2 Agent 的循环任务每隔两秒会依次:7 Z2 W7 _& o3 B# r, ?7 f3 r; L
(1)调用 ”ovs-vsctl list-ports“ 命令获取到 br-int 上的 port,再根据上次保存的历史数据,生成所有变更端口的列表(包括添加的、更新的、删除的端口)。比如:* E6 d! v: r# h; p& \) z+ ^
{'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 y; D1 Z+ o7 Q4 W9 z& Z
1
( m1 ]$ Y; n# G% o(2)为每一个待处理端口,根据其 ID 从 DB 中取得其详细信息。比如:! @+ u7 B1 c, [& e
{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 ^% ~3 z6 m7 R5 L: W/ D
1
; o/ m$ [4 C  k0 N8 T0 ^; @(3)针对每一个增加或者变更的 port,设置 local VLAN Tag;调用 ”ovs-ofctl mod-flows “ 命令来设置 br-tun 或者 物理 bridge 的 flow rules;并设置 db 中其状态为 up。% T3 g. n% K; e: Q! @* |
(4)针对每一个被删除的 port,设置 db 中其状态为 down。
- O% T8 |+ l* s7 b2.4 Neutron 虚拟网络/ H2 `2 D) V4 J
(1)一个计算节点上的网络实例; l  B  i6 ?+ [+ D/ d' B
它反映的网络配置如下:
" u+ D3 \- Q! k8 r* bNeutron 使用 Open vSiwtch。
1 a* C4 U' B- B; M' B6 I一台物理服务器,网卡 eth1 接入物理交换机,预先配置了网桥 br-eth1。5 |4 R. J) W" B0 B+ _* l
创建了两个 neutron VLAN network,分别使用 VLAN ID 101 和 102。
! b. W4 O9 S8 V# W- J该服务器上运行三个虚机,虚机1 和 2 分别有一个网卡接入 network 1;虚机2 和 3 分别有一个网卡接入 network 2.& p# }/ D( N0 f# I8 \! z
& k2 B  C4 l. X8 W/ J# k
Neutron 在该计算节点上做的事情:. C- d. W" Y/ i7 [/ u. {
创建了 OVS Integration bridge br-int。它的四个 Access 端口中,两个打上了内部 Tag 1,连接接入 network 1 的两个网卡;另两个端口的 VLAN Tag 为 2。7 q, ]$ m/ A% ?; V
创建了一对 patch port,连接 br-int 和 br-eth1。* w, Z, i2 h7 K* E/ f9 k9 X
设置 br-int 中的 flow rules。对从 access ports 进入的数据帧,加上相应的 VLAN Tag,转发到 patch port;从 patch port 进入的数据帧,将 VLAN ID 101 修改为 1, 102 修改为 2,再转发到相应的 Access ports。3 v9 B  e& P+ V5 H7 d9 T7 \
设置 br-eth1 中的 flow rules。从 patch port 进入的数据帧,将内部 VLAN ID 1 修改为 101,内部 VLAN ID 2 修改为 102,再从 eth1 端口发出。对从 eth1 进入的数据帧做相反的处理。! L' O3 P! H0 _7 }
(2)再加上另一个连接到同一个物理交换机的服务器(加上 neutron 网络使用的 VLAN ID 为 100,物理 brige 为 br-eth0):
" j. D9 J3 {* c# u( R% L% g# a0 U" G; [, c+ [7 g2 K  ]
Neutron 实现了基于物理 VLAN 交换机的跨物理服务器二层虚拟网络。
  c4 O5 R/ Z. W8 V8 i2 p* k9 {(3)连接到同一物理交换机的网络节点的情况# n% t2 S1 o) N8 J( g

4 G6 Y! V5 c, {+ T" X7 a: ^(4)网络流向
/ c/ W& W' q2 b% e9 j; n7 z& U不同物理服务器上的虚机,如果 VM1 和 VM2 属于同一个 tenant network 的同一个subnet,那么两者的通信直接经过 物理交换机 进行,不需要做到网络节点。如图10 所示。
- Y" R7 H/ b" `0 t& U! k: e# q相同物理服务器上的虚机,如果 VM1 和 VM2 属于同一个 tenant network 的同一个subnet,那么两者的通信直接经过 br-int 进行。
4 \. B& n1 K. d  D! D4 s' N
( F+ m; y2 Q! |/ J# k' Z对其他虚机之间数据交换情形,都算作跨子网的数据流向,都需要经过网络节点中的 Router 进行 IP 包的路由。(也可以直接使用连接物理交换机的物理路由器)。6 W1 m% H4 K' n! F* i. _* |
& e/ Z$ d+ W/ B8 o5 x" Z6 p
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

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

如有购买积分卡请联系497906712

QQ|返回首页|Archiver|手机版|小黑屋|易陆发现 点击这里给我发消息

GMT+8, 2021-11-30 02:04 , Processed in 0.047778 second(s), 23 queries .

Powered by LR.LINUX.cloud bbs168x X3.2 Licensed

© 2012-2022 Comsenz Inc.

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