目录

前言

本文是在 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

  1. [ml2]
  2. tennat_network_type=local
  3. type_drivers=local,flat,
  4. mechanism_drivers=linuxbridge
  5. ...
  6. [ml2_type_flat]
  7. flat_networks=default
  8. [linux_bridge]
  9. 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 的配置方式

  1. [ml2_type_flat]
  2. flat_networks = flat1,flat2
  3. [linux_bridge]
  4. 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

  1. [ml2]
  2. tennat_network_type=vlan
  3. type_drivers=local,flat,vlan,
  4. mechanism_drivers=linuxbridge
  5. ...
  6. [ml2_type_vlan]
  7. network_vlan_ranges=default:3001:4000
  8. [linux_bridge]
  9. 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

  1. [ml2]
  2. tennat_network_type=vxlan
  3. type_drivers=local,flat,vlan,vxlan
  4. mechanism_drivers=linuxbridge,l2population
  5. ...
  6. [ml2_type_vxlan]
  7. vni_ranges=1001:2000

NOTE:VxLAN 的运行原理是不需要特别指定 “物理网络(网卡)” 的,因为 VxLAN 依赖于 VTEP 端点的 IP,只要这两端的 IP 能通就可以了。

控制节点的 VxLAN Section:

  1. [VXLAN]
  2. enable_vxlan=True
  3. l2_population=True
  4. local_ip=<control_ip>

计算节点的 VxLAN Section:

  1. [VXLAN]
  2. enable_vxlan=True
  3. l2_population=True
  4. 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 多平面网络实现原理的更多相关文章

  1. 理解 neutron(15):Neutron linux-bridge-agent 创建 linux bridge 的简要过程

    学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...

  2. Neutron 理解(14):Neutron ML2 + Linux bridge + VxLAN 组网

    学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...

  3. 理解 neutron(15):Neutron Linux Bridge + VLAN/VXLAN 虚拟网络

    学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...

  4. Neutron VxLAN + Linux Bridge 环境中的网络 MTU

    1. 基础知识 1.1 MTU   一个网络接口的 MTU 是它一次所能传输的最大数据块的大小.任何超过MTU的数据块都会在传输前分成小的传输单元.MTU 有两个测量层次:网络层和链路层.比如,网络层 ...

  5. Netruon 理解(12):使用 Linux bridge 将 Linux network namespace 连接外网

    学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...

  6. 4..部署场景2:带有遗留的Linux Bridge

    此场景描述了使用Linux bridge的ML2插件实现OpenStack网络服务的遗留(基本)实现. 遗留实现通过为常规(非特权)用户提供一种方法来管理一个项目中的虚拟网络,并包含以下组件:提供了自 ...

  7. ebtables和iptables与linux bridge的交互

    本文为翻译文,不一定是逐字逐句的翻译,而且中间会加上自己的一点见解,如有理解错误的地方,还请大家指出,我定虚心学习.原文见链接 其中斜体字是自己的理解,建议和ebtables手册和iptables手册 ...

  8. 【转载】基于Linux命令行KVM虚拟机的安装配置与基本使用

    基于Linux命令行KVM虚拟机的安装配置与基本使用 https://alex0227.github.io/2018/06/06/%E5%9F%BA%E4%BA%8ELinux%E5%91%BD%E4 ...

  9. 基于Linux平台的libpcap源码分析和优化

    目录 1..... libpcap简介... 1 2..... libpcap捕包过程... 2 2.1        数据包基本捕包流程... 2 2.2        libpcap捕包过程... ...

随机推荐

  1. 一,python简介 笔记

    python历史 1,1989年圣诞节,Guido von Rossum开始编写python语言编译器 2,1991年2月,第一个python编译器诞生,是c语言实现的,后面又出现了c#和java版本 ...

  2. 可靠的TCP连接为何是三次握手和四次挥手

    首先,咱们先来熟悉下经典的tcp/ip模型. tcp/ip 模型为了方便使用,将osi七层模型划分成了四层,分别为网络接口层,网络层,传输层,应用层. 他们作用分别为: 1)网络接口层:主要作用是将i ...

  3. tornada-模板

    tornado模板 1.配置模板路径 (project/config.py) # coding=utf-8 import os BASE_DIRS = os.path.dirname(__file__ ...

  4. 个人学习SpringMVC总结

    好记性不如烂笔头! 核心:前端控制器 处理器映射器(HandleMapping) 处理器适配器(HandleAdapter) 视图解析器 流程: 用户从浏览器发起请求,发送到服务器(Tomcat),由 ...

  5. VCL界面开发必备装备!DevExpress VCL v19.1.5你值得拥有

    DevExpress VCL Controls是 Devexpress公司旗下最老牌的用户界面套包.所包含的控件有:数据录入,图表,数据分析,导航,布局,网格,日程管理,样式,打印和工作流等,让您快速 ...

  6. 判断当前环境是ios还是安卓

    /** * @name 判断iOS */ export const isiOS = ()=>{ let u = navigator.userAgent; let iOs = !!u.match( ...

  7. 【leetcode】1266. Minimum Time Visiting All Points

    题目如下: On a plane there are n points with integer coordinates points[i] = [xi, yi]. Your task is to f ...

  8. vue的组件创建和使用

    首先说一下vue组件 什么是组件? 在我的理解,vue的所有页面内容都是组件. 什么是父子组件? 因为所有的页面内容都是组件,那么怎么区分父子组件呢?其实很简单,现在有一个页面,在js里面的 comp ...

  9. C# 之抽象类

    抽象类 抽象类中 .只包含抽象方法, .包含非抽象方法和抽象方法 .可使用get和set访问器 Example : public abstract class GeeksForGeeks { publ ...

  10. ERROR: An HTTP request took too long to complete. Retry with --verbose to obtain debug information.

    docker-compose 的问题 要改环境变量 xed ~/.profile export COMPOSE_HTTP_TIMEOUT=500 export DOCKER_CLIENT_TIMEOU ...