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

前言

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

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

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

Service和Agent

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

  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)

举例说一说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对是个什么玩意儿呢?

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

1、qbrxxx:Linux网桥(Bridge)设备,qbrxxx位于实例和br-int网桥之间,主要负责网络安全组(Security Group)规则设置;
2、qvbxxx:Neutron的VETH设备,qvb表示Linux Bridge一侧的veth设备,qvb各个字母解释为:q-quantum, v-veth, b-bridge(quantum是Neutron的前身);
3、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虚拟网络的理论部分知识。