易陆发现互联网技术论坛

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

Neutron Linux Bridge + VLAN/VXLAN 虚拟网络

[复制链接]
发表于 2019-10-25 11:00:14 | 显示全部楼层 |阅读模式
购买主题 本主题需向作者支付 2 金钱 才能浏览
 楼主| 发表于 2019-10-25 11:22:20 | 显示全部楼层
修改配置文件
9 g' x) ^5 T' dcontroller节点' j9 k+ K8 w" z1 z! C) E( m# v
4 c( W  Q* y7 u; a! w$ Y' D% G
/etc/neutron/plugins/ml2/ml2_conf.ini
% V  `9 w/ a; H* H. N
+ `: M( s: l  B3 K% ]# c1 L# ?- P[ml2]
& E8 ?4 _) A. s- B, X8 _2 ~. l4 etype_drivers = flat,vxlan
* J& l; P% I& W8 |, b; Wtenant_network_types = vxlan
* W4 }# N, }1 E3 e; Q7 omechanism_drivers = openvswitch,l2population
, ~1 p" P- \% y* [/ `$ k# y% Oextension_drivers = port_security
. ~" f6 q- f! S0 w- u
4 z( ^( e: Q4 d% r7 V3 l6 U1 E6 k[ml2_type_vxlan]
, M8 h' ~: y  C3 g: |) Lvni_ranges = 1001:2000
+ r+ F8 a7 J2 T, k- ~1 @# H  E, }) z8 R
[securitygroup]6 y; R/ I1 D& P4 B2 ?
enable_ipset = true
+ @) o1 w' d  G9 d8 O! T$ G: |# n, C; u5 R: j9 s/ F
/etc/neutron/l3_agent.ini
; p* w4 W9 u) F1 B) P- c& N% I: f# |3 @1 w
[DEFAULT]" U" t$ p% s1 i9 n. N
external_network_bridge = br-ex
, V, X/ d' q  Y# Hinterface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
: s* D, u" Y5 M1 M& R- p4 ^
* u3 h( E( w) s$ H4 A5 R9 K! c/etc/neutron/dhcp_agent.ini0 a& |/ D9 l: w+ N/ L

4 W8 u; c* \, q# O) A, m1 T[DEFAULT]# {% |: B  c! |) u1 O7 v: x
interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver
4 V' J; F+ A4 }9 I. G$ m# wdhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
5 T! o# N. s5 X2 r  aenable_isolated_metadata = True" T) I' o. K. q& M+ M. Q* |% N

/ q5 v: X2 G/ o$ U' L/etc/neutron/plugins/ml2/openvswitch_agent.ini: Q: v! Y. \, s0 U
2 z* \) X; |. P, i) ~# d
[ovs]1 N$ [9 E4 ]' r2 O8 ~6 P
bridge_mappings =
9 b! g: y5 u# q; Gtunnel_bridge = br-tun2 l' I# Q$ u& U% c5 P
local_ip = 10.10.10.10
! n! ]3 T$ {" F( _" G. n- I) I# }. w2 @! H" q* U* P0 }
[agent]
* C! M% g/ k; f  x3 Ztunnel_types = vxlan- t2 V" _; Q6 n! {
l2_population = True8 c0 ^1 H0 S8 U1 u
( q. k2 o4 Y% Z1 F) t, M
[securitygroup]
( x1 w) k1 K4 @; o6 |firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
9 U6 U  n) s7 y& henable_security_group = true
8 N! P7 A  A" e
3 n# W  d5 @* A2 H$ B0 f% s5 scompute1节点& [  e" d5 b5 G+ b3 w, M% \

" X/ P' \' c6 Z/etc/neutron/plugins/ml2/openvswitch_agent.ini6 r3 X: [% e( R% T+ q  _- ^
1 l9 n; n3 m0 z
[ovs]3 V! S" v7 n2 U3 O* x" N  l
bridge_mappings =
! G; R$ F2 U; a3 Btunnel_bridge = br-tun
2 G6 e5 X; i3 p" D2 L6 Alocal_ip = 10.10.10.11
9 B9 w/ H2 N, n' h$ Z4 y, ~
2 V8 O  q+ p9 A- Q- i[agent]
7 O4 U+ X" O" H: x5 \tunnel_types = vxlan
+ b% G7 q* c8 I/ }l2_population = True
, |  W- c1 y, o: S6 J6 b9 ]3 f$ R6 i5 Y5 R" e4 L- j! }/ r$ `6 c
[securitygroup]
8 g. g: Q9 n+ K# pfirewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver; x8 E. N3 |' u* @7 E
enable_security_group = true: I& i/ }! P, W

; e# _! B: o7 L  j/ J, bcompute2节点
  n; d# W  V/ Y' C' h+ c# }% b. h/ e: m
# Y/ q3 T& I0 Y' S8 ]. V/ }[ovs]
5 t% c5 m3 K. t+ R( Jbridge_mappings = : L: |. j$ ]$ l7 m
tunnel_bridge = br-tun/ [$ ~  E* c& Q8 e% o/ w
local_ip = 10.10.10.12) j# k6 p+ B8 W1 d
" x- d% C5 f6 S
[agent]
' Y- B5 @* }! X$ Y! }tunnel_types = vxlan
# p7 U1 V% Y2 \& U- Q/ rl2_population = True
" A0 [  O: v' F: @: u( ^5 v$ l. x1 {4 x5 U/ F- i9 q! J5 m
[securitygroup]
1 S& g2 @% r$ M2 A0 J. Rfirewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver; v: Z0 \! l/ h( A) U
enable_security_group = true! f0 y4 |4 m' t4 c$ @; T' G
! j5 \5 _  U: s5 g
重启网络相关服务。7 x5 a2 A3 X0 n* V$ H4 u

% \. z, m, O1 T再次查看网络服务信息 2 i* i+ a- F5 h8 p
————————————————7 B2 K% a! Q# h
 楼主| 发表于 2019-10-25 11:23:29 | 显示全部楼层
虽然大部分的OpenStack 部署环境中,都会使用 Open vSwitch 来作为虚拟交换机来实现二层网络功能,但是Neutron 仍然支持使用 Linux bridge 作为虚拟交换机来实现二层网络。本文就此做些分析和说明。 : L: _1 h0 E4 q7 b0 X$ R2 l
同时要指出的是,OpenStack 官方已经把 linux bridge 实现标记为 legacy 的了,文档从 2016 年后也没怎么更新了。这是因为,linux bridge 和 OVS 相比,只支持基本的网络功能即二层交换,但不支持VLAN 标签和隧道。因此,linux bridge agent 利用linux 内核功能(VLAN 子接口和 VXLAN 接口)来实现VLAN 标签和隧道。
6 s/ f) s* l, S' W
8 H  |1 g9 {& N$ u9 \' S, u6 O 1. 测试环境
  r8 R3 c# s4 ?2 w. @0 a以下面的环境为例(网络节点上):
  n0 r) ]4 D6 K(1)linux bridge
