首页 > 代码库 > Neuron实现网络虚拟化

Neuron实现网络虚拟化

一 引子

    数据中心虚拟化成为了趋势,最典型的场景莫过于:对数据中心的服务器进行虚拟化,来提高资源利用率,同时降低单位能耗。

    但是,随着数据中心虚拟化程度的不断提高、虚拟化服务器规模的不断扩大,带来了巨大的管理压力。===>这就孕育了云计算诞生的条件。

    ps:在大规模虚拟化的基础上,实现了自动化管理和集中化管理,就是云计算的基本模型。这一点在互联网行业尤其重要。

    

    云计算的超大规模带来了诸多亟需解决的问题,这些问题中,首当其冲的就是网络问题。而关于网络,云计算的超大规模带来的压力问题也并不代表全部,我们需要从两个角度去看:

    一:数据中心现有的物理网络,无法承载云计算机的超大规模

    二:数据中心现有的物理网络,无法满足云计算SDN的要求

1.1 数据中心现有的物理网络,无法承载云计算机的超大规模

    互联网行业数据中心的基本特征就是服务器的规模偏大。进入云计算时代后,其业务特征变得更加复杂,包括:虚拟化支持、多业务承载、资源灵活调度等(如图1所示)。与此同时,互联网云计算的规模不但没有缩减,反而更加庞大。这就给云计算的网络带来了巨大的压力。

技术分享

                  图1. 互联网云计算的业务特点

大容量的MAC表项和ARP表项

虚拟化会导致更大的MAC表项。假设一个互联网云计算中心的服务器有5000台,按照1:20的比例进行虚拟化,则有10万个虚拟机。通常每个虚拟机会配置两个业务网口,这样这个云计算中心就有20万个虚拟网口,对应的就是需要20万个MAC地址和IP地址。云计算要求资源灵活调度,业务资源任意迁移。也就是说任意一个虚拟机可以在整个云计算网络中任意迁移。这就要求全网在一个统一的二层网络中。全网任意交换机都有可能学习到全网所有的MAC表项。与此对应的则是,目前业界主流的接入交换机的MAC表项只有32K,基本无法满足互联网云计算的需求。另外,网关需要记录全网所有主机、所有网口的ARP信息。这就需要网关设备的有效ARP表项超过20万。大部分的网关设备芯片都不具备这种能力。

4K VLAN Trunk问题

传统的大二层网络支持任意VLAN的虚拟机迁移到网络的任意位置,一般有两种方式。方式一:虚拟机迁移后,通过自动化网络管理平台动态的在虚拟机对应的所有端口上下发VLAN配置;同时,还需要动态删除迁移前虚拟机对应所有端口上的VLAN配置。这种方式的缺点是实现非常复杂,同时自动化管理平台对多厂商设备还面临兼容性的问题,所以很难实现。方式二:在云计算网络上静态配置VLAN,在所有端口上配置VLAN trunk all。这种方式的优点是非常简单,是目前主流的应用方式。但这也带来了巨大的问题:任一VLAN内如果出现广播风暴,则全网所有VLAN内的虚拟机都会受到风暴影响,出现业务中断。

4K VLAN上限问题

云计算网络中有可能出现多租户需求。如果租户及业务的数量规模超出VLAN的上限(4K),则无法支撑客户的需求。

虚拟机迁移网络依赖问题

VM迁移需要在同一个二层域内,基于IP子网的区域划分限制了二层网络连通性的规模。

 

1.2 数据中心现有的物理网络,无法满足云计算SDN的要求

    数据中心现有的物理网络是固定的,需要手动配置的,单一的,没有多组

    

 

 

云计算时代,多业务承载,虚拟化支持,资源灵活调度,网络压力巨大

现有的数据中心网络已经无法满足云计算的物理需求:

  1.大量的mac表项和arp表项

  2.4k vlan trunk问题(all广播风暴)

  3.4k vlan上限

  4.虚拟机迁移依赖问题,基于ip的子网划分限制了二层网络的连通性规模

现有的数据中网络已经根本无法满足云计算SDN的需求:

  1.租户共享物理网络但是彼此隔离(比如阿里云。。。)

  2.租户可以(通过云平台提供的api)自定义自己的网络(在物理网络的基础之上)

OpenStack 云也不例外。 OpenStack 通过 Neutron 项目在物理网络环境之上提供满足多租户要求的虚拟网络和服务。Neutron 提供的网络虚拟化能力包括:

  • (1)二层到七层网络的虚拟化:L2(virtual switch)、L3(virtual Router 和 LB)、L4-7(virtual Firewall )等
  • (2)网络连通性:二层网络和三层网络
  • (3)租户隔离性
  • (4)网络安全性
  • (4)网络扩展性
  • (5)REST API
  • (6)更高级的服务,包括 LBaaS,FWaaS,VPNaaS 等。

 

