基于 Linux Bridge 的 Neutron 多平面网络实现原理
目录
前言
本文是在 CloudMan 的《每天五分钟学习 OpenStack》系列博文的基础之上进行学习记录和总结的,感谢 CloudMan 的整理付出,特此说明。
前文列表
多平面网络
Neutron 作为一个成熟的 SDN 项目,实现了「多平面混合的租户私有网络模型」。在 Neutron 中,Network(网络)的定义是一个隔离的二层广播域。Neutron 支持多种类型的 Network,也就是常说的 “多平面网络”。
- Local
- Flat
- VLAN
- VxLAN
- GRE


Local(本地网络)
Local 类型网络的特点是与其他网络和节点隔离。Local 网络中的 instance 只能与位于同一节点上的同一网络中的 instance 通信。Local 网络主要用于单机测试,在生产环境中基本不会看见。
Local Network 是不会与宿主机的任何物理网卡相连的,对于每个 Local Netwrok,ML2 linux-bridge 都会为其创建一个 bridge(虚拟网桥)设备,Instance 的 tap(虚拟网卡)设备会连接到 bridge。位于同一个 Local Network 的 Instance 会连接到相同的 bridge。这样就相当于有多台 Hosts 接入了同一台交换机上,Hosts 之间只要处于同于 IP 逻辑网络,就可以互相通信。
但因为物理网卡并没有 Attached 到 bridge 上,所以 Instances 也就无法与宿主机之外的网络通信了。同时又因为每个 Local Network 有自己的 bridge,且 bridge 之间没有连通,所以两个 Local Network 之间也不能通信,即使它们位于同一宿主机上。
Local Network 的网络模型:

Flat(扁平网络)
Flat 类型网络的特点是无 VLAN Tagging。Flat 网络中的 Instance 能与位于不同节点上的同一网络的 Instance 通信。Flat 网络常见于 All-In-One 开发环境,在生产环境中也基本不会看见。
Flat Network 要求宿主机的物理网卡 Attached 到 Linux Bridge 上,这意味着每个 Flat Network 都会独占一个物理网卡,也意味着 Flat Network 是可以连通外网的。
Flat Network 的网络模型:

NOTE:物理网卡接口设备(e.g. eth1、eth2)Attached 到 Bridge 之后其 IP 地址会无效(NO IP ADDR),所以一般的会将原来 eth1 的 IP 地址配置到 brqXXXX 上,并且开启 eth1 的混杂模式。
可见 Flat 与 Local 的主要区别在于 “是否能够连通外部网络(是否 Attached 物理网卡设备)”。如果 Instances 希望访问外部网络,那么就要求 Instances、Bridge、外部网络处于同一个 IP 逻辑网络。很明显的,这一限制使得 Flat 只能应用在简单的实验环境中,而且就算是在实验环境中也只有 ext-net 会创建为 Flat 类型。ten-net 不会直接采用 Flat,而是通过 Router 和 Floating IP 进行外网访问。
配置 Flat 网络
vim /etc/neutron/plugins/ml2/ml2_conf.ini
[ml2]
tennat_network_type=local
type_drivers=local,flat,
mechanism_drivers=linuxbridge
...
[ml2_type_flat]
flat_networks=default
[linux_bridge]
physical_interface_mappings=default:eth1
- 在
[ml2_type_flat]中通过flat_networks定义了一个 flat 网络,label 为default。 - 在
[linux_bridge]中通过physical_interface_mappings指明 default label 对应的物理网卡为 eth1。
label 是 Flat Network 的唯一标识,可以是任意字符串,在创建 Flat Network 时需要指定 label,通过指定 label 来分配 Flat Network 占用的物理网卡接口设备。Flat Network 是可以跨节点的,只要确保各节点间 ml2_conf.ini 配置文件中的 label 命名一致就可以了。需要注意的是,各节点中同一 label(Flat Network)与物理网卡的对应关系可能并不相同,因为各个节点可以被分配的物理网卡也不尽相同。
NOTE:支持多个 Flat Network 的配置方式
[ml2_type_flat]
flat_networks = flat1,flat2
[linux_bridge]
physical_interface_mappings = flat1:eth1,flat2:eth2
VLAN
VLAN 网络是具有 802.1q Tagging(基于 802.1.q VLAN 协议) 的网络。每个 VLAN 都是一个二层的广播域,同一 VLAN 中的 instance 可以通信,不同 VLAN 间的 instances 需要通过 Router 通信。VLAN 网络是应用最广泛的网络类型,适合中小型网络拓扑。
VLAN Network 的网络模型:

