Neutron所实现的虚拟化网络

 1. 为什么要网络虚拟化?

数据中心(Data Center)中的物理网络是固定的、需要手工配置的、单一的没有多租户隔离的网络。这是一个物理网络局部实例:

 scj-net2

(图1, 来源:Cisco 网站。 TOR:Top On Rack 交换机。图中的一个服务器有三块网卡,分别连到连接数据网络和管理网络的交换机。)

(图2,物理网络中的分层交换机和路由器。来源:google)

而云架构往往是多租户架构,这意味着多个客户会使用单一的物理网络。因此,除了提供网络连接能力以外,云还需要提供网络在租户之间的隔离能力;同时云是自服务的,这意味着租户可以通过云提供的 API 来使用虚拟出的网络组建来设计,构建和部署各种他们需要的网络。

(左图-图3: 计算虚拟化和网络虚拟化。来源)                                                 (右图-图4:来源 MidoNet 提供的物理网络和逻辑网络的映射)

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 等。具体以后再慢慢分析。

2. Neutron 网络虚拟化

这是 RedHat 提供的一个 OpenStack 云环境的网络架构:

Neutron 向租户提供虚拟的网络(network)、子网(subnet)、端口 (port)、交换机(switch)、路由器(router)等网络组件。下图显示了虚拟网络和物理网络的映射关系:

(图5.来源:2015 OpenStack技术大会-Neutron云计算网络虚拟化-龚永生.pdf)

2.1 网络(L2 network)

网络(network)是一个隔离的二层网段,类似于物理网络世界中的虚拟 LAN (VLAN)。更具体来讲,它是为创建它的租户而保留的一个广播域,或者被显式配置为共享网段。端口和子网始终被分配给某个特定的网络。

根据创建网络的用户的权限,Neutron network 可以分为:

Provider network:管理员创建的直接和物理网络映射的网络。 Tenant network:租户普通用户创建的网络,其配置由 Neutorn 根据管理员在系统中的配置决定。根据网络的类型,Neutron network 可以分为:

VLAN network(虚拟局域网) :基于物理 VLAN 网络实现的虚拟网络。共享同一个物理网络的多个 VLAN 网络是相互隔离的,甚至可以使用重叠的 IP 地址空间。每个支持 VLAN network 的物理网络可以被视为一个分离的 VLAN trunk,它使用一组独占的 VLAN ID。有效的 VLAN ID 范围是 1 到 4094. Flat network:基于不使用 VLAN 的物理网络实现的虚拟网络。每个物理网络最多只能实现一个虚拟网络。 local network(本地网络):一个只允许在本服务器内通信的虚拟网络,不知道跨服务器的通信。主要用于单节点上测试。 GRE network (通用路由封装网络):一个使用 GRE 封装网络包的虚拟网络。GRE 封装的数据包基于 IP 路由表来进行路由,因此 GRE network 不和具体的物理网络绑定。 VXLAN network(虚拟可扩展网络):基于 VXLAN 实现的虚拟网络。同 GRE network 一样, VXLAN network 中 IP 包的路由也基于 IP 路由表,也不和具体的物理网络绑定。

2.1.1 Provider network

Provider Network 是由 OpenStack 管理员创建的,直接对应于数据中心的已有物理网络的一个网段。这种网络有三个和物理网络有关属性:

provider:network_type (网络类型,包括 vxlan, gre, vlan, flat, local)  provider:segmentation_id (网段 ID, 比如 VLAN 的 802.1q tag, GRE 网络的 Tunnel ID, VXLAN 网络的 VNI)  provider:physical_network (物理网络的逻辑名称,比如 physnet1, ph-eth3, etc)  这种网络是可以在多个租户之间共享的。这种网络通过计算和网络节点上指定的 bridge 直接接入物理网络,所以默认的情况下它们是可以路由的,因此也不需要接入 Neutron Virtual Router,也不需要使用 L3 agent。使用这种网络,必须预先在各计算和网络节点上配置指定的网桥。

