OpenStack学习笔记之五:Neutron介绍

Neutron理论详解

1 引入

OpenStack网络服务提供了一个API接口,允许用户在云上设置和定义网络连接和地址。这个网络服务的项目代码名称是Neutron。OpenStack网络处理虚拟设备的创建和管理网络基础设施,包括网络、交换机、子网以及由计算服务(nova)管理的设备路由器。高级服务,如防火墙或虚拟私人网络(VPN)。

OpenStack网络由neutron-server,持久化存储数据库,和任意数量的插件代理组成,这些代理提供其他服务,如与本地linux联网接口机制、外部设备或SDN控制器。

OpenStack网络是完全独立的,可以部署到一个专用主机。如果你的部署使用了一个控制器主机运行集中计算组件,你可以部署网络服务来取代主机的设定。

OpenStack网络集成了各种组件:

  1. 身份认证(Keystone)用于身份验证以及api请求的授权。
  2. 计算服务(Nova)用于把一个特定网络插入每个虚拟机中。
  3. 仪表盘(Horizon)由管理员和租户通过一个基于WEB的图形界面创建和管理网络。

2 一些术语

Neutron管理所有虚拟网络基础设施(VNI),物理网络基础设施(PNI)的接入层。OpenStack网络允许租户创建包括像firewall, :term:load balancer:term:virtual private network (VPN)等这样的高级虚拟网络拓扑。

网络服务提供网络,子网以及路由这些对象的抽象概念,模拟对应的物理设备:网络包括子网,路由在不同的子网和网络间进行路由转发。

给定的网络必须包含至少一个外部网络。它代表了一种OpenStack安装之外的能从物理的,外部的网络访问的视图。外部网络上的IP地址可供外部设备访问。

租户会拥有一个或多个内部网络。这些软件定义的网络直接连接到虚拟机。内部网络类似于局域网,用于连接到内部网络的虚拟机之间通信,也可以通过路由连接其他内部网络或外部网络。

如果外部网络想要和实例通信,就需要配置路由了。每一个路由都配有一个网关用于连接到外部网络,以及一个或多个连接到内部网络的接口。子网可以访问同一个路由上其他子网中的机器,并且机器也可以访问路由的网关访问外部网络。
浮动IP是一个外部网络地址,它可以分配给内部网络的端口。通过这种方式,外部网络上的实体可以访问实例。
安全组允许管理员在安全组中定义防火墙规则。一个实例可以属于一个或多个安全组。

所有的Networking安装使用了一个核心插件和一个安全组插件(或仅是空操作安全组插件)。另外,防火墙即服务(FWaaS)和负载均衡即服务(LBaaS)插件是可用的。

3 Neutron架构

  • 位于最上层的Neutron Server充当一个门派中的"掌门人"角色(RESTful Server),负责接受来自外部门派(项目)的API请求,比如Nova API创建网络的请求。
  • 位于中间层的Neutron Plugin充当一个门派中的"信使"角色,负责传达最高层指令给下面的人。
  • 位于下层的Neutron Agent充当一个门派中"干活"角色,负责执行一些具体的任务和操作。

类似于各个计算、存储节点被虚拟化为计算、存储资源池,Openstack所在的整个物理网络在Neutron中也被虚拟化为网络资源池。通过对网络资源的划分和可扩展性,Neutron能够为每个租户提供独立的虚拟网络环境。

Neutron分别提供了二层(L2)vSwitch交换和三层(L3)Router路由抽象的功能,对应于物理网络环境中的交换机和路由器实现。具体实现了如下功能:

  1. Router:为租户提供路由、NAT等服务。
  2. Network:对应于一个真实物理网络中的二层局域网(VLAN),从租户的的角度而言,是租户私有的。
  3. Subnet:为网络中的三层概念,指定一段IPV4或IPV6地址并描述其相关的配置信息。它附加在一个二层Network上,指明属于这个network的虚拟机可使用的IP地址范围。

3.1 Linux虚拟网络

Neutron中最为核心的工作便是对二层物理网络network的抽象与管理。

虚拟机的网络功能由虚拟网卡(vNIC)提供,Hypervisor可以为每个虚拟机创建一个或多个vNIC,从虚拟机的角度出发,这些vNIC等同于物理的网卡,为了实现与传统物理网络一样的网络功能,与物理网卡一样,Switch也被虚拟化成虚拟交换机(OpenvSwitch),各个vNIC连接在vSwitch的端口(br-int)上,最后这些vSwitch通过物理服务器的物理网卡访问外部的物理网络。

对一个虚拟的二层网络结构而言,主要是完成两种网络设备的虚拟化,即物理网卡和交换设备。在Linux环境下网络设备的虚拟化主要有以下几种形式:

TAP/TUN/VETH

提到Neutron的虚拟网络功能实现,不得不先提基于Linux内核级的虚拟设备。