$ F7 H# }& b; j1 v* W
! Q, O+ u* p2 J1 nroot@controller:/home/sammy# brctl show1 B' d# E; k/ B: ?
bridge name     bridge id               STP enabled     interfaces8 P6 z4 a7 W, W# Q; t
brq85925305-b4          8000.563534c8d02d       no              tap0bb8efeb-10
1 S: b5 G+ ]" Y3 B+ N1 i" E( }                                                        tap798c87d1-a2
2 A7 g) ~! e4 D- K" ~                                                        vxlan-25! ^/ U; A' s* [6 [- K' S
brq96609bfa-0e          8000.0050569c4d94       no              ens224
: S/ B2 E* h0 Z/ f" Z* T6 b+ M  V( m                                                        tap60dbdc2f-a0
( {% [" m2 O. _brq971ffda2-e5          8000.a6acb08e4fd6       no              tapb1eaae00-e5$ S* j- ~' Q* Z  u$ \3 g% C
                                                        tapf70543dd-0f
$ x- j! d. y/ v( {* B3 Y                                                        vxlan-10
+ k* M' b3 D( S) E" B' C. C
- [( T7 R+ g+ \! U, o6 c  ~(2)OpenStack 网络和 network namespace:
8 T% ~/ |- _; n# g6 |, ? * w2 T2 \5 z1 v! w
root@controller:/home/sammy# neutron net-list
" g9 z2 x8 j" W  ~& C. P! S+--------------------------------------+---------+-----------------------------------------------------+
6 M3 L1 K! b5 w* x" z* r+ w| id                                   | name    | subnets                                             |( t& {5 Z" ~9 i1 `' B' i. n
+--------------------------------------+---------+-----------------------------------------------------+
$ l* v7 Y$ S& S- i' K& G| 96609bfa-0e22-4bb7-8dba-6ef532ea6076 | extnet  | afa7d205-3026-439f-aca7-295a9f9b2a71 10.62.227.0/24 |4 T1 E; r' B3 L+ P
| 971ffda2-e567-40a0-a2c8-b31a577fd4d3 | appnet  | 4c68eacb-bf3e-408a-a941-94e93eddb22b 11.0.0.0/24    |
. r! y8 C9 L- K3 x4 U|                                      |         | 3d596991-de8f-4ae4-8913-89426a8abbd7 10.0.0.0/24    |# [; r$ L- V7 d* B& E5 \1 D/ x
| 85925305-b477-4cc6-9654-67d9bf1e7cd8 | appnet2 | 4575c7f1-7f08-4917-9904-ec65af38619b 20.0.0.0/24    |
7 Z! w' b9 t  B+--------------------------------------+---------+-----------------------------------------------------+
/ T5 I1 R' X' M, _8 C! j5 y) uroot@controller:/home/sammy# ip netns! i1 r$ _* A  i" W+ d/ }# g
qdhcp-85925305-b477-4cc6-9654-67d9bf1e7cd8 (id: 2)
- N+ M+ k# H+ _) _3 xqdhcp-971ffda2-e567-40a0-a2c8-b31a577fd4d3 (id: 1). b1 L' c! G6 u; p
qrouter-39a77439-8a28-49c1-bf97-ac931510631b (id: 0)- T- v" ~2 F  d! N! y

8 S7 L) l1 Q8 @. f4 N  i) q4 ](3)示意图:8 d8 E& P7 j' Z
0 z* Z/ g# u. f
(4)说明:
8 b5 {! h+ b3 e) k2 f•        qdhcp 和 qrouter 都是 linux network namespace 实例
3 K# R0 Q+ L/ V8 \7 S4 y7 u! \•        qdhcp network namespace 的数量等于启用了 DHCP 的 Neutron network 的数量。' T6 V) T0 c/ p# |: A1 H
o        当一个 network 中存在至少一个 subnet 启用了 DHCP 之后,会有一个 qdhcp network namespace 被创建出来;2 a1 a! b) w, H+ Q- q- ^
o        当一个 network 中多个 subnet 启用了 DHCP 时,它们共用一个 qdhcp,以及 dnsmasq。
% e( x$ E/ H+ p4 wo        其 name 使用 network id,比如 qdhcp-85925305-b477-4cc6-9654-67d9bf1e7cd8
9 k- H  s% S) q, o8 N•        qrouter network namespace 的数目等于 router 的数目,也就是说,系统中一共有几个 router,那么就存在几个 qrouter network namespace' h' {! D: z# F) s9 r& N& O
•        brq linux bridge 的数目等于 neutron network 的数目,其 name 是 network id 的前几位,比如 brq96609bfa-0e' E% o% H. m  z
•        一个 network 的 qdhcp network namespace 和其 brq linux bridge 一定有连接5 A+ `: G& e5 |7 i/ C5 l4 z( r
•        qrouter 之内的 network interface 分两种,一种是 qr 开头的,每个连接到 router 之上的 subnet 都有一个;还有一个是 qg,每个连接到 router 的 external subnetwork 有一个
! S! C3 j; E9 h4 K•        qrouter 的每个 network interface 都通过 veth 连接到所在网络的 qbr linux bridge 上# p6 c, h: x7 m3 B: X. h! R: `
•        qbr linux bridge 连连接两种物理设备,一种是 vxlan interface,每个 tenant network 有一个,另一种是在 physical network 对应的物理网卡上创建的子接口(sub-interface)% }6 g  O& n. r- T5 E
•        对于 physical network 的 qbr 来说,用户可以指定它,并且在linuxbridge_agent.ini 中通过 bridge_mappings = List of <physical_network>:<physical_bridge> 进行配置;也可以不指定,此时 agent 会创建它。当同时配置了 physical bridge 和 physical interface 时,前者优先。
& C0 @1 G, ?' W+ I如果 external network 中有多个 subnet 的话:
3 e; t% F" {* @1 L& {7 x; M(1)每个 qrouter 只允许有一个 External Gateway,也就是说它只有一个 qg network interface。当 external network 添加多个 subnet 之后,只有第一个被当作 external subnet,其余的都会被当作 internal subnet。
( S* Y3 s( {8 _# R& ?5 Q(2)在 qrouter 的路由表之中,2 e7 A# S7 R4 ]8 }' f; v1 K" ]2 U
1 y5 O% I. \  g9 \4 t# C2 w. T
root@controller:/home/sammy# ip netns exec qrouter-39a77439-8a28-49c1-bf97-ac931510631b route
" ~5 E9 B: |* n6 z8 MKernel IP routing table
& t" c' a; d$ sDestination     Gateway         Genmask         Flags Metric Ref    Use Iface
4 I9 m% w  i6 `2 ddefault         10.62.227.1     0.0.0.0         UG    0      0        0 qg-e09fce07-cd5 v" t. c8 X  }/ c
10.0.0.0        *               255.255.255.0   U     0      0        0 qr-b1eaae00-e5
0 c- }( A5 f4 ]2 b- l# ~. L0 x! p10.62.227.0     *               255.255.255.0   U     0      0        0 qg-e09fce07-cd
! o0 d4 @; {/ z7 U: D& h10.62.228.0     *               255.255.255.0   U     0      0        0 qg-e09fce07-cd) {6 a% X' i+ o/ \1 O" _
10.62.228.0     *               255.255.255.0   U     0      0        0 qr-124ff148-b76 E- T2 Y% s' r
11.0.0.0        *               255.255.255.0   U     0      0        0 qr-16d9b0cc-38& V% _/ r0 z# r/ {2 {
20.0.0.0        *               255.255.255.0   U     0      0        0 qr-0bb8efeb-10: ~; w- [5 @5 D% t
; J+ D5 H$ j" Y% v, ^- d% p

$ s8 t0 S' D; I' ]; `; J2. linux-bridge-agent 工作过程分析
) \* c5 j- L0 N. a- d8 k(1)linuxbridge-agent 会启动一个循环,不断扫描上面红框中的 tap 设备9 E0 F4 i! T- Y5 ]. t' M

) e: L' w" X! E' t- x0 e" {2 W    def daemon_loop(self):
: G1 P: ^7 A' M' T! n...+ K; _( t0 ]9 a) C! h( u
        while True:
9 d  P0 n1 F' r2 d% [' F, X            start = time.time()
# w% J7 @# N* T: P) A. ..- E2 p1 j. q. o, j9 o
+ _& i$ L0 V0 z" J/ E
            device_info = self.scan_devices(previous=device_info, sync=sync)
! B! z) `) f4 I$ S4 U5 |            sync = False
* l7 y: A: ?" Y* K" ~3 n1 \2 M' c
0 m9 V) h2 K5 H; D' [            if (self._device_info_has_changes(device_info)
  Y* q% L( u; W& O8 a                or self.sg_agent.firewall_refresh_needed()):/ L& V2 C# f* N7 B# j3 p) S
                LOG.debug("Agent loop found changes! %s", device_info)) I# ]! Y: F$ u( D9 Q
                try:. G+ p5 Y) r5 @( y, ^  \3 x
                    sync = self.process_network_devices(device_info)8 n" D+ B4 }: c( U, s$ }
                except Exception:$ O9 F9 \; L& |* h
                    LOG.exception(_LE("Error in agent loop. Devices info: %s"),' S/ K9 b4 _# O4 f3 v! o
                                  device_info)7 K' P: y, n" B3 K& u+ `
                    sync = True
* ^$ d; a' C; b# j% k
9 D% |, Q& ?0 s( p  I& j$ {这是它首先找到的 devices:
+ H3 r1 c2 o1 Q" u(Pdb) p bridge_lib.get_bridge_names()
0 \+ K- m+ v6 F4 B9 p2 R  A['brq85925305-b4', 'virbr0', 'brq971ffda2-e5', 'virbr0-nic', 'tapb1eaae00-e5', 'tapf70543dd-0f', 'vxlan-25', 'vxlan-10', 'tap0bb8efeb-10', 'lo', 'tap60dbdc2f-a0', 'tap795e6e86-94', 'ens224', 'ens192', 'ens160', 'tap798c87d1-a2']* {/ o( p9 V! j+ }6 W
然后过滤出 tap 设备:9 o0 u0 W. [1 Z+ F
get_all_devices()->set(['tap0bb8efeb-10', 'tap60dbdc2f-a0', 'tap795e6e86-94', 'tap798c87d1-a2', 'tapb1eaae00-e5', 'tapf70543dd-0f'])
  X+ j: U6 k$ G/ ?2 D(2)根据 previous 中保存的历史数据,再接合服务器端和本地更新时间,计算出需要更新的tap设备列表:; U, Q7 x7 M: k9 d8 _
{'current': set(['tapf70543dd-0f', 'tap60dbdc2f-a0', 'tapb1eaae00-e5', 'tap795e6e86-94', 'tap0bb8efeb-10', 'tap798c87d1-a2']), 'timestamps': {'tapf70543dd-0f': 1476956816.672447, 'tap60dbdc2f-a0': None, 'tapb1eaae00-e5': 1476956816.672447, 'tap795e6e86-94': None, 'tap0bb8efeb-10': 1476689797.1378036, 'tap798c87d1-a2': 1476689701.1349163}, 'removed': set([]), 'added': set(['tapf70543dd-0f', 'tap60dbdc2f-a0', 'tapb1eaae00-e5', 'tap795e6e86-94', 'tap0bb8efeb-10', 'tap798c87d1-a2']), 'updated': set([])}
5 W1 `+ D0 Y; |! H: u- _# @  (3) 通过 RPC 获取 tap 设备的详细信息
% l* k2 K; h0 M; C
( G+ W+ [& [, @5 `: ?- F7 R9 t# Z(Pdb) p devices; p- m# L4 ~/ q( o' [1 K/ R
set(['tapf70543dd-0f', 'tap60dbdc2f-a0', 'tapb1eaae00-e5', 'tap795e6e86-94', 'tap798c87d1-a2', 'tap0bb8efeb-10'])1 n/ U& }3 e" ^6 y

2 }' D& s! X8 T3 \
5 c7 b' }% p5 V2 Udevices_details_list = self.plugin_rpc.get_devices_details_list
, Q5 j+ M* |' b# g5 r, W8 x% f7 R9 k3 D
(Pdb) p devices_details_list
' I% I9 N7 N3 H[{u'profile': {}, u'network_qos_policy_id': None, u'qos_policy_id': None, u'allowed_address_pairs': [], u'admin_state_up': True, u'network_id': u'971ffda2-e567-40a0-a2c8-b31a577fd4d3', u'segmentation_id': 10, u'device_owner': u'network:dhcp', u'physical_network': None, u'mac_address': u'fa:16:3e:5c:bf:11', u'device': u'tapf70543dd-0f', u'port_security_enabled': False, u'port_id': u'f70543dd-0f1b-4e1d-93c7-33f4f3d7a709', u'fixed_ips': [{u'subnet_id': u'3d596991-de8f-4ae4-8913-89426a8abbd7', u'ip_address': u'10.0.0.10'}], u'network_type': u'vxlan', u'security_groups': []}, {u'profile': {}, u'network_qos_policy_id': None, u'qos_policy_id': None, u'allowed_address_pairs': [], u'admin_state_up': True, u'network_id': u'96609bfa-0e22-4bb7-8dba-6ef532ea6076', u'segmentation_id': None, u'device_owner': u'network:router_gateway', u'physical_network': u'provider', u'mac_address': u'fa:16:3e:77:78:86', u'device': u'tap60dbdc2f-a0', u'port_security_enabled': False, u'port_id': u'60dbdc2f-a01b-446d-bb5b-26ffac19a045', u'fixed_ips': [{u'subnet_id': u'afa7d205-3026-439f-aca7-295a9f9b2a71', u'ip_address': u'10.62.227.151'}], u'network_type': u'flat', u'security_groups': []}, {u'profile': {}, u'network_qos_policy_id': None, u'qos_policy_id': None, u'allowed_address_pairs': [], u'admin_state_up': True, u'network_id': u'971ffda2-e567-40a0-a2c8-b31a577fd4d3', u'segmentation_id': 10, u'device_owner': u'network:router_interface', u'physical_network': None, u'mac_address': u'fa:16:3e:81:1b:37', u'device': u'tapb1eaae00-e5', u'port_security_enabled': False, u'port_id': u'b1eaae00-e504-41f8-93a4-643687155bea', u'fixed_ips': [{u'subnet_id': u'3d596991-de8f-4ae4-8913-89426a8abbd7', u'ip_address': u'10.0.0.1'}], u'network_type': u'vxlan', u'security_groups': []}, {u'profile': {}, u'network_qos_policy_id': None, u'qos_policy_id': None, u'allowed_address_pairs': [], u'admin_state_up': True, u'network_id': u'96609bfa-0e22-4bb7-8dba-6ef532ea6076', u'segmentation_id': None, u'device_owner': u'network:dhcp', u'physical_network': u'provider', u'mac_address': u'fa:16:3e:5f:94:7d', u'device': u'tap795e6e86-94', u'port_security_enabled': False, u'port_id': u'795e6e86-94af-4b72-ae1a-5a324a017774', u'fixed_ips': [{u'subnet_id': u'afa7d205-3026-439f-aca7-295a9f9b2a71', u'ip_address': u'10.62.227.150'}], u'network_type': u'flat', u'security_groups': []}, {u'profile': {}, u'network_qos_policy_id': None, u'qos_policy_id': None, u'allowed_address_pairs': [], u'admin_state_up': True, u'network_id': u'85925305-b477-4cc6-9654-67d9bf1e7cd8', u'segmentation_id': 25, u'device_owner': u'network:dhcp', u'physical_network': None, u'mac_address': u'fa:16:3e:25:27:99', u'device': u'tap798c87d1-a2', u'port_security_enabled': False, u'port_id': u'798c87d1-a2d8-4df7-b7fc-5ab30918a0de', u'fixed_ips': [{u'subnet_id': u'4575c7f1-7f08-4917-9904-ec65af38619b', u'ip_address': u'20.0.0.100'}], u'network_type': u'vxlan', u'security_groups': []}, {u'profile': {}, u'network_qos_policy_id': None, u'qos_policy_id': None, u'allowed_address_pairs': [], u'admin_state_up': True, u'network_id': u'85925305-b477-4cc6-9654-67d9bf1e7cd8', u'segmentation_id': 25, u'device_owner': u'network:router_interface', u'physical_network': None, u'mac_address': u'fa:16:3e:9f:18:a9', u'device': u'tap0bb8efeb-10', u'port_security_enabled': False, u'port_id': u'0bb8efeb-108f-409a-82e7-c4c20f0d4f69', u'fixed_ips': [{u'subnet_id': u'4575c7f1-7f08-4917-9904-ec65af38619b', u'ip_address': u'20.0.0.1'}], u'network_type': u'vxlan', u'security_groups': []}]/ {5 T0 @' q) ~& b- B
7 U' z/ U6 z+ U' d) [1 Z, U0 o' U( p
(4) 对需要处理的设备,调用 self.process_network_devices(device_info) 函数进行处理
+ F' H. q* o4 s+ e. }(5). 调用 plug_interface
! r1 M- S$ k# N# l+ |- z/ X% cinterface_plugged = self.mgr.plug_interface(network_id, segment,device, device_details['device_owner'])
5 `2 x( G0 Q0 p% d, }(6). 需要的话,使用已经配置的或者新建 linux brige,并将 physical interface 设备加入其中2 ~) w* n) e: D+ M( D
bridge_name = self.get_existing_bridge_name(physical_network) #获取为 physical network 配置的 linux bridge
6 O6 j' C# v4 Tbridge_name = self.get_bridge_name(network_id) #或者根据 network id 生成 bridge name
+ c: k: \9 L" _, `  s(7).根据不同的网络类型,分别处理 vxlan bridge,flat bridge 和 vlan bridge
$ \  P/ D  N' F
3 a& f/ V) ]4 F8 p    def ensure_physical_in_bridge(self, network_id,
7 D% y+ {' B: R9 P                                  network_type,
; K4 O; [6 M; o  ?: V. D                                  physical_network,
, @9 T+ ^( K  h) R- l8 m( L9 U7 a3 N                                  segmentation_id):, I" a; o1 P0 s+ y
        if network_type == p_const.TYPE_VXLAN:$ b, d3 P# J3 E& S
            if self.vxlan_mode == lconst.VXLAN_NONE:
$ y  k7 P: H) @+ J7 p" B                LOG.error(_LE("Unable to add vxlan interface for network %s"),5 Q% Z# u2 f9 a  V1 h
                          network_id)/ Z4 w3 b" i! O# S& ^2 n! z
                return
8 {- M; N, T8 C& `+ |            return self.ensure_vxlan_bridge(network_id, segmentation_id)
- }! _& ?  T& n6 U$ @  V& O: A: W; x; }4 A) _
        # NOTE(nick-ma-z): Obtain mappings of physical bridge and interfaces& C5 Y2 }4 e; f# G) M0 M3 A. J
        physical_bridge = self.get_existing_bridge_name(physical_network)
" M& R5 p# i, o+ P        physical_interface = self.interface_mappings.get(physical_network)
" @* j" W0 D% U$ Y        if not physical_bridge and not physical_interface:
! {9 y6 t$ H( M            LOG.error(_LE("No bridge or interface mappings"
. [& O% o8 ?3 b# }/ ^# P                          " for physical network %s"),
! b) \- Y1 i& `+ Q( J                      physical_network)
5 M& ^# `  D) K- b4 v. ~            return
, @& @+ C) @, v$ r6 X        if network_type == p_const.TYPE_FLAT:
4 |9 ?, ?/ W8 _( K7 {" M! U            return self.ensure_flat_bridge(network_id, physical_bridge,
5 }, s' j/ A: T7 ^# j, I                                           physical_interface)* |) u. g! a# C7 F, Q8 s$ D
        elif network_type == p_const.TYPE_VLAN:$ r0 Y0 }# U  a8 @  c
            return self.ensure_vlan_bridge(network_id, physical_bridge,
' b+ a) U$ }. H: e8 X                                           physical_interface,
2 @+ R$ H( D4 i1 N. Z& e, e                                           segmentation_id), A, r9 f8 y0 _( Q- N

0 L6 p+ I$ O& w! i对于 flat 类型的网络,调用 ensure_physical_in_bridge5 l" u" H; d# ~" i3 k
def ensure_physical_in_bridge(self, network_id,network_type,physical_network,segmentation_id)
& g! R* Y9 i% ]0 V  if network_type == p_const.TYPE_FLAT:7 O. [5 e( m1 K! D* J( j
    return self.ensure_flat_bridge(network_id, physical_bridge,physical_interface)- f8 y! t3 o3 z+ m
如果有配置 physical bridge 的话,使用它;否则创建 bridge,并将物理网卡配置的 ip 地址和 gateway 从网卡挪到 linux bridge' n* q0 g, I4 d5 l* P' E( ~! Q! s
; Q5 n9 c6 Q( o( l' n/ x% q& d* R
def ensure_flat_bridge(self, network_id, phy_bridge_name,physical_interface):
5 l% S$ K0 a( i  M0 S) B  """Create a non-vlan bridge unless it already exists."""
5 q1 ]  C3 U' [! w% l8 d  if phy_bridge_name:
# `: W' z) I: N/ [/ x) D4 l# ]  W/ J. N    return self.ensure_bridge(phy_bridge_name) #获取预先配置好的 linux bridge
5 s0 D$ g) o9 h8 X3 s4 T  else:
+ T' J: N6 s! c+ g' A+ M& [    bridge_name = self.get_bridge_name(network_id)- Q+ }. m! m2 t& y  v  M' ~1 }
    ips, gateway = self.get_interface_details(physical_interface)' g/ P, k/ O( w
    if self.ensure_bridge(bridge_name, physical_interface, ips,gateway): #创建 bridge. W9 E" n% i6 Q. o& g' `% P
    return physical_interface
2 ~, L, K# ]2 G6 ^3 c . H0 o6 Y0 f9 r. s4 `
对于 vxlan 类型的 network,需要创建 vxlan interface
$ v+ x! f+ |0 ^4 m  I
" g$ ?+ H( B+ r/ v8 h: W    def ensure_vxlan_bridge(self, network_id, segmentation_id):
* `* W  _' |$ ~5 g! d0 F        """Create a vxlan and bridge unless they already exist."""
3 D. W9 R( _6 y6 ?: A! w        interface = self.ensure_vxlan(segmentation_id)
1 i& o6 g% B1 @1 ~/ P, u        if not interface:
% M# ^+ m- R; F% n+ L0 Z# F            LOG.error(_LE("Failed creating vxlan interface for "
. e" X. q1 U- _0 o# D( u+ X( J                          "%(segmentation_id)s"),
- ^6 h7 M3 c2 a$ c                      {segmentation_id: segmentation_id})
3 w0 I2 R% ]; ?            return
% y6 }) v4 k/ e# X4 }+ `        bridge_name = self.get_bridge_name(network_id)
) b% z4 b" H& ~) k; o: g# ]        self.ensure_bridge(bridge_name, interface)
1 K' k' M' |2 G1 ^! Z/ _% J/ f( K2 Y        return interface
5 y9 }- L& g, P& \. @+ M( J$ K , y3 m2 F/ z- c  R$ X4 c7 \
创建 vxlan interface:" S' q4 R. T7 E0 ~

- r; o- c9 B. s1 ^. t" i8 V0 f    def ensure_vxlan(self, segmentation_id):
1 ]0 K( e+ h4 }+ o2 P! o& A; C        """Create a vxlan unless it already exists."""0 Z- y* e9 ?& U. [
        interface = self.get_vxlan_device_name(segmentation_id)
! A! X. H! _* P5 h! A5 q        if not ip_lib.device_exists(interface):
; k2 t4 N7 C. D9 B$ v! {$ [4 g            LOG.debug("Creating vxlan interface %(interface)s for "
' m6 m3 {* U1 f1 G                      "VNI %(segmentation_id)s",0 N$ G! ^9 |2 v2 z& }0 K
                      {'interface': interface,
& F! {) Q9 ^9 Q+ y                       'segmentation_id': segmentation_id})
" J# m" m* c+ p. D. w9 f            args = {'dev': self.local_int}
+ A7 `0 h, A' i. U8 W3 M$ G            if self.vxlan_mode == lconst.VXLAN_MCAST:
) y0 t9 C, U5 W7 f                args['group'] = self.get_vxlan_group(segmentation_id)
- E5 l; d0 S) y            if cfg.CONF.VXLAN.ttl:
$ Y0 B7 N' U) T" q8 j. O! W: u1 X/ G: Q4 P                args['ttl'] = cfg.CONF.VXLAN.ttl" |" g. k5 ^9 Y0 J
            if cfg.CONF.VXLAN.tos:
$ P" e  [; u; E                args['tos'] = cfg.CONF.VXLAN.tos0 Z' S& M5 Z* U5 K& k6 u7 @
            if cfg.CONF.VXLAN.l2_population:
8 G4 `" a# s6 I5 Q                args['proxy'] = cfg.CONF.VXLAN.arp_responder3 Y- _% o% V# k4 p) T/ |
            try:, Z% b; f  l7 d6 l' r  n2 x
                int_vxlan = self.ip.add_vxlan(interface, segmentation_id,
4 E/ J$ M" A5 G& y- ?6 q* x* T                                              **args)
1 g, W( p' H% U5 W3 R% q, ^2 ^ 4 Q5 u4 x  _7 N6 E- N  P* i/ `: r- p
(8). 将 tap 设备加入到 linux bridge 中0 X6 b8 X) B2 n% x, F- Y5 z5 O
bridge_lib.BridgeDevice(bridge_name).addif(tap_device_name)
8 A$ y+ T  l" ~/ Q(9). 如果将一个 tap 设备被删除,那么 linux-bridge-agent 会发现:! D3 {9 w; e1 _) N  j
2016-10-26 10:29:58.347 30219 INFO neutron.agent.securitygroups_rpc [req-e3264065-6414-4b5a-8d2b-dfafad6fdde8 - - - - -] Remove device filter for set(['tap60dbdc2f-a0'])
( `  @6 b$ I9 U! O2016-10-26 10:29:58.433 30219 INFO neutron.plugins.ml2.drivers.agent._common_agent [req-e3264065-6414-4b5a-8d2b-dfafad6fdde8 - - - - -] Attachment tap60dbdc2f-a0 removed
: k) }- e/ q% Z2016-10-26 10:29:58.536 30219 INFO neutron.plugins.ml2.drivers.agent._common_agent [req-e3264065-6414-4b5a-8d2b-dfafad6fdde8 - - - - -] Port tap60dbdc2f-a0 updated.* v" F% N' W5 ], w
3. 关于上述工作过程的简单结论$ A! z6 R$ f  d
3.1 简单结论
0 ]- L) s2 ]) s( V# |+ |1.        l3agent 和 dhcpagent 创建 network namespace 时创建 tap 设备,和 network namespace 中的 interface 是一对 veth pair。当手工删除 tap 设备时,相应的 veth endpoint 也会被删除。6 P% G  V/ S) w" O
2.        linuxbridgeagent 不断扫描服务器端和本地的 tap 设备+ v; t% s* m& d0 v
3.        linuxbridgeagent 获取需要增加和修改的tap设备列表
' c1 s# Z9 y$ J6 ^- G4.        对于需要增加的 tap 设备,获取其详细信息,主要是 network_id,network_type,physical_network,segmentation_id,device_owner 等,然后根据这些信息,创建 linux bridge,并加入所需要的 interface2 p7 C" T4 i( S/ u: V* a
5.        创建所需要的 linux bridge,并将 physical interface (provider network 的 physical interface 或者 tenant network 的 vxlan interface)加入 bridge,并且将 tap 设备也加入该 bridge
: `7 I4 w. A, ~' D5 @* m) |$ F6.        如果发现某个 linux bridge 没有创建出来,首先需要查看有没有相应的 tap 设备存在;如果 tap 设备不存在,则查看相应的 qdhcp 或者 qrouter 中时候有interface
+ b/ U  U* A; }) |' V( j   a2 j5 Q$ U/ S0 n! l* T
具有多个 VLAN 租户网络时候的网络元素示意图:% H! U' t% J* u: l. S
, U# X- Z/ ~- ]1 t% |0 ~; r

+ G$ A& _" I& g1 p+ F / `% C) r" @1 u& y
' ~' a. d: h  V- L
3.2 关于 unnumber interface
% t' [8 T, k+ E# \- I8 ?& s" S) V4 P5 sOpenStack 官方的 host networking 配置中,连接外网的 interface 可以是 unnumbered 的,从字面意思理解,就是该 interface 上不需要配置 IP 地址。
' a) F& V  \" a * t$ @9 o- m# G& l# S1 e
配置的时候,修改 /etc/network/interfaces:
6 @, O5 g/ X, y1 L+ r" m1 a) B( D; E- l# The provider network interface. Z- ?, [& `: H4 w$ E: {
auto ens224' `# O- w* a* e( u( v
iface ens224 inet manual
, i* T8 a* f+ i5 Aup ip link set dev $IFACE up/ S4 @. H3 C3 E+ h
down ip link set dev $IFACE down
+ ?) ^8 i! |+ |4 R配置好以后:
0 _+ }" q0 @3 C8 M" ]
. ?5 w2 Q$ x; V1 kroot@controller:/home/sammy# ifconfig ens224! Q9 s$ T" `6 p# v+ F# W
ens224    Link encap:Ethernet  HWaddr 00:50:56:9c:4d:944 d* j! I$ `: C1 Z# l' ?  s
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:14 @6 p2 Y% I: n; |* O+ w
          RX packets:27300737 errors:0 dropped:0 overruns:0 frame:0
. j  C3 C. n# S5 y          TX packets:61547 errors:0 dropped:0 overruns:0 carrier:0
% U  q$ ~$ \' b. @8 q6 D9 ^9 K          collisions:0 txqueuelen:10002 h2 r: _* s0 p* h
          RX bytes:31951077598 (31.9 GB)  TX bytes:5966060 (5.9 MB)* _) V/ T. V4 Y+ g. U' H) ^) y0 m
6 d. g* P/ u6 \  ^
root@controller:/home/sammy# ifconfig brq96609bfa-0e' H+ G7 Z5 A- i, t# b% x
brq96609bfa-0e Link encap:Ethernet  HWaddr 00:50:56:9c:4d:94
2 n- Q. p0 X( v% I$ }2 L4 Q4 o; Q          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1/ |+ S' l& P! ?6 l% ?! ]3 K
          RX packets:32855 errors:0 dropped:0 overruns:0 frame:0
) G( w7 l. }& M. R1 V/ g          TX packets:2 errors:0 dropped:0 overruns:0 carrier:0+ Y& A( |* d/ h: z6 I: M5 e
          collisions:0 txqueuelen:10007 M( p+ g2 E  c- Q
          RX bytes:2731030 (2.7 MB)  TX bytes:84 (84.0 B)$ t% {1 n2 B0 x  K
1 ~: J- u  i# Q" n
具体原理不详,但是应该是因为 qrouter 的 qg network interface 和物理网络中的路由器的网卡之间是网络二层,因此中间的设备都是属于二层的,因此不需要处于网络三层的 IP 地址。2 Z3 S# O7 S7 |* H
4. 使用 linux bridge 时的拓扑结构: p9 L; s, q& K
4.1 网络节点上% B: I3 Y, a& \9 H" e
为了更清楚,我们来对比着看 linux bridge 和 ovs 的两种方案:2 F' t/ }/ V& N# o8 g; f( c5 v. X4 `
linux 方案:+ R6 k! I1 t( u# L3 Q4 V( {
  1 F$ d7 x% n) k$ X. l
网络服务:2 F% `& f$ b5 g- _  @( d# C
•        Linux bridge agent
4 q/ d8 x9 O0 ^! m) P1 c+ \•        L3 agent
# }# I1 r/ o$ k2 ?4 S  J4 `+ a•        DHCP agent; `2 p* p$ s3 G  Z# o( S. I
•        Metadata agent; d- Y% |/ S4 L) O7 z! S/ ~
Linux bridge agent 会为每个 VLAN 虚拟网络创建一个 VLAN Bridge,它连接多个网元:" B5 F) f: k6 F
•        VLAN 子接口,从物理网卡(图中的 interface3)上创建,每个子接口对应一个VLAN ID,其名称格式为 device.sid,其中 device 是物理网卡名字比如 eth0,sid 是 vlan id。
% ?- y1 @4 b! n8 O, J•        连接虚拟机的 tap 接口. m! X) s7 u0 Y: K: C
•        和 qrouter 连接的 tap 接口
( r0 Z# K  O6 u, w: h•        和该网络的 qdhcp 连接的 tap 接口2 W8 A. a1 v" \6 K7 ~5 P
如果同时有 VXLAN 虚拟网络的话(linux-bridge 不支持GRE 隧道模式),会为每个 VLAN 虚拟网络创建一个 Tunnel bridge。它连接多个网元:6 W, H/ ?+ o3 y$ c0 A& R  [
•        vxlan interface,这种接口每个虚拟网络一个,名字格式为 vxlan-sid,其中 sid 是分段ID。
8 n  J. r. f& {4 H•        连接虚拟机的 tap 接口
. A' U' Z' n4 X/ r( l•        和 qrouter 连接的 tap 接口7 c, P1 E3 ~8 F
•        和该网络的 qdhcp 连接的 tap 接口
- E+ W( z  J4 W/ m8 P安全组规则在 tunnel bridge 和 vlan bridge 上。/ T1 ?- F& Q0 ?2 _+ h' r
OVS 方案:. E8 V" I. X+ A% x" |
* r& e8 l+ s* D
这里面,br-int 会负责加本地 VLAN 标签,br-tun 会负责将 VLAN ID 转换为 VXLAN ID。5 h' _. e! ~$ j' `9 Y; H

. r4 M( _$ q) x4.2 计算节点上5 F% W3 C- j( q' ?
同样来对比着看。" `0 W6 w. T/ A( R- x( v* M
linux bridge:
/ w6 E# A, ]6 Y   X) E  W, a0 ~6 o% z
网络服务:* [! h& z' |. V
•        Linux bridge agent
; y: M  C* Y6 b$ _# s和网络节点类似,只不过没有 qrouter 和 qdhcp,不在赘述。4 b* r: o# \$ k8 t+ @
OVS:
0 k9 R2 G$ i# }/ `* t
3 q; E! X2 \5 l8 c- v& Q  B
/ S* B5 r7 k/ j+ |# O# X) hOVS 放在在 br-int 上实现 VLAN 标签,在 br-tun 上实现隧道,在 qbr linux bridge 上实现安全组。
+ j: }2 U& a' D/ a
  Y+ a# U. H5 u0 u4.3 网络路径 - 南北向网络流向0 M1 G$ `+ ?% f% D/ M  D# ^4 [
: t5 f7 m% o, |
VLAN 网络和VXLAN 网络井水不犯河水。这图上的配置中,计算节点和网络节点上的物理网卡都分开了。
5 \; I6 ~" R: s/ p$ u4 T& t! b2 L4.4 网络路径 - 东西向(不同网络)
% i0 B/ z0 W+ G& L
1 ~) H: `+ b+ H- s& X9 ?4.5 网络路径 - 东西向(同一个网络)! z( E3 ^. e) ?; f
" Z$ R2 i4 N7 o+ @6 [

6 {1 D% {* H' v/ a3 M请详细说明和配置,请参阅参考文档。" u- T- i' V% L+ d! M0 u3 a
5. 一点结论- _% O: S& J$ X/ M" `
和基于 OVS 的二层网络相比,4 E( Q, L) r9 m# |0 L- z( [
•        功能和架构上:基于 linux bridge 的实现还是有一些短处,比如每个虚拟网络就需要一个网桥,这在大规模环境中会带领资源使用和管理上的问题。其好处是本身架构比较清晰。. ?$ M/ {% T3 c' f
•        性能上:基本上差不多,如下图所示,不管是 vxlan 还是 vlan。
+ |, z" p; n3 z0 S5 h/ R' N
4 [4 O6 ?( d! p2 z; H: f" S3 w
4 W4 b" o, }0 t* ]( k1 z
 楼主| 发表于 2019-10-28 14:31:20 | 显示全部楼层
一.现状0 p0 C: b# P: Y1 P! i
部署节点为一个controller节点(包含网络节点),两个compute节点。controller节点有3个网卡,分别为eth0(管理和API网络,CIDR为192.168.128.0/24)、eth1(租户网络,CIDR为10.10.10.0/24)、eth2(外部网络,CIDR为11.11.11.0/24,不设置IP);compute节点有2个网卡,分别为eth0(管理和API网络,CIDR为192.168.128.0/24)、eth1(租户网络,CIDR为10.10.10.0/24)。
( ^$ ~. ^' y. o2 _; ncontroller节点、compute节点的L2 agent 为 neutron-linuxbridge-agent " ]( I9 x, w& J% ]; z
: I- _  V; _9 E: j& \4 R) ]

* t; Z; g# C% a/ N3 `4 l8 |" INeutron网络方案为:/ k4 r$ U) Z- \8 c- d: G

: A9 {. k% z3 b  gNeutron ML2的Type Driver为vxlan9 T1 v9 C. @" Z" W. G8 ^3 c+ n
Neutron ML2的Mechanism Driver为LinuxBridge# c2 l6 B$ y8 Z  J  O7 G1 n
Neutron L2 Agent为LinuxBridge
3 I1 L6 y4 Z3 L& ~( m$ l8 l& Y! G( k4 e
目前的网络服务信息为:
% I2 \" f* ^! m/ a! H* m3 a! k6 J9 {2 _7 v# Z& j% r

0 c  w) Q4 o; j6 \! ]8 ]二.替换
. K8 I" x! r/ e/ a0 A* e. ?) e$ ^controller节点、compute节点的L2 agent 替换为 neutron-openvswitch-agent : \1 l) }# b3 F( g! \7 i8 ?" R
9 a% q7 L- J" A
/ x7 R- w/ b- |8 h' Y5 M
Neutron网络方案替换为:& I) L0 ], e9 G8 O/ J) e  V) ]+ \
+ \% N$ k# b* M9 E% Y( [
Neutron ML2的Type Driver为vxlan9 x- H9 I5 s! O) y! W: e# b
Neutron ML2的Mechanism Driver为Open vSwitch( F! z" r6 H# R/ P8 a
Neutron L2 Agent为Open vSwitch
1 ^# T# E! p* g3 _% t$ v% k
4 i( }( w) G) i* F" ~: W(1). 删除已有的路由器、虚拟网络。, }7 \/ H2 I( v/ S: ]6 f3 F- L

- z  q: J/ f0 f% \  [1.当删除网络时,报如下错误
4 }+ _6 t8 |( w2 T  O  a& N$ V8 K- Y5 U

$ b/ V3 X( D# Y" Z& G/ Q  [: S查看日志:delete failed (client error): Unable to complete operation on network 02444a0c-47d1-48ef-9de7-a8614a5fd799. There are one or more ports still in use on the network.
  o2 G& x) r' m4 Q" U. P表明有实例连接到这个网络,需要解除实例和网络port的绑定,然后再删除网络。) y. p% m8 M- v- r- v! s- F$ f
0 G$ R6 K/ x- y% O# W  S
2.删除外网时,也报类似错误 & I7 G; u  C: w5 U3 Z
查看日志:Found port (3db7acca-71d4-4715-94d5-47ecc2e42b21, 11.11.11.11) having IP allocation on subnet 558ee6a0-1145-4e9f-9f12-5318b5fd4ac5, cannot delete
) _' k" E+ H2 K7 Tdelete failed (client error): Unable to complete operation on subnet 558ee6a0-1145-4e9f-9f12-5318b5fd4ac5: One or more ports have an IP allocation from this subnet.   l4 h& d, i% ]5 h
需要释放浮动IP,再删除外部网络。
, B: g& i. e& B! |0 w* q7 B7 \- }- m8 n& [  @6 i/ Z
(2). 卸载controller节点、compute1节点、compute2节点的 neutron-linuxbridge-agent
4 G6 Y: a5 R* U7 K: O9 d4 p1 g6 I) E$ J. l/ |
先停止neutron-linuxbridge-agent服务
/ p- {1 J! U8 Q* o' j4 s( o3 S9 v) n9 C4 Q
root@controller:~# service neutron-linuxbridge-agent stop
$ `- j, i8 D6 f$ v$ I4 D" Cneutron-linuxbridge-agent stop/waiting8 w$ c; A! g3 m/ M; e
root@compute1:~# service neutron-linuxbridge-agent stop: h2 Y7 V+ j  M
neutron-linuxbridge-agent stop/waiting
* D7 V4 Q% n) ^% a1 v" |. Eroot@compute2:~# service neutron-linuxbridge-agent stop
% ]9 D" N( k/ N5 K1 V! z9 \neutron-linuxbridge-agent stop/waiting" `4 w) @+ \2 a- @+ r/ F0 }

. Y, Y8 x- A6 E2 E/ K再卸载软件/ g% n) V7 _* ?% Z; _7 s# ?; s; ^
& S" I/ A* @- U, M8 Y
root@controller:~# apt-get --purge remove neutron-linuxbridge-agent
5 O* \) k2 {* Q! i3 X1 G- Qroot@compute1:~# apt-get --purge remove neutron-linuxbridge-agent4 J; `, L& z+ f, \
root@compute2:~# apt-get --purge remove neutron-linuxbridge-agent
! A, S( _" x6 o7 X! \( N" {. @+ P' n) C& J/ N; m# j: \
(3). 安装controller节点、compute1节点、compute2节点的 neutron-openvswitch-agent
6 \6 b5 \8 S# X4 I1 ?/ J
* j! v8 _6 F5 z3 T$ c4 Kroot@controller:~# apt-get install neutron-openvswitch-agent
- e- b6 t# ]" w3 n/ b6 Groot@compute1:~# apt-get install neutron-openvswitch-agent
' c! h/ ^9 k$ {  aroot@compute2:~# apt-get install neutron-openvswitch-agent
3 |" Z6 L8 W" k$ x6 T9 i' Q3 n* y
. m9 q7 c- l# C" w, u- r(4). 修改配置文件 8 V  }! O" x9 z" D) N6 N/ o
controller节点
: W6 y/ o; f* e' ~0 P1 H
) R* `' V/ s" b7 \) E5 n0 p6 I/etc/neutron/plugins/ml2/ml2_conf.ini
5 g, ^9 s5 |2 ?5 |9 ?
0 ^: j+ R6 N% d5 ]7 t5 ~- G[ml2]
- w3 W% o' D) g" i9 |' Y) otype_drivers = flat,vxlan
2 i! T2 I/ s$ w% d, l6 T7 p4 ^tenant_network_types = vxlan, T9 \  k. Y1 r% `
mechanism_drivers = openvswitch,l2population! z/ Q0 a: L% J$ s! R! ]4 J; a
extension_drivers = port_security' ?) v/ m% R$ U  N8 Y) h
9 i* P- ~4 ?: q- T4 w  @* X& S! k$ ]
[ml2_type_vxlan]- a. n; v2 x& o
vni_ranges = 1001:20008 U. \$ O7 y" q# i0 A