虽然可以创建 GRE 和 VXLAN 类型的 Provider network, 但是(个人认为)这种网络只对 Flat 和 VLAN 类型的网络才有意义,因为 Provider network 的一个重要属性是 provider:physical_network,而这个参数对其他网络类型没有有意义。

创建 provider network:

local 类型的:neutron net-create NAME --provider:network_type local flat 类型的:neutron net-create NAME --provider:network_type flat --provider:physical_network PHYS_NET_NAME vlan 类型的:neutron net-create NAME --provider:network_type vlan --provider:physical_network PHYS_NET_NAME --provider:segmentation_id VID gre 类型的:neutron net-create NAME --provider:network_type gre --provider:segmentation_id TUNNEL_ID vxlan 类型的:neutron net-create NAME --provider:network_type vxlan --provider:segmentation_id TUNNEL_ID

2.1.3 Tenant network

Tenant network 是由 tenant 的普通用户创建的网络。默认情况下,这类用户不能创建共享的 tenant network(因此 Nuetron Server 的policy 设置了'create_network:shared': 'rule:admin_only'。),因此这种网络是完全隔离的,也不可以被别的 tenant 共享。

Tenant network 也有 local,flat,vlan,gre 和 vxlan 等类型。但是,tenant 普通用户创建的 Flat 和 VLAN tenant network 实际上还是 Provider network,所以真正有意义的是 GRE 和 VXLAN 类型,这种网络和物理网络没有绑定关系。

创建 tenant network 的过程:

(0)管理员在 neutron 配置文件中配置 tenant_network_types,其值可以设为一个所支持的网络类型列表,比如 “vlan,gre,vxlan”。其默认值为 “local“,因此需要改变。该值表明该 OpenStack 云中允许被创建的 tenant network 类型。

(1)运行命令 neutron net-create <net_name>

(2)neutron server 逐一根据该配置项尝试创建 network segment,成功则立即返回。

def allocate_tenant_segment(self, session):
    for network_type in self.tenant_network_types: #挨个试
        driver = self.drivers.get(network_type)
        segment = driver.obj.allocate_tenant_segment(session)
        if segment: #返回第一个成功的 segment
            return segment
    raise exc.NoNetworkAvailable()

创建每种网络时,使用不同的配置项:

网络类型配置项说明实例
vlannetwork_vlan_ranges = physnet1:1000:2999,physnet2指定所使用的物理网络的标签和支持的 VLAN ID 范围network_vlan_ranges = default:2000:3999
integration_bridge = br-int
bridge_mappings = default:br-eth3
flatflat_networks = physnet1,physnet2指定所使用的物理网络的 label
gretunnel_id_ranges =a list of <tun_min>:<tun_max> local_ip = <ip> 一组可用的 GRE ID 区间列表; 建立 GRE Tunnel 使用的 IP 地址enable_tunneling = true
tunnel_id_ranges = 1:1000
integration_bridge = br-int
tunnel_bridge = br-tun
local_ip = 10.0.0.3
 vxlan  vni_ranges = a list of <vni_min>:<vni_max> local_ip = <ip> vxlan_group = 239.1.1.1 一组可用的 VNI 区间列表; 建立 VxLAN Tunnel 使用的 IP 地址 VXLAN 组播组enable_tunneling = true
tunnel_type = vxlan
integration_bridge = br-int
tunnel_bridge = br-tun
local_ip = 10.0.0.3
tunnel_types = vxlan
所有integration_bridge bridge_mappings = default:br-eth3 tunnel_bridge enable_tunneling = False指定intergration bridge 的名称,默认为 br-int; 指定物理网络label 和服务器上的 bridge 对应关系; 指定 turnnel bridge 的名称,默认为 br-tun 是否使用 tunneling 类型的网络,包括 GRE 和 VxLAN。使用的话,ML2 agent 会在每个计算和网络节点创建名称为 tunnel_bridge 的 tunnel bridge。