二 网路虚拟化

 

 

实际数据中心中网络可分为三层:

  1.openstack自己的架构网络

  2.external网络(机房的网络)

  3.internet(运营商网络)

openstack-》external-----(NAT)---》internal

 

2.1 网络l2 network

就是一个LAN或vlan,二层隔离的网段,标示一个广播域

更加用户创建权限分:

  provider network:管理员创建的和物理网络有直接映射关系的虚拟网络

  tenant network:租户普通用户自己建立的网络,物理网络对创建者透明,其配置由Neutron根据管理员在系统中的配置决定

根据网络类型分:

provider network:  

  vlan:基于物理 VLAN 网络实现的虚拟网络。共享同一个物理网络的多个 VLAN 网络是相互隔离的,甚至可以使用重叠的 IP 地址空间。每个支持 VLAN network 的物理网络可以被视为一个分离的 VLAN trunk,它使用一组独占的 VLAN ID。有效的 VLAN ID 范围是 1 到 4094。

  flat:基于不使用 VLAN 的物理网络实现的虚拟网络。每个物理网络最多只能实现一个虚拟网络。

  local:一个只允许在本服务器内通信的虚拟网络,不知道跨服务器的通信。主要用于单节点上测试。

tenant network:  

  gre(通用路由封装网络):一个使用 GRE 封装网络包的虚拟网络。GRE 封装的数据包基于 IP 路由表来进行路由,因此 GRE network 不和具体的物理网络绑定。

  vxlan(虚拟可扩展网络):基于 VXLAN 实现的虚拟网络。同 GRE network 一样, VXLAN network 中 IP 包的路由也基于 IP 路由表,也不和具体的物理网络绑定。

 

2.2 子网

2.3 端口

2.4 虚拟交换机

 Neutron 默认采用开源的 Open vSwitch 作为其虚机交换机,简称ovs,同时还支持使用 Linux bridge。

2.5 虚拟路由器

一个 Virtual router 提供不同网段之间的 IP 包路由功能,由 Nuetron L3 agent 负责管理。

 

三 网络规划

管理网络:包含api网络(public给外部用,admin给管理员用-是内部ip,internal给内部用-是内部ip)

数据网络

存储网络

IDRAC网络

PXE网络

 

3.1 虚拟二层

大二层的概念:vlan,gre,vxlan

物理上的三层虚拟上的二层:gre,vxlan

 

3.2 gre/vxlan解决了vlan的问题

  除了 VLAN 方式的物理的二层网络,另一种方式使用Tunnel/Overlay 方式实现虚机二层网络。那Overlay如何应对云计算网络的挑战呢?

(1)首先,Overlay的核心是重新构建一个逻辑网络平面,其技术手段的关键是采用隧道技术实现L2oIP的封装。通过隧道实现各虚拟机之间的二层直连。这样网络只看见Overlay边缘节点的MAC地址,物理网络学习到的MAC表项非常有限,现有接入交换机32K的MAC表项足以满足需求(如下图所示)。对应的Overlay边缘节点实现基于会话的地址学习机制,也就是说只学习有交互流量的虚拟机MAC地址。这样也严格限制了边缘节点的地址表项。

技术分享

(2)其次,Overlay网络仅仅是一个逻辑上的二层直连网络。其依赖的物理网络,是一个传统的路由网络。这个路由网络是一个三层到边缘的网络。也就是说二层广播域被缩小到极致。这样,网络风暴潜在的风险大幅度降低。同时,对于一些需要依赖二层广播的协议报文,例如:ARP报文,Overlay网络通过ARP代理等方式实现协议的内容透传,不会影响协议报文的正常运作。

(3)再次,针对4K VLAN上限问题,Overlay网络通过L2oIP的封装字段,提供24bits长度的隔离ID,最大可以支持16M租户或业务。

(4)最后,针对网络虚拟化问题。Overlay网络本身就是一个从物理网络中抽离的逻辑网络,通过名址分离使得内层IP地址完全作为一个寻址标签,不再具备路由功能,可以实现不同subnet之间二层互通,保证二层网络的连通性不受IP地址段的限制。

  在 Neutron 中,Neutron 将虚机发出的数据帧打包,走三层物理网络到达目的虚机的主机,解包给虚机。这种实现使得两个虚机的通信看起来是二层网络通信。

 

 技术分享

 