TAP/TUN/VETH是Linux内核实现的一对虚拟网络设备,TAP工作在二层,收发的是MAC层数据帧;TUN工作在三层,收发的是IP层数据包。Linux内核通过TAP/TUN设备向绑定该设备的用户程序发送数据,反之,用户程序也可以像操作硬件网络设备一样,通过TAP/TUN设备接收数据。

基于TAP设备,实现的是虚拟网卡的功能,当一个TAP设备被创建时,在Linux的设备文件目录下将会生成一个对应的字符设备文件(/dev/tapX文件),而运行其上的用户程序便可以像使用普通文件一样打开这个文件进行读写。

VETH设备总是成对出现的,接收数据的一端会从另一端发送出去,理解为一根虚拟的网线即可。

Linux Bridge

Linux Bridge(Linux内核实现的网桥)是工作在二层的虚拟网络设备,功能类似于物理的交换机。

它的实现原理是,通过将其他Linux网络设备绑定到自身的Bridge上,并将这些设备虚拟化为端口。为什么我们已经有了OVS,还要有Linux Bridge 呢?这是因为Linux Bridge实现了qbrxxx设备,提供了OVS无法支持的安全组(Security Group)功能

Open vSwitch

对于云计算中的虚拟网络而言,交换设备的虚拟化是很关键的一环,vSwitch负责连接vNIC与物理网卡,同时也桥接同一物理服务器内的各个VM的vNIC。

因此,我们可以像配置物理交换机一样,将接入到OpenvSwitch(需要指出的是在多个以上时,vSwitch是分布式虚拟交换机)上的各个VM分配到不同的VLAN中实现网络隔离,并且,我们也可以在OVS端口上为VM配置QOS,同时OVS也支持包括NetFlow、sFlow等标准的管理接口和协议。从而,通过这些接口可以实现VM流量监控的任务。

运行在云环境中各种或相同虚拟化平台上的多个vSwitch实现了分布式架构的虚拟交换机。一个物理服务器上的vSwitch可以透明的与其他服务器上的vSwitch连接通信。

3.2 Neutron RPC

RPC是neutron中跨模块进行方法调用的很重要的一种方式,主要包括client端和server端。client端用于发出rpc消息,server端用于监听消息并进行相应处理。

  1. Agent端RPC:在dhcpagent、l3agent、firewall agent以及metering agent的main函数中都能找到类似的创建一个Agent rpc服务端的代码。
  2. plugin端的rpc
  3. neutron-server端的rpc

3.3 Neutron的核心

网络:在实际的物理环境下,我们使用交换机或集线器把多个计算机连接起来形成了网络。在Neutron的世界里,网络也是将多个不同的云主机连接起来。
子网:在实际的物理环境下,在一个网络中。我们可以将网络划分为多个逻辑子网。在Nrutron的世界里,子网也是隶属于网络下的。
端口:在实际的物理环境下,每个子网或每个网络,都有很多端口,比如交换机端口来供计算机连接。在Neutron的世界里端口也是隶属于字往下,云主机的网卡会对应到一个端口上。
路由器:在实际的网络环境下,不同网络或不同逻辑子网之间如果需要通信,需要通过路由器进行路由。在Nrutron里路由也是这个作用,用来连接不同的网络或子网。

4 Neutron网络模型

4.1 单一平面网络

单一平面网络的缺点:

  • 存在单一网络瓶颈,缺乏可伸缩性。
  • 缺乏合适的多租户隔离。

4.2 多平面网络

4.3 混合平面私有网络

4.4 通过私有网络实现运营商路由功能

4.5 通过私有网络实现每个租户创建自己专属的网络区段

5 Neutron网络流程

虚拟实现的1层到3层(TCP/IP)整个流程

一层的服务器及其VM(由Linux Kernel创建的qbr、tap/tun、veth、iptables这些设备分别实现相应功能)→二层的网络设备(由OpenvSwitch、dnsmasq创建的qvo、br-int、br-tun、br-ex、qrouter、qdhcp等设备分别实现相应功能)→再到,三层的传输程序(由patch-int/patch-tun等分别实现相应的功能)。

在Neutron虚拟网络中,除了Neutron本身命令外,还包括了Linux Bridge的brctl命令;OpenvSwitch的ovs-vsctl、ovs-ofctl命令和L3的NameSpace的ipnetns等命令。

qbr-xxx:用于挂载安全组

br-int:主机内部的桥,用于同一台主机内部的云主机之间的通信。没有上行链路的虚拟交换机

br-ethx:局域网内的桥,用于位于不同主机的云主机之间的通信,以及内部网络和外部之间的通信。有上行链路的虚拟交换机

br-ex:云主机和外部网络通信的桥,只有网络节点才有该桥

5.1 GRE模式

