透过现象看本质——谈谈L2 agent 这回事儿

透过现象看本质——谈谈L2 agent这回事儿

前言

​ 上回说到OpenStack Neutron项目中有关ML2插件的事儿,ML2做为H版本更新后新生代核心插件的宠儿,其实现了network/subnet/port三种核心资源,同时也实现了包括Port Binding等在内的部分扩展资源。ML2插件经过解耦网络拓扑类型与底层的虚拟网络实现机制,并经过Driver的形式进行扩展,解决了传统核心插件的相关问题。linux

​ 而咱们知道在neutron所提供的服务中,插件和代理是对应着的,尽管咱们说ML2解决了在使用传统核心插件时全部节点只能使用同一种网络提供者的问题,可是这并不是意味着不一样的机制驱动能够用与之不一样的网络提供者提供代理服务,但其实咱们无需考虑这么多,开发者只须要针对agent开发对应的驱动便可。shell

​ ML2 Core Plugin及其agent负责将实例链接到OpenStack Layer 2虚拟网络,本文就来谈谈有关Linux Bridge和Open vSwitch代理的内容。数据库

Service和Agent

​ 在Neutron项目中,官方对于服务和代理给出的介绍为:一个常见的Neutron设置包括多个服务和运行在一个或多个节点上的代理(尽管有些设置可能不须要任何代理)。每一个服务都提供一些网络或API服务。特别注意的是:centos

  1. 提供API端点(Endpoints)并用做对数据库的单点访问的Neutron Server。它一般在控制器节点上运行。
  2. 能够利用Open vSwitch,Linux Bridge或其余特定于供应商的技术的Layer2代理为项目网络提供网络分段和隔离(对应着物理网络中二层交换机来理解)。L2代理应在它负责布线和保护虚拟接口(一般是计算节点和网络节点)的每一个节点上运行。
  3. 在网络节点上运行的Layer3代理,提供东西向和南北向路由以及一些高级服务,例如FWaaS或***aaS。

本文谈的是基于二层的代理,主要是讲述Linux Bridge agent以及Open vSwitch agent,这二者都属于L2(Layer 2)agent。安全

啥是Linux Bridge?

​ Linux Bridge是成熟可靠的Neutron二层网络虚拟技术,支持local、flat、vlan、vxlan这四种网络类型,目前不支持gre。网络

​ Linux Bridge能够将一台主机上的多个网卡桥接起来,充当一台交换机,它能够桥接物理网卡,又能够理解为虚拟网卡,用于桥接虚拟机网卡的是tap设备(通常说是接口),这是一个虚拟机出来的网络设备,称为tap设备,做为网桥的一个端口,tap接口在逻辑上与物理接口具备相同的功能,能够接收和发送数据包。(具体tap的原理与建立本文暂且不谈论太多,了解如下设备含义有助于下面的例子)数据结构

  1. Tap接口( Tap interface):用于桥接虚拟机的网卡,本质上应该理解为一个设备,命名例如:tapXXX;
  2. Linux网桥( Linux Bridge):能够理解为物理网络中的二层交换机,命名例如: brqxxxx;
  3. VLAN接口( VLAN Interface):在VLAN网络中用于链接网桥,命名为 ethx.y(ethx为物理网卡名称,y为VLAN ID);
  4. VXLAN接口( VXLAN Interface):在VXLAN网络中用于链接网桥,命名为 vxlana-z(a-z是VNID)
  5. 物理网络接口:用于链接到物理网络的硬件接口。

​ 那么Linux Bridge代理到底是怎么处理plugin(ML2)传递过来的请求的呢?(注意这里指的是Linux Bridge)ide

举例说一说Linux Bridge是如何实现Neutron网络

咱们举基于Linux Bridge下flat网络和vlan网络来理解,先从flat开始,由于比较简单,入手方便你们从本质上理解,而vlan网络来讲,是使用的比较多的一种模式,所以仍是须要了解理解一下的。性能

仍是先来理解一下Linux Bridge实现虚拟交换机的原理,虽然比较简单,可是对于没有接触过linux虚拟网络的朋友而言,下面的内容可能更加无法理解。参考下图:学习

透过现象看本质——谈谈L2 agent 这回事儿

br0——Linux Bridge,充当虚拟交换机的做用,负责将物理网卡eth0和虚拟网卡tap设备vnet0/vent1链接到同一个二层网络,实现虚拟机VM1和VM2,以及虚拟机与外网之间的通讯(具体的实现过程仍是要学习一下网络虚拟化相关基础理论和操做来理解的)