3.2 虚拟路由器

3.3 dhcp服务

网络节点上neutron提供基于dnsmas(轻型的dns和dhcp服务)实现dhcp服务,

每个网络都独有自己的dhcp和router,二者被一个特定网络内的主机共享,在namespace内

 

3.4 

 Neutron 实现了不同层次的租户网络隔离性:

  • 租户之间的网络是三层隔离的,连通过 VR 做路由都不行,实在要连通的话,需要走物理网络
  • 一个租户内的不同网络之间二层隔离的,需要通过 VR 做三层连通
  • 一个网络内的不同子网也是二层隔离的,需要通过 VR 做三层连通

    Neutron 对每个租户网络(tenant network)都分配一个 segmentation_id,其特点包括:

  • 每个 tenant network 都有一个这种 ID
  • 每个租户网络的 ID 在全部的租户范围内都是唯一的
  • 一个 ID 代表一个广播域
  • 一个 ID 使得同一网络内的两个虚机之间好像建立了一个虚拟通道(tunnel)一样
  • 不同 ID 的网络 tunnel 之间是互相隔离的
  • 根据物理实现不同,该ID被实现为几种不同的形式:
    • VLAN ID
    • GRE Tunnel ID
    • VxLAN VNI

 

以下图描述的 GRE 类型的网络为例:

 技术分享

  • (1)计算节点的 br-int 上,neutron 为每个虚机连接 OVS 的 access port 分配了内部的 VLAN Tag。这种 tag 限制了网络流量只能在 tenant network 之内。
  • (2)计算节点的 br-tun 上,neutron 将内部的 VLAN Tag 转化为 GRE Tunnel ID,是的不同 network 的流量走不通的 tunnel。
  • (3)网络节点的 br-tun 上,neutron 将 GRE Tunnel ID 转发了一一对应的 内部 VLAN Tag,使得网络流被不同的服务处理。
  • (4)网络节点的 br-int 上连接的 DHCP 和 L3 agent 使用 Linux network namespace 进行隔离。

3.5 neutron租户网络的安全性

除了租户的隔离性以外,

  • Neutron 还提供数据网络与外部网络的隔离性。默认情况下,所有虚机通往外网的流量全部走网络节点上的 L3 agent。在这里,内部的固定 IP 被转化为外部的浮动 IP 地址。这种做法一方面保证了网络包能够回来,另一方面也隐藏了内部的 IP 地址。
  • Neutron 还是用 Linux iptables 特性,实现其 Security Group 特性,从而保证访问虚机的安全性。
  • Neutron利用网络控制节点上的 network namespace 中的 iptables,实现了进出租户网络的网络包防火墙,从而保证了进出租户网络的安全性。

3.6

OpenStack 云中可能用于成千上万台虚机,成千上万个租户,因此,Neutron 的数据网络的可用性和扩展性非常重要。Neutron 中,这些特性包括几个层次:

(1)软件架构上,Neutron 实现OpenStack 标准的去中心化架构和插件机制,有效地保证了其扩展性。

技术分享

 

(2)Neutron 为每个 provider/tenant network 分配一个唯一的 segmentation_id。该 ID 的数目是影响可扩展性的因素之一。在规模不大的私有云中,往往是用 VLAN 模式,简单、可靠、能够满足规模要求;而在大型的私有云或者公有云中,往往使用 VxLAN。

网络类型ID 数目说明
flat1通常不用于数据网络,因为其不具备租户隔离型。
vlan4094802.1Q 定义了 VLAN ID 占 12-bit
GRE16777216RFC 2637 定义的 GRE 的 ID 占 24-bit
VxLAN16777216RFC 7348 定义的 VxLAN 的 ID 占 24-bit

 

 

 

 

 

(3)分布式 Virtual Router (DVR) 和 分布式 DHCP agent

默认情况下,L3 agent 和 DHCP agent 部署在网络节点上,这在大规模的云环境中可能会存在性能问题。

技术分享        技术分享

(左图-图15,未使用DVR。右图-图16,使用了DVR-分布式虚拟路由器。)

通过使用 DVR,L3 转发和 NAT 会被分布在计算节点上,这使得计算节点变成了网络节点,这样集中式的网络节点的负载就被分担了。这个 Blueprint 实现了分布式的 DHCP Agent,这进一步释放了集中式网络节点的压力。

(4)L2 Population 和 ARP Responder:这两个功能大大减少了网络的复杂性,提交了网络效率,从而促进了扩展性。