. h5 U( r" T8 g& A- C6 ]1 y[securitygroup]
& S9 Q( ^) J6 y. J8 l, Y4 F  ?enable_ipset = true& n/ v& }* V5 x  w  d

: v# v" I# F  G/etc/neutron/l3_agent.ini
1 [2 \0 N+ G) i. K2 N2 ?
% d- J2 L, H- M  N. a1 B4 a[DEFAULT]7 x$ B& p1 R# X/ k$ w2 P$ i# y
external_network_bridge = br-ex
' b9 r( ?. g% N& s" G; Ointerface_driver = neutron.agent.linux.interface.OVSInterfaceDriver/ n% U( R) p% f( R& G; R" f

0 \+ }  a0 t" q/etc/neutron/dhcp_agent.ini! C6 e6 t( z& U2 V: a
0 a5 u% a3 Q) J8 q  n% @1 z
[DEFAULT]; t- j/ U1 r: G
interface_driver = neutron.agent.linux.interface.OVSInterfaceDriver7 f1 Q+ _# U: ?2 ~2 s2 s
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
2 f: Q  f6 n0 x) s9 {6 Nenable_isolated_metadata = True
4 C" A+ u( x5 F9 D
2 a! e6 _& l  O1 `; v/etc/neutron/plugins/ml2/openvswitch_agent.ini  Q9 d0 D7 i9 Q" M4 F

$ V2 b; _' M2 ~/ x[ovs]* a6 ]+ v& o# e* G* S8 J
bridge_mappings = 7 ?( u% Y( x- R
tunnel_bridge = br-tun) f+ M8 K& p2 \& T7 j7 Z: L, H
local_ip = 10.10.10.10
6 A" Y2 n  u# o! f. a, E
+ T- l- K7 J! F- D! }[agent]
. u5 U' F% N  s7 [" U" h5 b! Rtunnel_types = vxlan$ |" x4 a& n( v
l2_population = True
6 y$ W6 X! I- J7 k3 P' S! e+ I
% z& e+ L; {' }, M; R+ e[securitygroup]
/ V3 a* C2 {7 [1 ]: ?' Rfirewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
) L. t* s5 A9 K3 Menable_security_group = true
8 |+ K- Q9 u( c" J! E8 c# T( u. y& M, @9 r6 X) E, w- W
compute1节点
1 T; p  U* E4 u* L% P) x! ~% E5 S. B' i: O9 t: J/ _0 m! D
/etc/neutron/plugins/ml2/openvswitch_agent.ini
' k8 R$ y3 C  z1 D
' \) k+ s5 ?3 o% B+ t6 O[ovs], D* S- t* t2 ~- K
bridge_mappings =
# [+ f, F7 |. h1 p3 Q  ~tunnel_bridge = br-tun
( U/ A+ T, K2 s5 j: A: m/ ~7 d% xlocal_ip = 10.10.10.11
6 Q3 M$ Y. [% O+ Q% r' D; P3 K0 h# S
[agent]
& [2 R1 a0 o$ i6 F$ Rtunnel_types = vxlan, x  a& J7 u) L' w
l2_population = True( W/ D0 \& a+ Q9 D  l- t" T
. g8 X9 w: @- O- T* A5 }
[securitygroup], p4 e+ ?& _# E! d: X7 J
firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
1 L- j' w3 ^' K. I/ k: [3 R* r. Nenable_security_group = true! v+ l4 d1 ?+ `' L7 p, S+ e" `
4 f8 u# _+ V* d( p  ^% l8 H8 O
compute2节点! T) e4 d1 L( r5 g5 \/ y  a
' X$ T) }1 V! X6 O
[ovs]
8 e& v9 a4 _9 F9 |bridge_mappings =
: O+ D3 ^. D0 [7 j0 Ftunnel_bridge = br-tun, L, ^4 G) }2 p; n" O" t
local_ip = 10.10.10.12
4 n  ?# ]: Z: j% k" _2 v9 w+ V5 _7 L& H. z; ]9 n. z
[agent]
# z7 X1 d6 a1 _tunnel_types = vxlan: |- Q* F; u( g' T$ X
l2_population = True
8 h; L. Z* M  B$ [. }/ T( L( o. D# b, u/ F6 _' p4 r: j
[securitygroup]
% l7 a9 B7 `: E, K1 Afirewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver3 H  K# f( g, V4 ]& w
enable_security_group = true
2 E: _( m6 T4 n, t  b
) j# _( Z9 N, @" n- k; d# W重启网络相关服务。+ c' _. V' r, U! D' g4 z, o
/ l- b. e. d" C
再次查看网络服务信息 6 l! I9 H1 \! d& Q- o% \

  W' S. `8 v& n7 e6 `' _: G( v4 H# M& D) ^" ?% J
把已关闭的 neutron-linuxbridge-agent 删除, `4 ]& M8 t2 B3 e
+ T" e" G7 J6 Q( i+ n+ E
root@controller:~# neutron agent-list
5 |% v# k; j6 T! r! r- \1 ~+--------------------------------------+--------------------+------------+-------------------+-------+----------------+---------------------------+
; z7 ?3 q4 o1 T: r$ `  j+ \/ o0 o| id                                   | agent_type         | host       | availability_zone | alive | admin_state_up | binary                    |
: o6 X! s& D2 Y3 O; l' A& R+--------------------------------------+--------------------+------------+-------------------+-------+----------------+---------------------------+8 p: U% |/ X6 D7 [* }
| 21af963d-003d-455e-8723-8b78d201a684 | L3 agent           | controller | nova              | :-)   | True           | neutron-l3-agent          |4 L& E; ~6 k, |; c
| 25229052-f0cb-4f04-b819-375fc55c510f | Linux bridge agent | controller |                   | xxx   | True           | neutron-linuxbridge-agent |7 z5 R/ r3 b# T6 \6 R% R
| 80607c88-5c98-4491-839d-0ce715ec3e4d | Open vSwitch agent | compute2   |                   | :-)   | True           | neutron-openvswitch-agent |
3 w; X! f% U8 H: `| aab52c21-8c14-4568-89c6-20e70400da38 | Open vSwitch agent | compute1   |                   | :-)   | True           | neutron-openvswitch-agent |
3 _# Z6 T1 \! e| d51f6d6c-eda0-4179-9fce-f9c24ef20824 | DHCP agent         | controller | nova              | :-)   | True           | neutron-dhcp-agent        |* b8 ~- ?+ ?  a, [- F1 a$ P  ^
| d666c263-ba6d-4f09-a09d-72c214787e08 | Loadbalancer agent | controller |                   | :-)   | True           | neutron-lbaas-agent       |
& y" K  Z0 Z# q8 d$ v$ Q% t| e17d1ecf-35d2-49f5-a7c9-206b0c9e2ce4 | Linux bridge agent | compute2   |                   | xxx   | True           | neutron-linuxbridge-agent |, d& n. p' g' W/ p
| e26dc52e-7827-463b-8ee7-202a19d5c3dc | Metadata agent     | controller |                   | :-)   | True           | neutron-metadata-agent    |
& ^) Q" q1 @# S* p, F4 u| fba23722-9439-4289-bd17-5b69c43f88da | Linux bridge agent | compute1   |                   | xxx   | True           | neutron-linuxbridge-agent |# t% B. B8 R, s& U0 k" V. M+ j- x
| fe4a9cf3-9a08-4837-b74f-787118ce57db | Open vSwitch agent | controller |                   | :-)   | True           | neutron-openvswitch-agent |# w+ o2 _5 D4 E4 c
+--------------------------------------+--------------------+------------+-------------------+-------+----------------+---------------------------+
- R" |; _# M* a* f: w, h0 j2 ~5 ]; P$ ^5 I1 j
root@controller:~# neutron agent-delete 25229052-f0cb-4f04-b819-375fc55c510f
1 L: D' s( q1 n- \* UDeleted agent: 25229052-f0cb-4f04-b819-375fc55c510f" ^- N2 L4 K: v- u' x' t
root@controller:~# neutron agent-delete e17d1ecf-35d2-49f5-a7c9-206b0c9e2ce4
. E8 a' o% i" |1 e2 ?+ S5 X1 eDeleted agent: e17d1ecf-35d2-49f5-a7c9-206b0c9e2ce4
7 `2 X; p( P: F2 a/ E7 I- Proot@controller:~# neutron agent-delete fba23722-9439-4289-bd17-5b69c43f88da
# F) w  y" C* F5 c' }Deleted agent: fba23722-9439-4289-bd17-5b69c43f88da
* J6 J/ a5 ?( Q5 b
/ ^* t; d1 E& a# u9 H再次查看网络服务信息,已经没有linuxbridge的agent了 $ Y' j1 E1 i, J
  Y+ m# m& y* N: A" s3 J) G
+ M* w% S3 v& E+ a
三.验证
. \0 j( z- Y7 n3 y5 j" ], O验证修改是否成功。
' k3 e0 |: ?# m7 c$ c$ Z' P  }' t先创建一个vxlan100网络 % j7 V; E9 j) Q  P
3 y( J- f- N& e) e) T

- P2 c; s% f3 ?5 {6 t% H$ _1 q把已有虚拟机test1、test2和vxlan100网络关联起来
! u" Z  {! R' Q; b; T" g- n
, `/ z' e4 Q) O( m' K0 N/ ?! X* I& V! ]1 X. u1 m
test1、test2重启,然后查看是否获取IP地址
+ ^: y$ V# {+ W0 `% W2 a: C再互ping . n2 h% z  R! M4 {: e: ]

0 m: G) V4 m- n- V% R) Y, a( [# h! E. v  [- {5 i* S, L' v
至此,L2 agent替换并验证成功!$ Y+ A+ Y5 [# ~6 @4 Y; x1 V8 N
0 X# Z: A8 p2 R3 w
. Q$ B, v6 C3 z2 p7 _. B
————————————————
! H1 B( F# ^5 ]/ t& e  k
% L' X9 W# n% c1 `8 Q& q
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

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

北京云银创陇科技有限公司以云计算运维,代码开发

QQ|返回首页|Archiver|小黑屋|易陆发现技术论坛 点击这里给我发消息

GMT+8, 2026-4-8 10:38 , Processed in 0.061749 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

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