|
|
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 |
|