代码改变世界

基于 Linux Bridge 的 Neutron 多平面网络实现原理

2019-02-07 17:14  云物互联  阅读(1039)  评论(0编辑  收藏  举报

目录

前言

本文是在 CloudMan 的《每天五分钟学习 OpenStack》系列博文的基础之上进行学习记录和总结的,感谢 CloudMan 的整理付出,特此说明。

前文列表

《Networking 基本术语/概念》

多平面网络

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 来进行封装。这里不再赘述。