|
|
Neutron 基于 VLAN 模式的 tenant network 同 provider network 一样,都必须使用物理的 VLAN 网络。
! b& G4 y8 \! c$ Y8 ~7 n0 s2.1 物理 VLAN 网络配置
) _! ?( H- l" k8 r/ x5 u" M本例子中,交换机上划分了三个 VLAN 区域:' G# w0 E7 D$ y- o0 P f. y
管理网络,用于 OpenStack 节点之间的通信,假设 VLAN ID 范围为 50 - 99. j1 z$ e: r+ W' R' S I
数据网络,用于虚拟机之间的通讯。由于Vlan模式下,租户建立的网络都具有独立的 Vlan ID,故需要将连接虚机的服务器的交换机端口设置为 Trunk 模式,并且设置所允许的 VLAN ID 范围,比如 100~300。6 W _* P1 \) w @$ Q$ Z% {
外部网络,用于连接外部网络。加上 VLAN ID 范围为 1000-1010。2 s6 g* [, H$ \$ h' }
* V& N2 k. T, R" ?! }关于网段之间的路由:* Z M( m9 n' j# d0 ~" u
如果该物理交换机接到一个物理路由器并做相应的配置,则数据网络可以使用这个物理路由器,而不需要使用 Neutron 的虚拟路由器。/ c8 I4 I1 d+ Y7 E, p4 Q/ n; M! C
如果不使用物理的路由器,可以在网络节点上配置虚拟路由器。
& T$ @( K+ _* D2.2 Neutron 配置
: @+ H$ f% b- b' ]2.2.1 配置进行
, k7 [3 ~7 d" x+ s控制节点上:# _ s$ y. ?: l7 V
# vim /etc/neutron/plugins/ml2/ml2_conf.ini2 N/ i& \( E" E! v
[ml2] - H: J! V+ \5 d' e, o5 I+ B
type_drivers = flat,vlan
5 P- d5 t( y3 Y1 H4 j; Jtenant_network_types = vlan% V9 ^. w) }6 y) U5 V! L
mechanism_drivers = openvswitch
; i# E. } W* t6 k1 f$ ^[ml2_type_flat]' s1 m/ F* \1 v( w2 |- @
flat_networks = external
: o* G9 I8 Y+ ~3 S1 o, q[ml2_type_vlan]
, b5 V3 a9 }& B+ }, I/ }network_vlan_ranges = physnet1:100:300, K! n" X1 T/ x. z+ D/ b4 O
4 o1 y) O# U3 }7 ~0 B- G+ Y8 U
网络节点上:
8 Y" q y7 l5 \- Z, W#为连接物理交换机的网卡 eth2 和 eth3 建立 OVS physical bridge,其中,eth2 用于数据网络,eth3 用于外部网络
. W: O# y. E% f' Novs-vsctl add-br br-eth2
: |; s: @9 C Wovs-vsctl add-br br-ex
4 |) `8 o5 V6 Q4 `8 lovs-vsctl add-port br-eth2 eth2# I" X4 d9 U; H# f0 l9 o/ A3 p
ovs-vsctl add-port br-ex eth3
' R+ l9 O$ C5 [& I" `- N$ p1 _# vim /etc/neutron/plugins/ml2/ml2_conf.ini ( v) Z1 K( {! a9 p
[m12]
0 \% T( p; T' I4 `7 z, Ftype_drivers = flat,vlan- C, Z" M) S$ p0 B- I* I" X* h
tenant_network_types = vlan8 K, e8 }( S8 |# s6 b! [. i o+ q
mechanism_drivers = openvswitch
( q: b) Z5 r* l* T[ml2_type_flat]3 ?! m Y3 r7 A
flat_networks = external
" z1 b( m5 u- r& F( F5 C' r( J/ f- B5 q[ml2_type_vlan]
5 C4 o9 `1 G; c, wnetwork_vlan_ranges = physnet1:100:300,external:1000:1010
: L$ W+ d, e# g. {4 t/ v+ F* O[ovs]
2 Q- b6 O/ D) v( X( D& c- Pbridge_mappings = physnet1:br-eth2,external:br-ex
! ]0 t1 G* B w" N3 L$ ]9 j2 a1 M
0 r& ^8 W3 I3 y, n1 r计算节点上:
% k, y- W% t2 B P- U+ R6 U: ?$ G3 i#为连接物理交换机的网卡 eth2 建立 OVS physical bridge9 l7 \/ P7 S+ d6 g" f7 }
ovs-vsctl add-br br-eth2
. M$ O. H- R; v$ w( X) T3 x# Z k hovs-vsctl add-port br-eth2 eth2. I% G8 V8 n. Q2 ` T" ]0 }9 T
# vim /etc/neutron/plugins/ml2/ml2_conf.ini 6 i0 R7 @9 X- J% G1 {. e
[m12]5 ?/ S; T( ^8 D5 l4 c* u, e3 {3 Y
type_drivers = vlan5 Y& O& E3 P) Q; G, }+ x
tenant_network_types = vlan
$ W# i- C; W# Q3 X0 s1 Tmechanism_drivers = openvswitch e& z2 Z( p; o4 R& ]4 h# d. \/ d
[ml2_type_vlan]
& s4 C- z/ B0 C# H" @8 Xnetwork_vlan_ranges = physnet1:100:300 * O0 }- |5 Y. G& u/ E
[ovs]
7 W& R( P4 H4 k8 ibridge_mappings = physnet1:br-eth2, _, }/ g/ {( z) x7 V0 d# M% |
1 Y3 E/ T5 R1 D$ f7 X0 f2 \" X注意:* W+ x2 d, o. G6 B
network_vlan_ranges 中的 VLAN ID 必须和物理交换机上的 VLAN ID 区间一致。
% D T! z/ \& ]' p+ v- b: z+ }bridge_mappings 中所指定的 bridge 需要和在个节点上手工创建的 OVS bridge 一致。8 m. A O5 Q, c0 G% @* O
然后重启相应的 Neutron 服务。* o) y" M& h* I8 r2 D
2.2.2 配置生效过程) M/ ]: \0 o* L) d
当 Neutron L2 Agent (OVS Agent 或者 Linux Bridge agent)在计算和网络节点上启动时,它会根据各种配置在节点上创建各种 bridge。以 OVS Agent 为例,: ^: J) j) y) m/ ]; s; R, x8 ]
(1)创建 intergration brige(默认是 br-int);如果 enable_tunneling = true 的话,创建 tunnel bridge (默认是 br-tun)。
+ z; D1 ~( K$ [1 x1 B& N( V5 M(2)根据 bridge_mappings,配置每一个 VLAN 和 Flat 网络使用的 physical network interface 对应的预先创建的 OVS bridge。7 K, W8 @! t3 \# B* U3 u
(3)所有虚机的 VIF 都是连接到 integration bridge。同一个虚拟网络上的 VM VIF 共享一个本地 VLAN (local VLAN)。Local VLAN ID 被映射到虚拟网络对应的物理网络的 segmentation_id。
2 t4 O' |7 r4 m; C(4)对于 GRE 类型的虚拟网络,使用 LSI (Logical Switch identifier)来区分隧道(tunnel)内的租户网络流量(tenant traffic)。这个隧道的两端都是每个物理服务器上的 tunneling bridge。使用 Patch port 来将 br-int 和 br-tun 连接起来。
/ F$ }3 T* S4 l# D(5)对于每一个 VLAN 或者 Flat 类型的网络,使用一个 veth 或者一个 patch port 对来连接 br-int 和物理网桥,以及增加 flow rules等。
! `. t$ h+ Y) q0 G4 N. j Z& _(6)最后,Neutron L2 Agent 启动后会运行一个RPC循环任务来处理 端口添加、删除和修改。管理员可以通过配置项 polling_interval 指定该 RPC 循环任务的执行间隔,默认为2秒。
9 ?) }7 h5 Q8 ]8 X: V2.3 创建虚拟网络和子网
) a) n; F6 t* ?1 e+ { W2.3.1 创建命令
9 c; T' X0 Q- k# Ts1@controller:~$ neutron net-create net1 (或者 Admin 用户运行 neutron net-create net1 --provider:network_type vlan --provider:physical_network physnet1 --provider:segmentation_id 101。效果相同)! v! U/ o3 J3 G: I7 O J! ^; z& F
Created a new network:7 F3 ~/ g- O7 W" N
+---------------------------+--------------------------------------+
& `5 K+ T" B$ l: Y# U/ y| Field | Value |4 }+ K* I$ ^6 a6 A
+---------------------------+--------------------------------------+
1 e0 a1 M4 {2 |: Z1 _$ d3 ?| admin_state_up | True |
( u- B3 U( ]+ ], K; M$ Q1 h| id | dfc74f44-a9f2-4497-a53d-1723804a49a8 |
% E3 F n" x) t| name | net1 |
: x9 H/ \) b+ [9 u| provider:network_type | vlan |& n: _0 c1 @# v8 u$ |. s
| provider:physical_network | physnet1 |
5 H0 F4 @7 P. |, Z. D| provider:segmentation_id | 101 |
' P% `8 r( t9 T| router:external | False |
/ C) r7 S* c, M/ c7 m* M) V| shared | False |! ~! [" r. o9 S6 T, s
| status | ACTIVE |
# u; [; O6 w- A# q9 a" W| subnets | |
1 k- u& \) [0 m# K2 U: x. t| tenant_id | 74c8ada23a3449f888d9e19b76d13aab |
0 ^0 Z4 Y ]- z# ?6 a1 Z' e+---------------------------+--------------------------------------+
' r+ Q' X0 t/ W# X% d* [s1@controller:~$ neutron subnet-create subnet1 10.0.0.0/24 --name net1
0 l4 R+ _3 r) F1 c: E5 D3 m
4 y1 w% c" E7 x9 W3 N2.3.2 Neutron 代码实现
# l5 H3 K/ E$ s* y& V% }+ s% @做完以上的步骤之后,用户就可以在 subnet 上 boot 虚机了。
& L/ {( S- a1 y% `6 ]9 A$ j6 Z% @boot 虚机的过程中,Nova 依次会:" u3 Z+ u; \ w2 r
(1)调用 Neutron REST API 申请一个或者多个 port。Neutron 会根据数据库中的配置来进行分配。3 b6 P8 O9 F& f2 E C
(2)在计算节点上,Nova 调用 ovs-vsctl 命令将虚机的 VIF 被 plug 到 br-int 上。
# }# W7 x9 q+ S9 \! S( W; P(3)启动虚机。
: C/ L$ k5 c' Y1 F- mNeutron L2 Agent 的循环任务每隔两秒会依次:: x6 W2 n4 _! u5 a' S
(1)调用 ”ovs-vsctl list-ports“ 命令获取到 br-int 上的 port,再根据上次保存的历史数据,生成所有变更端口的列表(包括添加的、更新的、删除的端口)。比如:
8 `# h$ _8 a& e3 b5 d7 d{'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'])}/ R( V1 h2 H3 e4 ?
1
) R# {( s0 N) T) m) R' V(2)为每一个待处理端口,根据其 ID 从 DB 中取得其详细信息。比如:
. G; A7 ]9 q& 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'}
) I V, Q7 X; l9 e1
' Q4 g ^: Z, s# @/ S7 z( {' m(3)针对每一个增加或者变更的 port,设置 local VLAN Tag;调用 ”ovs-ofctl mod-flows “ 命令来设置 br-tun 或者 物理 bridge 的 flow rules;并设置 db 中其状态为 up。9 f# r9 A C, d" [; p/ I
(4)针对每一个被删除的 port,设置 db 中其状态为 down。
1 m; h- X8 f, b. b# R+ I2.4 Neutron 虚拟网络( J) q" t3 V% v; C6 f! x/ H
(1)一个计算节点上的网络实例
7 {; M3 G D k. j! f/ W它反映的网络配置如下:
& @8 \1 r3 A' [: R1 NNeutron 使用 Open vSiwtch。
! B0 u+ U" a( Z0 o/ x0 }6 T: @一台物理服务器,网卡 eth1 接入物理交换机,预先配置了网桥 br-eth1。
( H; z. e# U9 v2 I( M3 a! E( v$ `创建了两个 neutron VLAN network,分别使用 VLAN ID 101 和 102。; H- L, x7 i2 W# `0 @0 P: f
该服务器上运行三个虚机,虚机1 和 2 分别有一个网卡接入 network 1;虚机2 和 3 分别有一个网卡接入 network 2.
6 F0 \7 N; y2 d5 D" n
# q! G. U! A# u, XNeutron 在该计算节点上做的事情:% U( K- o. E+ M) t# g+ ^
创建了 OVS Integration bridge br-int。它的四个 Access 端口中,两个打上了内部 Tag 1,连接接入 network 1 的两个网卡;另两个端口的 VLAN Tag 为 2。. g, Z2 v4 v8 E/ B$ o7 @: F# w
创建了一对 patch port,连接 br-int 和 br-eth1。% I; b( q5 |' t9 N# a0 u/ }
设置 br-int 中的 flow rules。对从 access ports 进入的数据帧,加上相应的 VLAN Tag,转发到 patch port;从 patch port 进入的数据帧,将 VLAN ID 101 修改为 1, 102 修改为 2,再转发到相应的 Access ports。1 K4 \1 K9 R# G8 ? q
设置 br-eth1 中的 flow rules。从 patch port 进入的数据帧,将内部 VLAN ID 1 修改为 101,内部 VLAN ID 2 修改为 102,再从 eth1 端口发出。对从 eth1 进入的数据帧做相反的处理。
( W4 X6 L3 t( [% T9 [(2)再加上另一个连接到同一个物理交换机的服务器(加上 neutron 网络使用的 VLAN ID 为 100,物理 brige 为 br-eth0):% n8 ]3 f$ s; i
. F8 x, e& n0 {0 C: n: |
Neutron 实现了基于物理 VLAN 交换机的跨物理服务器二层虚拟网络。7 C: S" m# I1 M" ^0 J
(3)连接到同一物理交换机的网络节点的情况6 Z# ]) r! c2 j V5 N
( @# d% u- ^, l: l(4)网络流向
. C9 D0 ]6 i+ G不同物理服务器上的虚机,如果 VM1 和 VM2 属于同一个 tenant network 的同一个subnet,那么两者的通信直接经过 物理交换机 进行,不需要做到网络节点。如图10 所示。2 {! S0 e7 _! d7 V$ @
相同物理服务器上的虚机,如果 VM1 和 VM2 属于同一个 tenant network 的同一个subnet,那么两者的通信直接经过 br-int 进行。5 c8 V( \- o8 e0 @
4 M( U. D. `- \对其他虚机之间数据交换情形,都算作跨子网的数据流向,都需要经过网络节点中的 Router 进行 IP 包的路由。(也可以直接使用连接物理交换机的物理路由器)。
# Q% ^1 h4 z- V( k+ [, l. B T6 E3 t. a/ ]3 c# I' ~3 ?, X
|
|