(4)高可用:虽然 Neutron 在高可用实现方面走在了 OpenStack 所有组件的前列,目前已经实现了多种 L3 Agent 的 HA 方案,但是,这些方案目前还不是很成熟,大都是在 Juno 版本中添加的,而且现在还在持续优化中,离正式进入生产环境还有一些距离。但是,我们可以相信,再经过两三个版本,这些功能就能够进入生产环境。

3.7 其他扩展服务

在实际的网络中,除了网络的核心功能以外,还有一些普遍应用的网络服务,比如 VPN, Load Balancing 和 Firewall 等。Neutron 针对这些普遍的服务,也提供了参考实现。需要注意的是,目前这些实现更多类似于一种原型实现(PoC),其目的是向给产品实现者提供一种参考架构,因此,这些功能往往还不能直接应用到生产系统。正是考虑到这些特点,目前 Neutron 项目组将这些代码挪出了 Neutron的主代码库。

3.8 Neuron REST API

Neutron 的 neutron-server 模块提供 REST API 来操作上文提到的各种网络组件,包括 network,subnet,port,router 等。可参考上图13。具体的 API 可以参考 这里和这里。

 

四 neutron openvswitch+vlan虚拟网络

4.1 vlan介绍

局域网LAN(多个机器连接一个Hub或者Switch),是一个广播域

VLAN:一台Switch划分出多个虚拟机的LAN,每个vlan中的主机连接交换机的端口是access口,从而保证了交换机只在同一个vlan中转发包

IEEE 802.1Q 标准定义了 VLAN Header 的格式。它在普通以太网帧结构的 SA (src addr)之后加入了 4bytes 的 VLAN Tag/Header 数据,其中包括 12-bits 的 VLAN ID。VLAN ID 最大值为4096,但是有效值范围是 1 - 4094。

技术分享

 

 带vlan的交换机端口分:

access口

trunk口

两台交换机通过一个根线连接,线的两头都是trunk口,可以转发多个vlan信息

 

4.2 vlan类型

基于port的vlan(数据帧中不包含vlan tag,vlan信息从交换机的端口pvid上得知,交换机转发包也基于此)

基于tagged vlan(数据帧中包含vlan tag,vlan信息从数据帧内包含的vlan信息,交换机需要有对该数据帧拆包/封包的能力,即连接到这种端口的网络设备必须是8021.Q)

 

4.3 vlan的不足

1.4kvlan上限:才12个bits的vlan id,代表最多也只能有4096个隔离的网络,你单瞅瞅阿里云也应该明白,只有4096个网络是远不够用的

2.vlan是基于l2的,很难跨越二层的局限(很难跨地域),限制了网络的灵活性,

3.vlan的操作需要人工介入太多

上述三条在小公司,云平台规模不大的情况下,反而 会是一种优势,但是在大规模的云平台下这三点则是缺点

 

4.4

mac地址学习

arp原理

4.5 openvswitch+vlan组网

  1. 管理网络,用于 OpenStack 节点之间的通信,假设 VLAN ID 范围为 50 - 99.
  2. 数据网络,用于虚拟机之间的通讯。由于Vlan模式下,租户建立的网络都具有独立的 Vlan ID,故需要将连接虚机的服务器的交换机端口设置为 Trunk 模式,并且设置所允许的 VLAN ID 范围,比如 100~300。
  3. 外部网络,用于连接外部网络。加上 VLAN ID 范围为 1000-1010。

技术分享

 

关于网段之间的路由:

  • 如果该物理交换机接到一个物理路由器并做相应的配置,则数据网络可以使用这个物理路由器,而不需要使用 Neutron 的虚拟路由器。
  • 如果不使用物理的路由器,可以在网络节点上配置虚拟路由器。

 

当 Neutron L2 Agent (OVS Agent 或者 Linux Bridge agent)在计算和网络节点上启动时,它会根据各种配置在节点上创建各种 bridge。以 OVS Agent 为例,

(1)创建 intergration brige(默认是 br-int);如果 enable_tunneling = true 的话,创建 tunnel bridge (默认是 br-tun)。

(2)根据 bridge_mappings,配置每一个 VLAN 和 Flat 网络使用的 physical network interface 对应的预先创建的 OVS bridge。

(3)所有虚机的 VIF 都是连接到 integration bridge。同一个虚拟网络上的 VM VIF 共享一个本地 VLAN (local VLAN)。Local VLAN ID 被映射到虚拟网络对应的物理网络的 segmentation_id。