(1)基于Linux Bridge的单一flat网络

透过现象看本质——谈谈L2 agent 这回事儿

​ 咱们知道,flat network是不带tag的网络,因此必需要求宿主机的物理网卡直接与Linux网桥链接,这也就代表,每个flat network都会独占一起物理网卡,如上图所示即,eth1桥接到brqxxxx,从而为实例提供flat网络。该图表示的是单一的flat 网络,若是是多个flat网络就须要再添加一个物理网卡eth2了。

​ 固然在一些配置文件中确认或修改一下,例如ML2的配置文件是否支持对应类型等等。这里不深刻探究,明白就好。继续从桥接到brqxxxxx开始说一下实现flat网络的原理。对于图中的kvm若是对其不了解,这里能够暂时忽略KVM(全写Kernel-based Virtual Machine——基于内核的虚拟机,属于2型虚拟化,本文这里不须要深究,若是有兴趣能够查阅相关文章资料)

​ Linux Bridge须要和虚拟机实例创建网络链接,就须要经过一个设备(接口)做为介质,这个设备(接口)就是tap。其实tap常常与tun一块儿谈及,两者都属于操做系统内核中的虚拟网络设备(注意!linux中一切皆文件),只不过tap位于二层,而tun位于三层,而它们之间的差异仅仅在于数据结构封装中的flag不同而已,这也是如何区分它们的方法,可是它们两者所承载的功能相差甚远。本文篇幅有限,就不继续深究了。只须要知道tap所对应的数据链路层协议为以太网协议(IEEE 802.3),所以tap设备有时候也被称为"虚拟以太设备"。

​ 在Linux系统中(centos7)能够经过下面的命令查看tap有关信息,本文了解便可:

[root@localhost ~]# modinfo tun   #查看是否有tun以及其相关信息
filename:       /lib/modules/3.10.0-693.el7.x86_64/kernel/drivers/net/tun.ko.xz
alias:          devname:net/tun
alias:          char-major-10-200
license:        GPL
author:         (C) 1999-2004 Max Krasnyansky <maxk@qualcomm.com>
description:    Universal TUN/TAP device driver
rhelversion:    7.4
srcversion:     4E9F57A6269CFD0F4BE4021
depends:        
intree:         Y
vermagic:       3.10.0-693.el7.x86_64 SMP mod_unload modversions 
signer:         CentOS Linux kernel signing key
sig_key:        DA:18:7D:CA:7D:BE:53:AB:05:BD:13:BD:0C:4E:21:F4:22:B6:A4:9C
sig_hashalgo:   sha256
#显示如以上信息代表有相关信息
[root@localhost ~]# lsmod | grep tun  #是否已经加载
tun                    31621  1 #出现这些内容则什么已经加载过了

[root@localhost ~]# modprobe tun  #加载命令
[root@localhost ~]# lsmod | grep tun
tun                    31621  1

tap实现linux网桥与虚拟机实例之间的网络通讯,构建了整个基于Linux Bridge的单一flat网络。

可是咱们知道flat网络模式对于多租户的状况并不友好。因此有了vlan网络来实现租户组件网络的隔离。

(2)基于Linux Bridge 的vlan网络

​ 其实,基于Linux Bridge实现vlan网络与前面的flat仍是有相似之处的,不一样的地方在于flat与vlan自己的不一样,前面说过flat network是不带tag的网络,而vlan刚好与之相反。先看下图:

透过现象看本质——谈谈L2 agent 这回事儿

3个虚拟机实例一样是经过tap设备链接到brqxxxx的Linux网桥,而右边的物理网卡eth1就会建立一个名称为eth1.100的vlan 接口(100则表示ID号,能够理解为tag标记),而且与Linux bridge(brqxxxx)相连,这样,实例经过eth1.100发送的数据包到eth1上就会被打上100的标记。能够联想一下咱们NAT中端口多路复用实现地址转换的方法来类比理解。

​ 这样,就建立了一个基于Linux Bridged、vlan100的虚拟网络,固然这样的vlan能够划分多个,例如eth1.101,eth1.102......以此类推,固然须要链接新的Linux Bridge(brqyyyy)。

​ 当每个vlan 网络都有本身的网桥,那么这就实现了基于vlan的网络隔离。可是这里须要注意的是,该模式下物理交换机与eth1设备之间相连的口须要作trunk了。