在OpenStack中,所有网络有关的逻辑管理均在Network节点中实现,例如DNS、DHCP以及路由等。Compute节点上只需要对所部属的虚拟机提供基本的网络功能支持,包括隔离不同租户的虚拟机和进行一些基本的安全策略管理(即securitygroup)。Compute节点上包括两台虚拟机VM1和VM2,分别经过一个网桥(如qbr-XXX)连接到br-int网桥上。br-int网桥再经过br-tun网桥(物理网络是GRE实现)连接到物理主机外部网络。对于物理网络通过VLAN来隔离的情况,则一般会存在一个br-eth网桥,替代br-tun网桥。

计算节点

  1. 在VM1中,虚拟机的网卡实际上连接到了物理机的一个TAP设备(即A,常见名称如tap-XXX)上,A则进一步通过VETH pair(A-B)连接到网桥qbr-XXX的端口vnet0(端口B)上,之后再通过VETH pair(C-D)连到br-int网桥上。一般C的名字格式为qvb-XXX,而D的名字格式为qvo-XXX。注意它们的名称除了前缀外,后面的id都是一样的,表示位于同一个虚拟机网络到物理机网络的连接上。之所以TAP设备A没有直接连接到网桥br-int上,是因为OpenStack需要通过iptables实现security group的安全策略功能。目前openvswitch并不支持应用iptables规则的Tap设备。因为qbr的存在主要是为了辅助iptables来实现security group功能,有时候也被称为firewall bridge。
  2. 端口patch-tun(即端口E,端口号为1)连接到br-tun上,实现到外部网络的隧道。 端口qvo-XXX(即端口D,端口号为2)带有tag1,说明这个口是一个1号VLAN的access端口。虚拟机发出的从该端口到达br-int的网包将被自动带上VLAN tag 1,而其他带有VLAN tag 1的网包则可以在去掉VLAN tag后从该端口发出(具体请查询VLAN access端口)。这个VLAN tag是用来实现不同网络相互隔离的,比如租户创建一个网络(neutron net-create),则会被分配一个唯一的VLAN tag。
  3. br-int在GRE模式中作为一个NORMAL交换机使用,因此有效规则只有一条正常转发。如果两个在同一主机上的vm属于同一个tenant的(同一个VLAN tag),则它们之间的通信只需要经过br-int即可。
  4. br-tun将带有VLAN tag的vm跟外部通信的流量转换到对应的gre隧道,这上面要实现主要的转换逻辑,Compute节点上发往GRE隧道的网包最终抵达Network节点上的br-tun。网络节点上的规则跟Compute节点上br-tun的规则相似,完成tunnel跟VLAN之间的转换。

网络节点

  1. 网络节点上的br-int集成网桥上挂载了很多进程来提供网络服务,包括路由器、DHCP服务器等。这些进程不同的租户可能都需要,彼此的地址空间可能冲突,也可能跟物理网络的地址空间冲突,因此都运行在独立的网络名字空间中。 规则跟Compute节点的br-int规则一致,表现为一个正常交换机。
  2. 在linux中,网络名字空间可以被认为是隔离的拥有单独网络栈(网卡、路由转发表、iptables)的环境。网络名字空间经常用来隔离网络设备和服务,只有拥有同样网络名字空间的设备,才能看到彼此。 可以用ip netns list命令来查看已经存在的名字空间。qdhcp开头的名字空间是dhcp服务器使用的,qrouter开头的则是router服务使用的。
  3. dhcp服务是通过dnsmasq进程(轻量级服务器,可以提供dns、dhcp、tftp等服务)来实现的,该进程绑定到dhcp名字空间中的br-int的接口上。可以查看相关的进程。
  4. 目前router服务(内部网络中主机想要访问外部互联网的地址)的实现是通过iptables进行的。 同样的,router服务也运行在自己的名字空间中.
  5. br-ex上直接连接到外部物理网络,一般情况下网关在物理网络中已经存在,则直接转发即可。

5.2 VLAN模式

VLAN模式下的系统架构跟GRE模式下类似,需要注意的是,在VLAN模式下,VLAN tag的转换需要在br-int和br-ethx两个网桥上进行相互配合。即br-int负责从int-br-ethX过来的包(带外部VLAN)转换为内部VLAN,而br-ethx负责从phy-br-ethx过来的包(带内部VLAN)转化为外部的VLAN。

计算节点

类似GRE模式下,br-int负责租户隔离,br-eth1负责跟计算节点外的网络通信。 在VLAN模式下,租户的流量隔离是通过VLAN来进行的,因此此时包括两种VLAN,虚拟机在Compute Node内流量带有的local VLAN和在Compute Node之外物理网络上隔离不同租户的VLAN。br-int和br-eth1分别对从端口int-br-eth1和phy-br-eth1上到达的网包进行VLAN tag的处理。此处有两个网,分别带有两个VLAN tag(内部tag1对应外部tag101,内部tag2对应外部tag102)。其中,安全组策略仍然在qbr相关的iptables上实现。

  1. br-int:完成从br-eth1上过来流量(从口int-br-eth1到达)的VLAN tag转换.
  2. br-eth1:负责从br-int上过来的流量(从口phy-br-eth1到达),实现local VLAN到外部VLAN的转换.