(4)对于 GRE 类型的虚拟网络,使用 LSI (Logical Switch identifier)来区分隧道(tunnel)内的租户网络流量(tenant traffic)。这个隧道的两端都是每个物理服务器上的 tunneling bridge。使用 Patch port 来将 br-int 和 br-tun 连接起来。

(5)对于每一个 VLAN 或者 Flat 类型的网络,使用一个 veth 或者一个 patch port 对来连接 br-int 和物理网桥,以及增加 flow rules等。

(6)最后,Neutron L2 Agent 启动后会运行一个RPC循环任务来处理 端口添加、删除和修改。管理员可以通过配置项 polling_interval 指定该 RPC 循环任务的执行间隔,默认为2秒。

 

4.6 neutron代码实现

boot虚拟机的过程。nova依次会

1调用neutron rest api申请一个或多个port,neutron会根据数据库中的配置进行分配

2计算机节点上,nova调用ovs-vsctl命令将虚拟机的VIF被plug到br-int上

3启动虚拟机

neutron l2 agent的循环任务每隔2秒会

  1)调用ovs-vsctl list-ports命令获取br-int上的port,在根据上次保存的历史记录,生成所有变更端口的列表(包括添加的,删除的,更新的)

  2)为每一个待处理端口,根据其ID从DB中取出详细信息

  3)针对每一个增加或变更的port设置local vlan tag,调用命令ovs-ofctl mod-flows命令来设置br-tun或者物理的bridge的flow rules;并设置db中其状态为up

  4)针对每一个被删除的port,设置db中其状态为down

4.7 neutron vlan模式虚拟机网络

技术分享

neutron在该计算节点上做的事情:

  创建了OVS Integration bridge br-int。它的四个Access口中,两个打上了内部vlan Tag1,连接接入network1的两个网卡;另外两个端口打上的是vlan tag 2

  创建一对patch port连接br-int和br-eth1

  设置br-int中的flow rules。对从access ports进入的数据帧,加上相应的vlan tag,转发到patch port;从patch port进入的数据帧,将vlan id 101修改为1,102修改为2,再转发到相应的access ports

  设置br-eth1中的flow rules。从patch port进入的数据帧,将内部vlan id 1修改为101,内部vlan id 2修改为102,再从eth1端口发出。对从eht1进入的数据帧做相反的处理

 

技术分享

 

 技术分享

 

 4.8 隔离的概念

对比阿里云来说,隔离的概念很好理解

不同的tenant是隔离的

同一tenant下不同的子网也是隔离的

技术分享

4.9 隔离的网络直接可以通过路由来进行通信

技术分享

 

 

五 neutron openvswitch+gre/vxlan虚拟网络

gre不足:

  1.点对点,所有的计算节点和网络节点都会建立GRE Tunnel,规模扩大,效率极其的低下

  2.扩大的广播域,GRE不支持组播,一个网络(GRE Tunnel ID一样)中的一个vm发出广播帧后,GRE 会将其广播到所有与该节点有隧道连接的节点。

  3.GRE 封装的IP包的过滤和负载均衡问题

    目前还是有很多的防火墙和三层网络设备无法解析 GRE Header,因此它们无法对 GRE 封装包做合适的过滤和负载均衡。 

 

 VxLAN 主要用于封装、转发2层报文。VXLAN 全称 Virtual eXtensible Local Area Network,简单的说就是扩充了的 VLAN,其使得多个通过三层连接的网络可以表现的和直接通过一台一台物理交换机连接配置而成的网络一样处在一个 LAN 中。

    它的实现机制是,将二层报文加上个 VxLAN header,封装在一个 UDP 包中进行传输。VxLAN header 会包括一个 24 位的 ID(称为VNI),含义类似于 VLAN id 或者 GRE 的 tunnel id。GRE 一般是通过路由器来进行 GRE 协议的封装和解封的,在 VXLAN 中这类封装和解封的组件有个专有的名字叫做 VTEP。相比起 VLAN 来说,好处在于其突破了VLAN只有 4000+ 子网的限制,同时架设在 UDP 协议上后其扩展性提高了不少(因为 UDP 是高层协议,屏蔽了底层的差异,换句话说屏蔽了二层的差异)。

 

 

报文封装

http://www.cnblogs.com/xingyun/p/4620727.html

 

 

 

VXLAN和GRE都是虚拟的二层物理的三层,arp广播也可以通过物理的三层取转发,这样效率就低了,于是有SDN和l2population Driver

http://www.cnblogs.com/linhaifeng/p/6569539.html

 

技术分享

 

 

 

六 neutron ovs opnflow流表和l2 population

七 neutron dhcp agent

八 neutron l3 agent

 

Neuron实现网络虚拟化