- 积分
- 16840
在线时间 小时
最后登录1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?开始注册
x
Neutron 基于 VLAN 模式的 tenant network 同 provider network 一样,都必须使用物理的 VLAN 网络。, z6 h9 H3 b6 B. v
2.1 物理 VLAN 网络配置8 W; d5 V" `4 H/ I
本例子中,交换机上划分了三个 VLAN 区域:; X9 v5 S: R5 m; o: h
管理网络,用于 openstack 节点之间的通信,假设 VLAN ID 范围为 50 - 99.
/ [, k" S5 s9 u+ f& o% M! r8 Z数据网络,用于虚拟机之间的通讯。由于Vlan模式下,租户建立的网络都具有独立的 Vlan ID,故需要将连接虚机的服务器的交换机端口设置为 Trunk 模式,并且设置所允许的 VLAN ID 范围,比如 100~300。
3 o% W/ [1 i& {* k外部网络,用于连接外部网络。加上 VLAN ID 范围为 1000-1010。
- C3 X) C8 U6 c, b$ M4 J7 {( P. ^6 l3 @+ h) Q1 M* e# p
关于网段之间的路由:
' t1 K) n" R" Y0 ], M& V' N/ B如果该物理交换机接到一个物理路由器并做相应的配置,则数据网络可以使用这个物理路由器,而不需要使用 Neutron 的虚拟路由器。
0 s% ~/ D7 z- b" T如果不使用物理的路由器,可以在网络节点上配置虚拟路由器。, w5 q! y9 J1 o3 h# L
2.2 Neutron 配置/ y( N2 g) R a3 J- o7 [
2.2.1 配置进行! C: J/ t6 l& ~4 W" l
控制节点上:$ V) Y' [; P& a' J
# vim /etc/neutron/plugins/ml2/ml2_conf.ini9 S9 M& P. O/ p. Q7 l
[ml2]
& t* b% V! S( g4 }type_drivers = flat,vlan 0 W5 [) t- f! ~
tenant_network_types = vlan8 d% u# v* M8 n9 |
mechanism_drivers = openvswitch7 k- Z2 N# r9 D" M
[ml2_type_flat]
$ o. w+ b* v+ L' ?flat_networks = external7 Z( }+ t( K* D$ K! ?- n
[ml2_type_vlan] 0 L0 I* T+ W" v
network_vlan_ranges = physnet1:100:300
# W4 s' p4 R0 X$ b8 h) z$ g/ s2 F; ]: g- t* u
网络节点上:/ R3 Y8 y1 `% C
#为连接物理交换机的网卡 eth2 和 eth3 建立 OVS physical bridge,其中,eth2 用于数据网络,eth3 用于外部网络
: \ R% K4 Q6 @9 n* O- jovs-vsctl add-br br-eth2
* i* O( }+ w' p& _7 B; }ovs-vsctl add-br br-ex
* L+ o/ K0 B `" J6 S% Novs-vsctl add-port br-eth2 eth2
/ D; U+ b+ g' K" E" Povs-vsctl add-port br-ex eth3: ?: ^( _6 @( e; n" H, a9 N. w Z
# vim /etc/neutron/plugins/ml2/ml2_conf.ini
+ `) M; M+ d' k! y[m12]
( V; h- y" B4 etype_drivers = flat,vlan- |+ I) L9 Y( L2 [+ O H
tenant_network_types = vlan1 ^1 b- [( u9 G( Z/ Q7 g0 x
mechanism_drivers = openvswitch
, v ~8 u/ a4 F$ d[ml2_type_flat]# u/ d2 d3 q; T
flat_networks = external+ [0 ]/ k% ^9 ^3 o, V
[ml2_type_vlan]
- |' ]& W. K! Y. m1 k, x; jnetwork_vlan_ranges = physnet1:100:300,external:1000:1010
: s$ D$ C7 o2 y! F+ j[ovs] 2 R0 H# B& w% }# \# n4 c$ |
bridge_mappings = physnet1:br-eth2,external:br-ex
4 j, I! Y1 ~# A; [
2 x6 N$ m# w6 V W计算节点上:: b; r! S; `, |1 Q* K
#为连接物理交换机的网卡 eth2 建立 OVS physical bridge5 V! J7 `. t) b8 p% Q" m
ovs-vsctl add-br br-eth2
: y6 c6 F U Z0 e$ v2 G, ?: S Qovs-vsctl add-port br-eth2 eth2
u! E3 S$ L0 k; m. N% b# vim /etc/neutron/plugins/ml2/ml2_conf.ini 5 b5 z6 p: P: m/ G Y
[m12]
+ j: w: [& y" Jtype_drivers = vlan
9 i+ E* R. E% a2 Ptenant_network_types = vlan
2 p8 q5 S s! J- |/ n& smechanism_drivers = openvswitch) @. R: W: }. o/ I
[ml2_type_vlan]
( {) [: _; ? E Tnetwork_vlan_ranges = physnet1:100:300
6 n) O7 A7 O4 g2 ^4 y[ovs] 5 a' x7 c( y' C2 p& w: C: ]
bridge_mappings = physnet1:br-eth2$ Q$ j& N( N( E2 D3 R! G" _
" ~; M2 v1 H* n% C8 Y: v( u" f- `- P: i
注意:$ J! n4 D6 [2 p+ V, U+ t( G* m
network_vlan_ranges 中的 VLAN ID 必须和物理交换机上的 VLAN ID 区间一致。; k6 C5 z H' F T
bridge_mappings 中所指定的 bridge 需要和在个节点上手工创建的 OVS bridge 一致。
, f" z( N6 z3 X% b+ S# x然后重启相应的 Neutron 服务。
; @$ c/ ^. o4 A3 `9 z9 O; V2 `: v7 Z, K2.2.2 配置生效过程
' h8 {4 j: p% P7 F3 I1 O* S6 p. m当 Neutron L2 Agent (OVS Agent 或者 Linux Bridge agent)在计算和网络节点上启动时,它会根据各种配置在节点上创建各种 bridge。以 OVS Agent 为例,8 [: w5 e" U+ Y: i
(1)创建 intergration brige(默认是 br-int);如果 enable_tunneling = true 的话,创建 tunnel bridge (默认是 br-tun)。- ~, ~; p2 o6 G( ?- [: f9 n
(2)根据 bridge_mappings,配置每一个 VLAN 和 Flat 网络使用的 physical network interface 对应的预先创建的 OVS bridge。- M; W( C$ c4 N2 `0 ?- J4 B
(3)所有虚机的 VIF 都是连接到 integration bridge。同一个虚拟网络上的 VM VIF 共享一个本地 VLAN (local VLAN)。Local VLAN ID 被映射到虚拟网络对应的物理网络的 segmentation_id。
( C' Z, W; j& Q# r! c g( R(4)对于 GRE 类型的虚拟网络,使用 LSI (Logical Switch identifier)来区分隧道(tunnel)内的租户网络流量(tenant traffic)。这个隧道的两端都是每个物理服务器上的 tunneling bridge。使用 Patch port 来将 br-int 和 br-tun 连接起来。, f! H6 T& {! w% M2 ?+ W ?# {6 P
(5)对于每一个 VLAN 或者 Flat 类型的网络,使用一个 veth 或者一个 patch port 对来连接 br-int 和物理网桥,以及增加 flow rules等。: Z7 j" u+ T: z$ D
(6)最后,Neutron L2 Agent 启动后会运行一个RPC循环任务来处理 端口添加、删除和修改。管理员可以通过配置项 polling_interval 指定该 RPC 循环任务的执行间隔,默认为2秒。$ j4 J3 \* F' l# S1 t+ g: R) n
2.3 创建虚拟网络和子网4 z$ g( z. w9 u* N8 S
2.3.1 创建命令
$ e6 U0 i7 G; B% }2 X& rs1@controller:~$ neutron net-create net1 (或者 Admin 用户运行 neutron net-create net1 --provider:network_type vlan --provider:physical_network physnet1 --provider:segmentation_id 101。效果相同) ?! n# f& w3 F1 [
Created a new network:
# N+ h: E% }- Q- f% n+---------------------------+--------------------------------------+
+ {+ @& j# s& {8 b# y| Field | Value |8 m5 u; x4 n. q5 P
+---------------------------+--------------------------------------+
, c3 ?+ [# I" ^| admin_state_up | True |8 N% ?/ ]9 Q2 S
| id | dfc74f44-a9f2-4497-a53d-1723804a49a8 |
% q; i8 t7 J) p. v, O' G| name | net1 |
' O4 ?+ \' o" t; l5 z+ m; S| provider:network_type | vlan |
e+ \ n# B3 A5 M& E" a( j5 ]% [( b| provider:physical_network | physnet1 |( T% {* B7 G* M7 m/ A
| provider:segmentation_id | 101 |5 M$ L8 H0 j1 a, `* ?, L& Q* t
| router:external | False |) b0 x$ P: s( [# a9 B1 Z/ x. L
| shared | False |9 y( b- _/ A' ~; b
| status | ACTIVE |5 T! V' [# y' F8 V& k u0 s
| subnets | |0 a9 o2 i3 }$ F, t/ G
| tenant_id | 74c8ada23a3449f888d9e19b76d13aab |
6 C% B/ V) W5 Q& B+ U+---------------------------+--------------------------------------+ 7 i; N* s7 x) }
s1@controller:~$ neutron subnet-create subnet1 10.0.0.0/24 --name net1
7 e/ B2 O; n4 L5 F5 [. f" o0 c1 g6 G- ^8 d4 t6 ]1 `0 s& c, K
2.3.2 Neutron 代码实现9 m0 n1 E7 y# G* L5 z8 A7 S- U& R
做完以上的步骤之后,用户就可以在 subnet 上 boot 虚机了。; T$ ]+ D7 N/ ]& J5 r/ i& I
boot 虚机的过程中,Nova 依次会: D% C. k* A' X; Y) t+ n
(1)调用 Neutron REST API 申请一个或者多个 port。Neutron 会根据数据库中的配置来进行分配。( L$ [. _- w; w0 d3 V' \
(2)在计算节点上,Nova 调用 ovs-vsctl 命令将虚机的 VIF 被 plug 到 br-int 上。
7 S6 u% x' Z( Z3 v& E+ z0 G' X0 X(3)启动虚机。
0 `2 Z `; J* H* N& d5 H4 CNeutron L2 Agent 的循环任务每隔两秒会依次:
4 `; e* d1 n a+ z# `) e0 _(1)调用 ”ovs-vsctl list-ports“ 命令获取到 br-int 上的 port,再根据上次保存的历史数据,生成所有变更端口的列表(包括添加的、更新的、删除的端口)。比如:
& D6 q4 E# `' 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'])}
4 M. F3 g# o7 }1 M5 [9 [3 N+ {8 q1; z0 ?, s$ F) _, E5 k2 b) [( s
(2)为每一个待处理端口,根据其 ID 从 DB 中取得其详细信息。比如:
% N( }; y6 m. m8 `# F# V{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'}
4 y8 j( V5 r% E& @' N1' n g' v4 s7 t
(3)针对每一个增加或者变更的 port,设置 local VLAN Tag;调用 ”ovs-ofctl mod-flows “ 命令来设置 br-tun 或者 物理 bridge 的 flow rules;并设置 db 中其状态为 up。
) q- A2 |/ U9 E5 F* Z) p(4)针对每一个被删除的 port,设置 db 中其状态为 down。
) E( ?2 R$ m% k* V! e) K+ ^: ]2.4 Neutron 虚拟网络
+ h- w; p! E2 R" v. G(1)一个计算节点上的网络实例$ ?1 h7 D; a/ ]1 c
它反映的网络配置如下:
. }1 O3 m" O& a( {Neutron 使用 Open vSiwtch。
2 y, d6 u& g6 E" ^, @一台物理服务器,网卡 eth1 接入物理交换机,预先配置了网桥 br-eth1。
+ d' b0 E3 E; T( m+ h8 K7 V8 b创建了两个 neutron VLAN network,分别使用 VLAN ID 101 和 102。
4 o3 T7 z; g+ b! ?# c% U4 C该服务器上运行三个虚机,虚机1 和 2 分别有一个网卡接入 network 1;虚机2 和 3 分别有一个网卡接入 network 2.
2 Z4 k" z! Q5 F, u( o1 G0 N+ e' \& T6 ^3 `' o6 s
Neutron 在该计算节点上做的事情:
3 L' x3 O ?: B) I4 D1 C; t$ E( Y1 m% N创建了 OVS Integration bridge br-int。它的四个 Access 端口中,两个打上了内部 Tag 1,连接接入 network 1 的两个网卡;另两个端口的 VLAN Tag 为 2。4 p2 S. U2 ?4 p
创建了一对 patch port,连接 br-int 和 br-eth1。
# c+ Y. F$ N! K+ p v& K设置 br-int 中的 flow rules。对从 access ports 进入的数据帧,加上相应的 VLAN Tag,转发到 patch port;从 patch port 进入的数据帧,将 VLAN ID 101 修改为 1, 102 修改为 2,再转发到相应的 Access ports。2 S( k9 u6 y* `
设置 br-eth1 中的 flow rules。从 patch port 进入的数据帧,将内部 VLAN ID 1 修改为 101,内部 VLAN ID 2 修改为 102,再从 eth1 端口发出。对从 eth1 进入的数据帧做相反的处理。
$ P5 Z1 ?. O$ ^5 m- k(2)再加上另一个连接到同一个物理交换机的服务器(加上 neutron 网络使用的 VLAN ID 为 100,物理 brige 为 br-eth0):
$ \( h+ ^& b. W2 X. a7 X; ~( @9 k5 W( c0 P4 _! F" g+ I) {2 {
Neutron 实现了基于物理 VLAN 交换机的跨物理服务器二层虚拟网络。
: v/ {, L. W/ {) K- O2 i(3)连接到同一物理交换机的网络节点的情况. r5 X/ j# v# N5 e9 Q
, K3 X4 b" W( M& }0 m
(4)网络流向; g& |6 R6 X! L+ p/ V' y) N
不同物理服务器上的虚机,如果 VM1 和 VM2 属于同一个 tenant network 的同一个subnet,那么两者的通信直接经过 物理交换机 进行,不需要做到网络节点。如图10 所示。
) c4 e" R8 ^, V" ?/ @& v3 |相同物理服务器上的虚机,如果 VM1 和 VM2 属于同一个 tenant network 的同一个subnet,那么两者的通信直接经过 br-int 进行。
( |! U* d4 D( M3 x1 e$ R& b; K. p! F! s8 K* ?9 R. g
对其他虚机之间数据交换情形,都算作跨子网的数据流向,都需要经过网络节点中的 Router 进行 IP 包的路由。(也可以直接使用连接物理交换机的物理路由器)。
5 B& \1 `% s& ^ C* \# W0 t: l. C2 L. k4 T* Z" x& [ i
|
|