网络节点

类似GRE模式下,br-eth1收到到达的网包,int-br-eth1和phy-br-eth1上分别进行VLAN转换,保证到达br-int上的网包都是带有内部VLAN tag,到达br-eth1上的都是带有外部VLAN tag。br-ex则完成到OpenStack以外网络的连接。

  1. br-eth1主要负责把物理网络上外部VLAN转化为local VLAN。
  2. br-int上挂载了大量的agent来提供各种网络服务,另外负责对发往br-eth1的流量,实现local VLAN转化为外部VLAN。
  3. dnsmasq负责提供DHCP服务,绑定到某个特定的名字空间上,每个需要DHCP服务的租户网络有自己专属隔离的DHCP服务(图中的tapXXX和tapWWW上各自监听了一个dnsmasq)。
  4. 路由是L3 agent来实现,每个子网在br-int上有一个端口(qr-YYY和qr-ZZZ,已配置IP,分别是各自内部子网的网关),L3 agent绑定到上面。要访问外部的公共网络,需要通过L3 agent发出,而不是经过int-br-ex到phy-br-ex(实际上并没有网包从这个veth pair传输)。如果要使用外部可见的floating IP,L3 agent仍然需要通过iptables来进行NAT。
  5. br-ex要做的事情很简单,只需要正常转发即可。

5.3 VXLAN模式

VXLAN模式下,网络的架构跟GRE模式类似,所不同的是,不同节点之间通过VXLAN隧道互通,即虚拟化层是采用的VXLAN协议。

计算节点

计算节点上运行着虚拟机。如果不启用DVR特性,则所有的网络相关的服务,都在网络节点上进行。即计算节点上的网络只需要实现二层转发即可。

  1. br-int规则比较简单,作为一个正常的二层交换机使用。无论下面虚拟化层是哪种技术实现,集成网桥是看不到的,只知道根据VLAN和mac进行转发。
  2. br-tun作为虚拟化层网桥,规则就要复杂一些。要将内部过来的网包进行合理甄别,内部带着正确VLAN tag过来的,从正确的tunnel扔出去;外面带着正确tunnel号过来的,要改到对应的内部VLAN tag扔到里面。

网络节点

网络节点担负着进行网络服务的任务,包括DHCP、路由和高级网络服务等。一般包括三个网桥:br-tun、br-int和br-ex。

  1. br-tun跟计算节点类似,作为虚拟化层网桥。要将内部过来的网包进行合理甄别,内部带着正确VLAN tag过来的,从正确的tunnel扔出去;外面带着正确tunnel号过来的,要改到对应的内部VLAN tag扔到里面。
  2. br-int是集成网桥,规则比较简单,作为一个正常的二层交换机使用。无论下面虚拟化层是哪种技术实现,集成网桥是看不到的,只知道根据VLAN和mac进行转发。
  3. br-ex核心接口有两个,一个是挂载的物理接口上,如eth0,网包将从这个接口发送到外部网络上;另外一个是qg-xxx这样的接口,是连接到router服务的网络名字空间中,里面绑定一个路由器的外部IP,作为NAT时候的地址,另外,网络中的floating IP也放在这个网络名字空间中。网桥的规则也很简单,作为一个正常的二层转发设备即可。
相关推荐
hbz-2 小时前
【HBZ分享】如何规避TCP的洪水攻击
网络·网络协议·tcp/ip
Comedy_宁2 小时前
TCP/IP协议超时重传,以及应用层超时重传一文详解
网络·网络协议·tcp/ip
码思途远3 小时前
NXP i.MX8系列平台开发讲解 - 3.18 Linux tty子系统介绍(一)
linux·nxp·i.mx8m
aliceDingYM3 小时前
Linux python3.6安装mayavi报错
linux·python·ui
没耳朵的Rabbit3 小时前
RedHat运维-LinuxSELinux基础3-用布尔值调整SELinux政策
运维·服务器
kinlon.liu3 小时前
Linux的前世今生
linux·运维·服务器
CloudJourney3 小时前
探索 Kali Linux:定义、架构、原理、应用场景及常见命令体系
linux·运维·架构
没耳朵的Rabbit3 小时前
RedHat运维-LinuxSELinux基础1-SELinux三种状态
运维·服务器·网络
搬砖写代码3 小时前
MySQL数据库文件在Linux下存放位置
linux·数据库·mysql
季春二九4 小时前
解决 Docker 容器镜像拉取难题:全面指南
运维·docker·容器