第 2 章 OpenStack Networking 概念
OpenStack Networking 具有管理关键服务(如路由、DHCP 和元数据)的系统服务,这些服务一起构成了网络节点的概念。网络节点是分配给一个物理服务器的概念性角色。通常,网络节点角色会分配给一个物理服务器,这个服务器专门用于处理与实例相关的第 3 层网络流量。在 OpenStack Networking 中,您可以为多个物理服务器分配这个角色,从而可以在出现硬件故障时实现容错的功能。如需了解更多相关信息,请参阅第 3 层高可用性一章。
2.1. 安装 OpenStack Networking(neutron)
2.1.1. 安装方式
在 Red Hat Enterprise Linux OpenStack Platform 7(kilo)中,OpenStack Networking 组件作为 RHEL OpenStack director 实施的一部分被安装。请参阅 RHEL OpenStack director 安装指南来获取更多相关信息。
2.2. OpenStack Networking 示意图
这个示意图显示了一个 OpenStack Networking 实施示例,它带有一个专用的 OpenStack Networking 节点来提供 L3 路由和 DHCP 功能,并运行 FWaaS 和 LBaaS 服务。另外,还有两个 Compute 节点运行 Open vSwitch(ovs-agent),每个上面有两个物理网卡,一个用来处理租户网络数据,一个用来管理网络连接。OpenStack Networking 节点还带有第 3 个网卡用来处理供应商网络流量:

2.3. 安全组
安全组和相关规则根据网络数据的类型和传送方向过滤发送到特定网络端口的网络流量,它在 Compute 实例的防火墙规则之外提供了额外的安全层。安全组是带有一个或多个安全规则的容器项,它可以管理到多个 Compute 实例的网络流量。为浮动 IP 地址、OpenStack Networking LBaaS VIP、路由器接口和实例创建的端口都与一个安全组相关联。如果没有指定,端口会使用默认的安全组,它会拒绝所有入站的网络流量,而只允许出站的网络流量。如果需要,可以为默认的安全组添加额外的规则,或创建新的安全组。Open vSwitch、Linux Bridge、VMware NSX、NEC 和 Ryu 网络插件当前都支持安全组功能。
和 Compute 的安全组不同,OpenStack Networking 的安全组是基于一个端口的,而不是基于一个实例的。
2.4. Open vSwitch
Open vSwitch(OVS)是一个用来替代 Linux 软件网桥的 SDN 虚拟交换机。OVS 为虚拟网络提供了网络数据交换服务,并支持业界标准的 NetFlow、OpenFlow 和 sFlow。Open vSwitch 同时也可以和使用第 2 层功能(STP、LACP 和 802.1Q VLAN tagging)的交换机进行集成。Open vSwitch 版本 1.11.0-1.el6 或更新版本支持 Open vSwitch tunneling 功能。下表包括了对特定内核要求的信息:
功能 | 内核要求 |
---|---|
GRE Tunneling |
2.6.32-358.118.1.openstack.el6 或更新 |
VXLAN Tunneling |
2.6.32-358.123.4.openstack.el6 或更新 |
2.5. Modular Layer 2(ML2)
ML2 是从 OpenStack 的 Havana 发行版本开始提供的一个新的 OpenStack Networking 核心插件。ML2 取代了以前的单插件模式,而支持同时使用混合的网络技术。单独的 Open vSwitch 和 linuxbridge 插件已过时,并将不会包括在以后的发行版本中。它们的功能已在 ML2 中实现。
ML2 是默认的 OpenStack Networking 插件,Open vSwitch 被配置为默认的机制驱动。
2.5.1. 使用 ML2 的原因
在以前,OpenStack Networking 只能使用在部署时所选择的插件。例如,运行 Open vSwitch 插件的系统只能使用 Open vSwitch,而不能使用其它插件(如 linuxbridge)。这会在一个有多种要求的环境中造成相关的限制。
2.5.2. ML2 网络类型
多种网络段类型可以同时运行。另外,这些网络段还可以使用 ML2 对多网络端的支持功能进行相互的连接。端口会自动与相关的网络段相关联,而不需要把它们特定网络端绑定。根据使用的启动,ML2 支持以下网络端类型:* flat * GRE * local * VLAN * VXLAN
不同的类型驱动在 ml2_conf.ini 文件中的 ML2 项中指定:
[ml2] type_drivers = local,flat,vlan,gre,vxlan
2.5.3. ML2 机制
现在,插件以带有通用代码库的机制被重新实现。使用这个机制,可以重复使用通用的代码,从而简化了维护和测试代码的复杂性。
如需获得支持的机制驱动信息,请参阅 Release Notes。
不同的机制驱动在 ml2_conf.ini 文件中的 ML2 项中指定。例如:
[ml2] mechanism_drivers = openvswitch,linuxbridge,l2population
2.6. OpenStack 的网络后端
Red Hat Enterprise Linux OpenStack 提供了两个不同的网络后端:Nova networking 和 OpenStack Networking(neutron)。Nova networking 在 OpenStack 技术的发展规划中已过时,但当前仍然被提供;而 OpenStack Networking 被看作为一个 OpenStack 发展规划中的核心 SDN 组件,并在不断被开发完善。请注意,当前还没有在 Nova networking 和 OpenStack Networking 间进行迁移的方案,如果您计划先使用 Nova networking,然后再升级到 OpenStack Networking,这一点将会是一个非常重要的考虑因素。当前,如需在这两种技术间进行迁移,则需手工进行,并需要一定的停机时间。
Nova networking 不能使用 RHEL OpenStack Platform Director 部署。
2.6.1. 使用 OpenStack Networking(neutron)
- 如果您需要一个覆盖网络(overlay network)解决方案:OpenStack Networking 支持使用 GRE 或 VXLAN 隧道(tunneling)来对虚拟机的网络流量进行隔离。当使用 GRE 或 VXLAN 时,在网络 fabric 上不需要 VLAN 的配置,对物理网络的唯一要求就是在节点间提供 IP 连接。另外,在理论上,VXLAN 或 GRE 对 ID 数量的限制是一千六百万(16,000,000),这远远超过了 802.1q VLAN ID 的最大数量 - 4094。Nova networking 是基于 802.1q VLAN 实现网络隔离的,它不支持 GRE 或 VXLAN 隧道功能。
- 如果不同的租户需要使用相互重叠的 IP 地址:OpenStack Networking 使用 Linux 内核的网络命名空间,它允许不同的租户在同一个 Compute 节点上使用相同的子网范围(例如 192.168.1/24),而不会造成相互间的影响。相反的,Nova networking 只提供扁平化的网络拓扑结构,在为所有租户分配子网时必须十分小心。
- 如果您需要一个经过红帽认证的第三方 OpenStack Networking 插件:在默认情况下,Red Hat Enterprise OpenStack Platform 7 使用带有Open vSwitch(OVS)机制驱动的开源 ML2 内核插件。因为 OpenStack Networking 具有可插入式的构架,所以用户可以基于物理网络 fabric 和其它的网络要求,使用第三方的 OpenStack Networking 插件替代默认的 ML2/Open vSwitch 驱动配置。红帽一直不断致力于通过我们的合作伙伴计划为 Red Hat Enterprise OpenStack Platform 认证更多的 OpenStack Networking 插件。如需了解更多与认证计划相关的信息,以及已认证的 OpenStack Networking 插件,请访问 http://marketplace.redhat.com。
- 如果您需要 VPN-as-a-service(VPNaaS)、Firewall-as-a-service(FWaaS)或 Load-Balancing-as-a-service(LBaaS):只有 OpenStack Networking 提供这些服务,Nova networking 不提供这些服务。租户可以在不通过管理员的情况下,使用 dashboard 来管理这些服务。
2.6.2. 使用 Nova Networking
- 如果您需要扁平化(untagged)网络或 VLAN(802.1q tagged)网络:这涉及到对可扩展性的要求(在理论上,最大的 VLAN ID 数量是 4094,而物理交换机实际支持的数量可能远远少于这个数量),以及对管理和部署的要求。在物理网络上需要进行特定的配置来在节点间分配 VLAN。
- 如果不同的租户不需要相互重叠的 IP 地址:这通常只适用于小的、私用的环境。
- 如果您不需要 SDN 解决方案,或不需要和物理网络 fabric 进行交互。
- 如果您不需要自服务的 VPN、防火墙或负载均衡服务。
2.7. L2 Population
L2 Population 驱动支持使用广播、多播和单播方式在覆盖网络中进行扩展。在默认情况下,Open vSwitch GRE 和 VXLAN 会复制广播到包括那些没有运行目标网络的每个代理。这种设计导致了大量的网络和处理负载。而 L2 Population 驱动使用了另外一种设计观念,它为 ARP 解析以及 MAC 地址学习功能提供了一个部分的网状网络(mesh),网络数据会被打包作为目标单波只发送到相关的代理上。为了启用 L2 population,您需要把它添加到机制驱动列表中。另外,您还需要最少启用一个隧道(tunneling)驱动(GRE、VXLAN 或两个都启用)。在 ml2_conf.ini 文件中添加适当的配置:
[ml2] type_drivers = local,flat,vlan,gre,vxlan mechanism_drivers = openvswitch,linuxbridge,l2population
在 ovs_neutron_plugin.ini 文件中启用 L2 population。这需要在所有运行 L2 agent 的节点上都启用:
[agent] l2_population = True
2.8. OpenStack Networking 服务
OpenStack Networking 集成了多个组件来为您的环境提供网络功能:
2.8.1. L3 Agent
L3 agent 是 openstack-neutron 软件包的一部分,它的功能是作为一个虚拟的第 3 层路由器来处理网络流量,并为第 2 层网络提供网关服务。运行 L3 agent 节点的网络接口不能带有手工配置的、连接到一个外部网络的 IP 地址。它需要具有一组可以被 OpenStack Networking 使用的、来自于外部网络的 IP 地址,这些 IP 地址会分配给用来连接内部网络和外部网络的路由器。这组地址的规模需要足够大来为每个路由器分配 IP 地址,并可以分配相关的浮动 IP。
- DHCP Agent - OpenStack Networking DHCP agent 可以为在网络中运行的虚拟机分配 IP 地址。如果这个 agent 被启用,并在创建子网时运行,则 DHCP 功能会在子网中默认启用。
- Plug-in Agent - 许多网络插件都可以利用它们自己的 agent(包括 Open vSwitch 和 Linux Bridge)。针对于特定插件的 agent 会在每个管理网络流量的节点上运行,包括所有计算节点,以及运行专用 agent(neutron-dhcp-agent 和 neutron-l3-agent)的节点。
2.9. 租户和供应商网络
下图展示了租户网络和供应商网络的类型,以及它们如何在整个 OpenStack Networking 拓扑中工作:

2.9.1. 租户网络
租户网络(Tenant network)是用户创建的、用来在项目中提供连接功能的网络,它们在默认情况下被完全分离,并且不会和其它项目进行共享。OpenStack Networking 支持以下网络类型:
- Flat(扁平化) - 所有实例都位于同一个网络中。这个网络可以被主机共享,并且没有 VLAN tagging 或其它网络分离功能。
- Local(本地) - 主机位于本地 Compute 主机上,并和其它外部网络完全隔离。
- VLAN(虚拟局域网) - OpenStack Networking 允许用户使用 VLAN ID (802.1Q tagged)在物理网络中创建多个供应商(provider)或租户(tenant)网络。这将使实例可以和环境中的其它实例进行通讯,并可以和位于同一个第 2 层 VLAN 中的专用服务器、防火墙、负载均衡设备以及其它网络基础设施进行通讯。
2.9.2. VXLAN 和 GRE 隧道
VXLAN 和 GRE 使用网络覆盖(network overlay)来支持实例间的私人通讯。一个 OpenStack Networking 路由器需要启用到 GRE 或 VXLAN 租户网络外的网络通讯,一个路由器还需要连接到带有外部网络(包括 Internet)的直接连接的租户网络,路由器提供了使用浮动 IP 地址从一个外部网直接连接到实例的功能。
2.9.3. 供应商网络
供应商网络(Provider network)由 OpenStack 管理员创建,并直接映射到数据中心中存在的一个物理网络上。这个网络的网络类型包括 flat(untagged)和 VLAN(802.1Q tagged)。作为网络创建的一部分,供应商网络可以被租户共享。
2.9.3.1. 扁平化供应商网络
您可以使用扁平化(flat) 供应商网络直接把实例连接到外部网络。当有多个物理网络(例如,physnet1 和 physnet2),而且有独立的物理接口(eth0 - > physnet1 和 eth1
控制器节点
编辑 /etc/neutron/plugin.ini(到 /etc/neutron/plugins/ml2/ml2_conf.ini 的 symbolic link),把 flat 添加到当前的列表中,并把 flat_networks 设置为 *:
type_drivers = vxlan,flat flat_networks =*
创建一个外部网络作为 flat 网络,并把它和配置的 physical_network 进行关联。如果把它作为一个共享网络创建,将允许其它用户在其中直接创建实例。
neutron net-create public01 --provider:network_type flat --provider:physical_network physnet1 --router:external=True --shared
使用 neutron subnet-create 或 horizon dashboard 创建相关的子网。
重启 neutron-api 服务器。
systemctl restart neutron-server
Network 节点和 Compute 节点
这些步骤必须在 network 节点和 compute 节点上都进行。这将把节点连接到外部网络,以使实例可以直接和外部网络进行连接。
创建外部网桥(br-ex)并为它添加相关联的端口(eth1)。
/etc/sysconfig/network-scripts/ifcfg-eth1: DEVICE=eth1 TYPE=OVSPort DEVICEYPE=ovs OVS_BRIDGE=br-ex ONBOOT=yes NM_CONTROLLED=no BOOTPROTO=none /etc/sysconfig/network-scripts/ifcfg-br-ex:
DEVICE=br-ex TYPE=OVSBridge DEVICETYPE=ovs ONBOOT=yes NM_CONTROLLED=no BOOTPROTO=none
重启节点或网络服务以使所做的网络修改生效。
在 /etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini 中配置物理网络,并把网桥映射到物理网络:
bridge_mappings = physnet1:br-ex
在所有节点上重启 neutron-openvswitch-agent 服务以使所做的修改生效。
systemctl restart neutron-openvswitch-agent
只在网络节点上
把 /etc/neutron/l3_agent.ini 中的 external_network_bridge = 设置为空。使用外部供应商网络需要这个设置,而基于网桥的外部网络需要设置 external_network_bridge = br-ex:
# Name of bridge used for external network traffic. This should be set to # empty value for the linux bridge external_network_bridge =
重启 neutron-l3-agent 以使改变生效。
systemctl restart neutron-l3-agent
如果存在多个扁平化供应商网络,则每个网络都需要独立的物理接口和网桥来把它们连接到外部网络。请正确配置 ifcfg-* 脚本,在 bridge_mappings 中指定网络时,使用由逗号分隔的网络列表。 === 第 2 层和第 3 层网络
在设计网络时,您需要考虑多数网络流量在哪里进行。因为在不同逻辑网络间传递数据需要经过路由器,所以在同一个网络中传递网络数据比在不同网络间传递数据的速度要快。
下图展示了在独立 VLAN 中的实例间进行网络数据传输的过程。
即使在这种配置中使用高性能的硬件路由器,仍然会造成额外的速度延迟。
2.9.4. 尽量使用网络交换
网络数据交换的操作发生在更低的网络层上(第 2 层),因此它的速度比在第 3 层上的数据路由要快很多。在设计网络时,您需要考虑把经常要进行通讯的系统放置到临近的位置。例如,下图展示了一个包括了两个物理节点的交换网络,这就使其中两个实例可以在不需要进行网络路由的情况下就可以直接进行通讯。您可以注意到,实例共享相同的子网,这表述它们在同一个逻辑网络中:
为了使独立节点上的实例可以象在同一个逻辑网络中一样进行通讯,需要使用“隧道(tunnel)”技术,如 VXLAN 或 GRE。我们推荐您考虑调整端点上的 MTU 的设置,从而可以处理隧道头所包括的额外数据,否则网络性能可能会因为网络被分隔受到负面影响。另外,您还可以使用支持的、带有 VXLAN offload 功能的硬件来进一步提供 VXLAN tunneling 的性能。如需了解这些硬件的完整列表,请参阅 https://access.redhat.com/articles/1390483