|
|
Neutron 基于 VLAN 模式的 tenant network 同 provider network 一样,都必须使用物理的 VLAN 网络。
$ j$ ]0 J3 W8 y/ C2.1 物理 VLAN 网络配置/ e) W! x8 G/ m" z* I* W) i; Y
本例子中,交换机上划分了三个 VLAN 区域:
) t5 U( L$ u( s) {) `管理网络,用于 OpenStack 节点之间的通信,假设 VLAN ID 范围为 50 - 99.! g6 _5 Y6 A' R% M7 l
数据网络,用于虚拟机之间的通讯。由于Vlan模式下,租户建立的网络都具有独立的 Vlan ID,故需要将连接虚机的服务器的交换机端口设置为 Trunk 模式,并且设置所允许的 VLAN ID 范围,比如 100~300。, i1 i& J& W( _, f9 {" }- Z
外部网络,用于连接外部网络。加上 VLAN ID 范围为 1000-1010。
; B5 c6 W$ R p1 ~5 e8 d2 l3 q0 L( a+ I; b! K' d) [! X0 H8 {
关于网段之间的路由:8 z# x, A2 _" C
如果该物理交换机接到一个物理路由器并做相应的配置,则数据网络可以使用这个物理路由器,而不需要使用 Neutron 的虚拟路由器。
9 ^! j7 y- b. q% W6 l; h如果不使用物理的路由器,可以在网络节点上配置虚拟路由器。& F) L/ Z5 ]; p5 P% |* f
2.2 Neutron 配置- E9 L" _" ]# o3 }
2.2.1 配置进行
9 U' e, T8 |$ [. ?4 W* \$ w控制节点上:
- m5 G( M: H9 i0 n1 J) I6 Y; ?# vim /etc/neutron/plugins/ml2/ml2_conf.ini
" E8 `5 Z2 [/ a" Z; m7 E[ml2] $ d: m# f+ w0 J$ I
type_drivers = flat,vlan ) F$ I# T2 I# t$ A- c% E( K6 N
tenant_network_types = vlan
( w% U# |- s$ T: ^+ l3 Imechanism_drivers = openvswitch# F9 D5 [& B* z7 ]
[ml2_type_flat]
) q) Q$ s* }& \- E& Fflat_networks = external
* e6 t0 r( t5 X. g[ml2_type_vlan]
# s+ S& `9 {' |; i1 Ynetwork_vlan_ranges = physnet1:100:3001 t( h5 n- j P2 h
1 h/ h- R* `+ T$ Y4 c7 V1 r6 k网络节点上:
- |+ o P; Y4 E#为连接物理交换机的网卡 eth2 和 eth3 建立 OVS physical bridge,其中,eth2 用于数据网络,eth3 用于外部网络* _/ P" @! @7 b" b
ovs-vsctl add-br br-eth2
; u, A. F+ | P7 B4 H$ ?ovs-vsctl add-br br-ex9 p5 ]3 {' Q0 `3 \. M2 U
ovs-vsctl add-port br-eth2 eth2
& O w' q' I2 h" A9 ~3 V; t2 kovs-vsctl add-port br-ex eth3
3 C. s2 g% b4 f5 r/ T# vim /etc/neutron/plugins/ml2/ml2_conf.ini 1 H" K5 {# Y! m
[m12]
) R5 W3 G3 c5 ftype_drivers = flat,vlan# x3 R( ?& N, l9 c1 v2 |
tenant_network_types = vlan
; V# X$ P) M% D8 ^# g$ zmechanism_drivers = openvswitch+ G6 Z4 d: l0 n# v% M; t
[ml2_type_flat]
$ o( R) @6 r5 H* ?1 c' n. uflat_networks = external
& O2 [8 {5 |: U0 J+ I3 d[ml2_type_vlan]
+ ]' q8 X2 B& G" Onetwork_vlan_ranges = physnet1:100:300,external:1000:1010 , E6 x* Y2 K$ s
[ovs] 2 X4 o! j; b4 p f, S) z$ J) b v
bridge_mappings = physnet1:br-eth2,external:br-ex
$ [) j9 H: a9 t5 G4 b" t+ N9 E% U* G7 O8 x
计算节点上:
* J6 m. y- M( p0 V2 R: ^#为连接物理交换机的网卡 eth2 建立 OVS physical bridge
T2 M2 \. _5 i% n' {ovs-vsctl add-br br-eth2
, t; n3 ^# P; covs-vsctl add-port br-eth2 eth2
5 {3 O% q+ A* h9 q# vim /etc/neutron/plugins/ml2/ml2_conf.ini
( t3 U5 f" s7 C[m12]; H: ^; T8 _: f1 ^, L1 l
type_drivers = vlan
9 G4 ^- }# p& q, a# \. a+ w! _; Ftenant_network_types = vlan
1 @2 o& S) M& E2 N9 K; Amechanism_drivers = openvswitch% N$ j1 v: u1 M8 g; ^: h! ]1 L
[ml2_type_vlan]
- D: ~& R. j; V# R! J9 qnetwork_vlan_ranges = physnet1:100:300 ; T, ^) ]+ z8 ]4 K2 f7 R
[ovs]
3 M* f6 { q3 S' d c) Ybridge_mappings = physnet1:br-eth2) m8 \: @8 Y# Q) Y- S: {9 C$ _
6 _: P6 W5 V Q9 f V9 e& k; f# e注意:
: }4 L% j7 D w+ ~network_vlan_ranges 中的 VLAN ID 必须和物理交换机上的 VLAN ID 区间一致。) S% Z5 k9 Y0 l7 B7 g
bridge_mappings 中所指定的 bridge 需要和在个节点上手工创建的 OVS bridge 一致。+ W7 ?, l c; C
然后重启相应的 Neutron 服务。* \' s6 x& n5 z: O
2.2.2 配置生效过程
0 Q i9 G1 E5 M: r) P! A9 q) }当 Neutron L2 Agent (OVS Agent 或者 Linux Bridge agent)在计算和网络节点上启动时,它会根据各种配置在节点上创建各种 bridge。以 OVS Agent 为例,
& I+ L% R; } G" P* |(1)创建 intergration brige(默认是 br-int);如果 enable_tunneling = true 的话,创建 tunnel bridge (默认是 br-tun)。9 A5 K# y6 W- K! ^& F( R& N
(2)根据 bridge_mappings,配置每一个 VLAN 和 Flat 网络使用的 physical network interface 对应的预先创建的 OVS bridge。
5 `. N3 L+ ^$ E9 k2 j: e" }(3)所有虚机的 VIF 都是连接到 integration bridge。同一个虚拟网络上的 VM VIF 共享一个本地 VLAN (local VLAN)。Local VLAN ID 被映射到虚拟网络对应的物理网络的 segmentation_id。
) G! G# C% L5 T5 M8 X(4)对于 GRE 类型的虚拟网络,使用 LSI (Logical Switch identifier)来区分隧道(tunnel)内的租户网络流量(tenant traffic)。这个隧道的两端都是每个物理服务器上的 tunneling bridge。使用 Patch port 来将 br-int 和 br-tun 连接起来。
# L _& U( N$ ?# `9 A3 k(5)对于每一个 VLAN 或者 Flat 类型的网络,使用一个 veth 或者一个 patch port 对来连接 br-int 和物理网桥,以及增加 flow rules等。
+ @. Z2 ]/ Z( |(6)最后,Neutron L2 Agent 启动后会运行一个RPC循环任务来处理 端口添加、删除和修改。管理员可以通过配置项 polling_interval 指定该 RPC 循环任务的执行间隔,默认为2秒。
$ F; g6 c7 H! q3 c4 ^* G, l2.3 创建虚拟网络和子网$ k2 X1 H3 I2 q4 ]. Z" ^0 e. f
2.3.1 创建命令& K& {6 W i& u& _9 I: C
s1@controller:~$ neutron net-create net1 (或者 Admin 用户运行 neutron net-create net1 --provider:network_type vlan --provider:physical_network physnet1 --provider:segmentation_id 101。效果相同)+ l) [- n# K. @& G* n
Created a new network:
W0 S& D3 \% e+---------------------------+--------------------------------------+. ?* K9 F* T0 _ v2 I' g
| Field | Value |: R6 | A A C) S: y; e- v& h
+---------------------------+--------------------------------------+
/ v8 O; u$ y2 F8 \+ c, I3 f| admin_state_up | True |
. k/ n+ u$ A& }2 }& x| id | dfc74f44-a9f2-4497-a53d-1723804a49a8 |
/ l' |7 o/ r/ ? d4 i1 t| name | net1 |
# t3 f0 |& }0 s) F6 G( \| provider:network_type | vlan |; }4 h: E+ F8 A. \
| provider:physical_network | physnet1 |
4 e) P# a/ Y5 `# O3 w1 `1 q8 C4 Z, N- h| provider:segmentation_id | 101 |5 A. ]4 E& D/ R3 h
| router:external | False |
+ {' X6 p+ s9 K$ c' I| shared | False |. L1 n# L0 K2 ? o, J' M$ t
| status | ACTIVE |
+ g' P4 e: i$ g! `1 D; u| subnets | |
, [4 l% s e+ C. v: ]| tenant_id | 74c8ada23a3449f888d9e19b76d13aab |3 j# U7 n) e1 H2 f# r
+---------------------------+--------------------------------------+ 9 R2 f4 }* v ?5 t- ]8 q
s1@controller:~$ neutron subnet-create subnet1 10.0.0.0/24 --name net1
" s9 K) `* ?; c8 H" }1 |; K- ^; j) N2 J, g
2.3.2 Neutron 代码实现5 z% x3 z0 {* g' O% p' I
做完以上的步骤之后,用户就可以在 subnet 上 boot 虚机了。
2 d) V# _2 b4 B+ x% Y; N( Yboot 虚机的过程中,Nova 依次会:; O+ k, O; `4 q) i0 e
(1)调用 Neutron REST API 申请一个或者多个 port。Neutron 会根据数据库中的配置来进行分配。8 A P' \' W2 U. p9 }& o+ x4 N
(2)在计算节点上,Nova 调用 ovs-vsctl 命令将虚机的 VIF 被 plug 到 br-int 上。8 q4 I R( V, g( O5 }" p0 e
(3)启动虚机。6 }. T% ~& F2 p6 c5 M' u
Neutron L2 Agent 的循环任务每隔两秒会依次:
8 n2 d: j3 @' o+ @ Y1 h(1)调用 ”ovs-vsctl list-ports“ 命令获取到 br-int 上的 port,再根据上次保存的历史数据,生成所有变更端口的列表(包括添加的、更新的、删除的端口)。比如:' R m3 B6 M, X) A4 b f3 k
{'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'])}
/ w9 k2 j7 e: ]# U) }! j' `( s& f1. ]. j( v( U" F, A+ q
(2)为每一个待处理端口,根据其 ID 从 DB 中取得其详细信息。比如:
9 D- I% u$ w3 N' r- g9 ~$ b{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'}
6 z0 `0 V" s* w; z8 ]1- {# r4 u3 {+ N; B. b4 \
(3)针对每一个增加或者变更的 port,设置 local VLAN Tag;调用 ”ovs-ofctl mod-flows “ 命令来设置 br-tun 或者 物理 bridge 的 flow rules;并设置 db 中其状态为 up。- X4 m/ K4 y0 t: t+ R4 p
(4)针对每一个被删除的 port,设置 db 中其状态为 down。/ q# f' G# y; B( n: V" i( ?9 ?) _
2.4 Neutron 虚拟网络" [' n( p" `" w: E4 Q7 Z, F
(1)一个计算节点上的网络实例
6 s! a. Y2 G- i6 ^3 |它反映的网络配置如下:- O7 j7 d; \4 ]4 G& Q
Neutron 使用 Open vSiwtch。/ i( i3 O& D0 ?1 j( E5 j ~0 l- N6 s
一台物理服务器,网卡 eth1 接入物理交换机,预先配置了网桥 br-eth1。% g0 ^# Z; g/ k: k7 M% U5 E
创建了两个 neutron VLAN network,分别使用 VLAN ID 101 和 102。
, O7 y1 k) k# C1 o( |该服务器上运行三个虚机,虚机1 和 2 分别有一个网卡接入 network 1;虚机2 和 3 分别有一个网卡接入 network 2.
/ b& ^% G" w: V _; `3 l# p- x& S$ k5 I
Neutron 在该计算节点上做的事情:2 m9 {; z8 ?2 n& J4 w5 _
创建了 OVS Integration bridge br-int。它的四个 Access 端口中,两个打上了内部 Tag 1,连接接入 network 1 的两个网卡;另两个端口的 VLAN Tag 为 2。( T1 r: U. U/ z9 `
创建了一对 patch port,连接 br-int 和 br-eth1。
. x# d! H* O& C7 T设置 br-int 中的 flow rules。对从 access ports 进入的数据帧,加上相应的 VLAN Tag,转发到 patch port;从 patch port 进入的数据帧,将 VLAN ID 101 修改为 1, 102 修改为 2,再转发到相应的 Access ports。
* x3 ~" @& a* Z1 J设置 br-eth1 中的 flow rules。从 patch port 进入的数据帧,将内部 VLAN ID 1 修改为 101,内部 VLAN ID 2 修改为 102,再从 eth1 端口发出。对从 eth1 进入的数据帧做相反的处理。7 K3 o3 d9 y1 S# h
(2)再加上另一个连接到同一个物理交换机的服务器(加上 neutron 网络使用的 VLAN ID 为 100,物理 brige 为 br-eth0):
% _6 H+ \1 p9 A5 ~# y; g( E
: V2 |: r c. lNeutron 实现了基于物理 VLAN 交换机的跨物理服务器二层虚拟网络。
U' w- g' [5 v0 M! f$ F, X(3)连接到同一物理交换机的网络节点的情况1 V2 n' _" d) A# k! R, [# i
$ Z5 T5 m+ G4 i8 @: P _
(4)网络流向
: k1 F$ R6 u% z6 t' Q3 w不同物理服务器上的虚机,如果 VM1 和 VM2 属于同一个 tenant network 的同一个subnet,那么两者的通信直接经过 物理交换机 进行,不需要做到网络节点。如图10 所示。) J# R0 V4 P# T0 ]/ B0 H
相同物理服务器上的虚机,如果 VM1 和 VM2 属于同一个 tenant network 的同一个subnet,那么两者的通信直接经过 br-int 进行。+ `/ c( K, X, H, p
. P3 P- G. c7 F9 g- V, t对其他虚机之间数据交换情形,都算作跨子网的数据流向,都需要经过网络节点中的 Router 进行 IP 包的路由。(也可以直接使用连接物理交换机的物理路由器)。9 g/ g8 b/ ^% v) r3 m
4 L4 H8 Y0 ~3 G, ^7 U3 |) j
|
|