2.1.4 Provider network 和 Tenant network 的区别

(图6.来源:google)

几个区别:

Provider network 是由 Admin 用户创建的,而 Tenant network 是由 tenant 普通用户创建的。 Provider network 和物理网络的某段直接映射,比如对应某个 VLAN,因此需要预先在物理网络中做相应的配置。而 tenant network 是虚拟化的网络,Neutron 需要负责其路由等三层功能。 对 Flat 和 VLAN 类型的网络来说,只有 Provider network 才有意义。即使是这种类型的 tenant network,其本质上也是对应于一个实际的物理段。 对 GRE 和 VXLAN 类型的网络来说,只有 tenant network 才有意义,因为它本身不依赖于具体的物理网络,只是需要物理网络提供 IP 和 组播即可。 Provider network 根据 admin 用户输入的物理网络参数创建;而 tenant work 由 tenant 普通用户创建,Neutron 根据其网络配置来选择具体的配置,包括网络类型,物理网络和 segmentation_id。 创建 Provider network 时允许使用不在配置项范围内的 segmentation_id。

2.1.5 多网段 Provider network (multi-segment provider network)

默认情况下,用户只能创建单网段 provider network。这个 Blueprint 使得 Neutron 能够支持创建多网段网络。这种网络由相同或者不同网络类型的多个网段(network segments)组成一个广播域。一个 Port 只能在一个 segment 中分配。

一个实例:

s1@controller:~$ neutron net-create multinet --segments type=dict list=true provider:physical_network=physnet1,provider:segmentation_id=153,provider:network_type=vlan provider:physical_network='',provider:segmentation_id=801,provider:network_type=vxlan
Created a new network:
+-----------------+-------------------------------------------------------------------------------------------------------------+
| Field           | Value                                                                                                       |
+-----------------+-------------------------------------------------------------------------------------------------------------+
| admin_state_up  | True                                                                                                        |
| id                     | 206ae34c-7993-4128-b14d-196e084fbefe                                                                        |
| name                | multinet                                                                                                    |
| router:external  | False                                                                                                       |
| segments          | {'provider:network_type': 'vlan', 'provider:physical_network': 'physnet1', 'provider:segmentation_id': 153} |
|                         | {'provider:network_type': 'vxlan', 'provider:physical_network': null, 'provider:segmentation_id': 801}      |
| shared              | False                                                                                                       |
| status               | ACTIVE                                                                                                      |
| subnets             |                                                                                                             |
| tenant_id          | 74c8ada23a3449f888d9e19b76d13aab                                                                            |
+-----------------+-------------------------------------------------------------------------------------------------------------+

下图中的网络包括类型分别为 flat,gre 和 vlan 的三个网段:

(图7。来源 google)

2.2 子网 (subnet)

子网是一组 IPv4 或 IPv6 地址以及与其有关联的配置。它是一个地址池,OpenStack 可从中向虚拟机 (VM) 分配 IP 地址。每个子网指定为一个无类别域间路由 (Classless Inter-Domain Routing) 范围,必须与一个网络相关联。除了子网之外,租户还可以指定一个网关、一个域名系统 (DNS) 名称服务器列表,以及一组主机路由。这个子网上的 VM 实例随后会自动继承该配置。

在 OpenStack Kilo 版本之前,用户需要自己输入 CIDR。Kilo 版本中实现了这个 Blueprint,使得 Neutron 能够从用户指定的 CIDR Pool 中自动分配 CIDR。

2.3 端口 (Port)

一个 Port 代表虚拟网络交换机(logical network switch)上的一个虚机交换端口(virtual switch port)。虚机的网卡(VIF)会被连接到 port 上。当虚机的 VIF 连接到 Port 后,这个 vNIC 就会拥有 MAC 地址和 IP 地址。Port 的 IP 地址是从 subnet 中分配的。

2.4 虚机交换机 (Virtual switch)

Neutron 默认采用开源的 Open vSwitch 作为其虚机交换机。