- eth1.100 和 eth1.101 俗称为物理网卡 eth1 的子网卡设备,又称为 Linux VLAN 设备。
- 同一张物理网卡可以通过创建多个不同子设备来划分多个不同的 VLAN。
- Instances 通过 eth1.100 发送到 eth1 的数据包就会打上 vlan100 的 tag。
- 具有相同 VLAN ID 的数据包才能通过对应的 VLAN 设备。
- 每个 VLAN Network 有自己专属的 Bridge,以此实现了基于 VLAN 的隔离。
NOTE:VLAN 实现了隔离,Bridge 实现了转发,VLAN + Bridge == vSwitch(隔离&转发)
配置 VLAN 网络
vim /etc/neutron/plugins/ml2/ml2_conf.ini
[ml2]
tennat_network_type=vlan
type_drivers=local,flat,vlan,
mechanism_drivers=linuxbridge
...
[ml2_type_vlan]
network_vlan_ranges=default:3001:4000
[linux_bridge]
physical_interface_mappings=default:eth1
- 定义了 label 为
default的 VLAN Network,VLAN ID 的范围是 3001~4000。这个范围是针对普通用户创建 VLAN 类型租户网络时的范围。普通用户创建 VLAN 类型网络时并不能指定 VLAN ID,Neutron 会按顺序自动从这个范围中取值。 - 对于 admin 用户则没有 VLAN ID 的限制,admin 可以创建 1~4094 范围(全范围)内的 VLAN 网络。
- 同样需要指明 VLAN Network 与物理网卡的对应关系
VxLAN
VxLAN 是基于隧道(Tunnel)技术的 Overlay 覆盖网络。VxLAN 网络通过唯一的 Segmentation ID(VNI)来进行划分,VxLAN 中的数据包会通过 VNI 封装成 UDP 包进行传输。所谓 Overlay 就是覆盖在三层网络之上的自定义网络,从用户的角度来看,它屏蔽了底层网络的复杂性。VxLAN 将二层的数据帧封装在三层数据包进行传输,从而克服 VLAN 和物理网络基础设施的限制。
NOTE:VxLAN 的实现原理请查阅 https://blog.csdn.net/Jmilk/article/details/85169871#VxLAN_Tunnel_Endpoint_579,这里不再赘述。