说完Linux Bridge,再来谈谈Open vSwitch吧。

啥又是Open vSwitch?

​ Open vSwitch Agent是L2 Agent的一种实现。L2 Agent与Neutron的Bridge类型相对应(二层),有多种实现,好比:neutron-linuxbridge-agent、neutron-openvswitch-agent等。

​ 与linux bridge相比,Open vSwitch (可简称OVS)具备几种管控功能,并且性能更加优化,支持更多的功能,目前在openstack领域被称为主流。不过对于OVS实现网络而言理解起来更加复杂,因此先前就先从Linux Bridge入手。

​ OVS支持local、flat、vlan、vxlan、gre、geneve等全部网络类型。

​ 先来了解一下OVS中的各类网络设备:

(1)tap interface,命名为tapXXXX。
(2)linux bridge,命名为qbrXXXX。
(3)veth pair,命名为qvbXXXX,qvoXXXX。
(4)OVS integration bridge,命名为br-int,集成网桥,全部实例的虚拟网卡和其余虚拟网络设备都链接到该网桥。
(5)OVS patch ports,命名为int-br-ethX和phy-br-ethX(X为interface的序号)。
(6)OVS provider bridge,命名为br-ethX(X为interface的序号)。
(7)物理interface,命名为ethX(X为interface的序号)。
(8)OVS tunnel bridge,命名为br-tun,隧道(tunnel)网桥,基于隧道技术的 VxLAN 和 GRE 网络将使用该网桥进行通讯

注意:OVS provider bridge会在flat和vlan网络中使用;OVS tunnel bridge则会在vxlan和gre网络中使用。

​ 其中,集成网桥br-int在neutron网络中,一般用来链接Linux网桥和隧道网桥,而且进行不一样网络ID之间的映射转换。对于不一样的网络模式中,其实现的功能也是不一样的。

​ 下面经过基于OVS的vlan网络结构案例来讲明OVS实现网络的原理过程。

(3)基于OVS的vlan网络

透过现象看本质——谈谈L2 agent 这回事儿

​ 笔者PS水平通常,因此从网上截取来一张图来做为案例,省点时间,勿怪~^_^!左侧是图例,对应颜色来看哦!

​ 上面三层之间的联系没必要多说,而中间的veth对是个什么玩意儿呢?

​ 先来了解一下上图中的一些小模块。

一、qbrxxx:Linux网桥(Bridge)设备,qbrxxx位于实例和br-int网桥之间,主要负责网络安全组(Security Group)规则设置;
二、qvbxxx:Neutron的VETH设备,qvb表示Linux Bridge一侧的veth设备,qvb各个字母解释为:q-quantum, v-veth, b-bridge(quantum是Neutron的前身);
三、qvoxxx:Neutron的VETH设备,qvo表示OpenVswitch一侧的veth设备,qvo各个字母的解释为:q-quantum, v-veth, o-openvswitch;

​ 根据网上资料介绍,veth pair是虚拟Ethernet设备,VETH设备老是成对出现,向其一端输入数据,VETH会改变数据的方向并将其送入内核网络核心,完成数据的注入,以后在另外一端便能读到此数据。简单而言,从VETH设备一端输入的数据老是会从另外一端输出。

​ 所以,在Neutron中,两个不一样网桥之间一般使用VETH对进行数据传输。也就是说,Linux网桥与OVS集成网桥之间是提供veth对进行数据传输通讯的。而且经过端口所分配的vlan ID进行隔离。

​ 再来看OVS集成网桥br-int与OVS供应商网桥之间的PATCH端口,这里正好能够与前面的Veth pair类比理解,Patch Port两段链接的也是不一样的网桥,其中int-br-eth 1则是集成网桥上的Patch port设备,phy-br-eth 1供应商网桥上的Patch Port设备。而vlan ID在两者之间作转换,能够类比NAT理解。

​ 从外到内来看,即向上传输数据包的时候,vlan id根据flow table作转换,将外部定义好的id号转换为内部使用的vid号,即101——>1,102——>2,而从内到外而言刚好相反。而这块是真正基于二层代理所配置的部分。

来一个小总结吧

​ 本文主要讲述的是经过部分案例介绍有关L2代理中Linux Bridge和OVS基于不一样网络类型实现网络服务的原理,其中还包括扩展补充了一些Linux虚拟网络的理论部分知识。

相关文章
相关标签/搜索