2.5 虚拟路由器 (Virtual router)

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

2.6 各组件之间的关系

OpenStack 实际上并未增加网络功能。路由、交换和名称解析是由底层的网络基础架构处理的。OpenStack 的作用是将这些组件的管理捆绑在一起,并将它们连接到计算工作负载。

(图8.来源 google)

3. Neutron中的网络连通性

一个标准 OpenStack 环境中的物理网络配置如下:

(图9。来源:OpenStack 官网)

管理网络:提供 OpenStack 各个组件之间的内部通信。为安全考虑,该网络必须限制在数据中心之内。 数据网络:提供阶段节点之间,以及计算节点和网络节点之间的通信。同样这也是数据中心的内部网络。 外部网络:在某些部署环境中向虚机提供访问Internet的能力。外部网络可以访问该网络中的IP地址。 API 网络:提供所有 OpenStack API 的访问能力。该网络中的IP地址需要能够被Internent访问。 存储网络:该图上没有画出来,提供计算阶段和存储节点之间的 iSCSI 通信。    这些网络中,除了数据网络外,别的网络都相对简单,往往会直接使用数据中心中的物理网络,通常使用 VLAN 做网络隔离。现在讨论的只是数据网络。而 Neutron 中,数据网络的连通性包括几个层次:

同主机和不同主机上一个网段内的虚机之间的连接性:虚拟二层网络,走物理二层(VLAN)或者三层(GRE/VxLAN)网络。 不同网段内的虚机之间的连通性:经过物理(VLAN)或者 Neutron Virtual router 虚机和外部网络之间的连通性:经过物理路由器(给 VLAN 虚拟网络实用的物理交换机连接的路由器)或者 Neutron Virtual router为了支持这些网络连通性,Neutron 需要实现跨主机的二层网络和虚拟路由器。

3.1 虚拟二层网络的实现

3.1.1 使用 VLAN 实现虚拟二层网络

(图10.来源:google)

这种实现方式基于物理网络上的使用 VLAN 的交换机。后面有具体的文章来分析这种网络的实现。

3.1.2 基于 GRE/VxLAN 实现的二层网络

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

(图11.来源:google)

3.2 虚机路由器

跨子网的通信需要走虚拟路由器。同物理路由器一样,虚拟路由器拥有多个 virtual interface,分别连接需要连通的子网。具体会在后面的文章中分析。

(图12。来源:google)

 4. Neutron 数据网络的租户隔离性

Neutron 提供网络端到端的租户隔离。Neutron 给每一个网络(network)分配一个独立的 segmentation_id。以下图描述的 GRE 类型的网络为例:

(图13。图片来源。)

(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 进行隔离。具体以后的文章再分析。

5. Neutron 数据网络的安全性

除了租户的隔离性以外,

Neutron 还提供数据网络与外部网络的隔离性。默认情况下,所有虚机通往外网的流量全部走网络节点上的 L3 agent。在这里,内部的固定 IP 被转化为外部的浮动 IP 地址。 Neutron 还是用 Linux Tap 设备的 iptables 特性,实现其 Security Group 特性,保证访问虚机的安全性。具体以后的文章再分析。

6. Neutron 数据网络的扩展性

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

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

(图14.来源于 google)

(2)Neutron 为每个 provider/tenant network 分配一个唯一的 segmentation_id。该 ID 的数目是影响可扩展性的因素之一。

网络类型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 部署在网络节点上,这在大规模的云环境中可能会存在性能问题。这是 Blueprint。

Architecuture-1.png |Dvr-architecture.png

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

通过使用 DRV,L3 转发和 NAT 会被分布在计算节点上,这使得计算节点变成了网络节点,这样集中式的网络节点的负载就被分担了。

这个 Blueprint 实现了分布式的 DHCP Agent,这进一步释放了集中式网络节点的压力。

 7. Neutron REST API

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

 

来源:http://www.it165.net/admin/html/201507/6059.html

发表评论