配置 VxLAN 网络
vim /etc/neutron/plugins/ml2/ml2_conf.ini
[ml2]
tennat_network_type=vxlan
type_drivers=local,flat,vlan,vxlan
mechanism_drivers=linuxbridge,l2population
...
[ml2_type_vxlan]
vni_ranges=1001:2000
NOTE:VxLAN 的运行原理是不需要特别指定 “物理网络(网卡)” 的,因为 VxLAN 依赖于 VTEP 端点的 IP,只要这两端的 IP 能通就可以了。
控制节点的 VxLAN Section:
[VXLAN]
enable_vxlan=True
l2_population=True
local_ip=<control_ip>
计算节点的 VxLAN Section:
[VXLAN]
enable_vxlan=True
l2_population=True
local_ip=<compute_ip>
vni_ranges的意义与 VLAN 网络的network_vlan_ranges配置项目的意义类似,是针对普通租户的配置。admin 同样没有 vni 范围的限制,admin 可以创建 1~16777216 的 VxLAN Network。- l2population 是 Neutron 实现了 “大二层控制平面”,直接通过数据库记录生成 IP 与 MAC 的映射关系,以此来完成 ARP 协议的工作内容,避免广播风暴的问题。在大型的网络中作用巨大。
GRE
CRE 与 VxLAN 类似,也是一种 Overlay 网络,主要区别在于使用的隧道技术不同,GRE 是通过 gre key 进行划分的,并且使用了 IP 包而非 UDP 来进行封装。这里不再赘述。
基于 Linux Bridge 的 Neutron 多平面网络实现原理的更多相关文章
- 理解 neutron(15):Neutron linux-bridge-agent 创建 linux bridge 的简要过程
学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...
- Neutron 理解(14):Neutron ML2 + Linux bridge + VxLAN 组网
学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...
- 理解 neutron(15):Neutron Linux Bridge + VLAN/VXLAN 虚拟网络
学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...
- Neutron VxLAN + Linux Bridge 环境中的网络 MTU
1. 基础知识 1.1 MTU 一个网络接口的 MTU 是它一次所能传输的最大数据块的大小.任何超过MTU的数据块都会在传输前分成小的传输单元.MTU 有两个测量层次:网络层和链路层.比如,网络层 ...
- Netruon 理解(12):使用 Linux bridge 将 Linux network namespace 连接外网
学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...
- 4..部署场景2:带有遗留的Linux Bridge
此场景描述了使用Linux bridge的ML2插件实现OpenStack网络服务的遗留(基本)实现. 遗留实现通过为常规(非特权)用户提供一种方法来管理一个项目中的虚拟网络,并包含以下组件:提供了自 ...
- ebtables和iptables与linux bridge的交互
本文为翻译文,不一定是逐字逐句的翻译,而且中间会加上自己的一点见解,如有理解错误的地方,还请大家指出,我定虚心学习.原文见链接 其中斜体字是自己的理解,建议和ebtables手册和iptables手册 ...
- 【转载】基于Linux命令行KVM虚拟机的安装配置与基本使用
基于Linux命令行KVM虚拟机的安装配置与基本使用 https://alex0227.github.io/2018/06/06/%E5%9F%BA%E4%BA%8ELinux%E5%91%BD%E4 ...
- 基于Linux平台的libpcap源码分析和优化
目录 1..... libpcap简介... 1 2..... libpcap捕包过程... 2 2.1 数据包基本捕包流程... 2 2.2 libpcap捕包过程... ...
随机推荐
- C与汇编混合编程
C中调用汇编,要把汇编定义为全局的,加.global C内嵌汇编 __asm__( :汇编语句部分 :输出部分 :输入部分 :破坏描述部分 ); 用C内嵌汇编的方式:实现LED的点亮 //#defin ...
- Vue自行封装常用组件-弹出框
使用方法: 1.在父组件中引入"box.vue" //import popUpBox from "./box.vue"; 2.在父组件中注册 popUpBo ...
- 使用go语言开发一个后端gin框架的web项目
用liteide来开发go的后端项目,需要注意的是环境变量要配置正确了 主要是GOROOT, GOPATH, GOBIN, PATH这几个, GOPATH主要用来存放要安的包,主要使用go get 来 ...
- postgresql 锁表查询语句
1 查找锁表的pid select pid from pg_locks l join pg_class t on l.relation = t.oid where t.relkind = 'r' an ...
- [uboot] (番外篇)global_data介绍(转)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/ooonebook/article/det ...
- DevExpress ASP.NET Bootstrap v19.1版本亮点:Scheduler控件
行业领先的.NET界面控件DevExpress 正式发布了v19.1版本,本文将以系列文章的方式为大家介绍DevExpress ASP.NET Bootstrap Controls中Rich Text ...
- 数组遍历 forEach 方法
数组的遍历 遍历数组,将数组中的所有元素都取出来. 使用for 循环执行数组的索引(length-1)相同的次数. var arr=["1", "5", &qu ...
- Redis常见面试问题及答案
大量key在同一时间过期,注意什么? 如果过期时间过于集中,会导致Redis可能会出现短暂的卡顿现象.严重的话会出现缓存雪崩,一般需要在时间上加一个随机值, 使用过期时间分散一些. Redis分布式锁 ...
- ping —— 虚拟机
1. 主机ping 虚拟机 ping 不通 设置——虚拟机—— 防护墙——入站规则—— 文件和打印共享 (回显请求-ICMPv4-In) 2.主机连接不上虚拟机中的sqlsrver 设置— ...
- cat:连接文件并打印输出到标准输出设备
是 concatenate(连接.连续)的简写.cat 命令可以用来显示文本文件的内容,也可以把几个文件内容附加到另一个文件中,即连接合并文件. cat 命令的基本格式如下: [root@localh ...