第 2 章 OpenStack Networking 概念

OpenStack Networking 具有一系列系统服务用来管理关键服务(如路由、DHCP 和元数据),这些服务构成了网络节点这一概念。网络节点是分配给一个物理服务器的概念性角色。通常,网络节点角色会分配给一个物理服务器,这个服务器专门用于处理与实例相关的第 3 层网络流量。在 OpenStack Networking 中,您可以为多个物理服务器分配这个角色,从而可以在出现硬件故障时实现容错的功能。如需了解更多相关信息,请参阅第 3 层高可用性一章。

2.1. 安装 OpenStack Networking(neutron)

2.1.1. 安装方式

在 Red Hat OpenStack Platform 9(Mitaka)中,OpenStack Networking 组件作为 RHEL OpenStack director 实施的一部分被安装。请参阅 RHEL OpenStack director 安装指南来获取更多相关信息。

2.2. OpenStack Networking 示意图

这个示意图显示了一个 OpenStack Networking 实施示例,它带有一个专用的 OpenStack Networking 节点来提供 L3 路由和 DHCP 功能,并运行 FWaaSLBaaS 服务。另外,还有两个 Compute 节点运行 Open vSwitch(ovs-agent),每个上面有两个物理网卡,一个用来处理租户网络数据,一个用来管理网络连接。OpenStack Networking 节点还带有第 3 个网卡用来处理供应商网络流量:

example network

2.3. 安全组

安全组和相关规则根据网络数据的类型和传送方向过滤发送到特定 neutron 端口的网络流量,它在 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 为虚拟网络提供了网络数据交换服务,并支持业界标准的 NetFlowOpenFlowsFlow。Open vSwitch 同时也可以和使用第 2 层功能(STPLACP802.1Q VLAN tagging)的交换机进行集成。Open vSwitch 版本 1.11.0-1.el6 或更新版本支持 Open vSwitch 隧道(tunneling)功能。

注意

不要在 LACP 中使用基于 OVS 的绑定,因为这个配置会出现问题,而且不被支持。可以使用 bond_mode=balance-slb 作为替代来实现相关的功能。另外,您仍然可以使用带有 Linux 绑定的 LACP。

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
注意

如果使用 Red Hat OpenStack Platform director 进行部署,则这些设置会由 puppet 进行管理,而不应该被手工修改。

2.6. OpenStack 的网络后端

Red Hat OpenStack 提供了两个不同的网络后端:Nova networking 和 OpenStack Networking(neutron)。Nova networking 在 OpenStack 技术的发展规划中已过时,但当前仍然被提供;而 OpenStack Networking 被看作为一个 OpenStack 发展规划中的核心 SDN 组件,并在不断被开发完善。请注意,当前还没有在 Nova networking 和 OpenStack Networking 间进行迁移的方案,如果您计划先使用 Nova networking,然后再升级到 OpenStack Networking,这一点将会是一个非常重要的考虑因素。当前,如需在这两种技术间进行迁移,则需手工进行,并需要一定的停机时间。

注意

Nova networking 不能使用 Red Hat 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 OpenStack Platform 8 使用带有Open vSwitch(OVS)机制驱动的开源 ML2 内核插件。因为 OpenStack Networking 具有可插入式的构架,所以用户可以基于物理网络 fabric 和其它的网络要求,使用第三方的 OpenStack Networking 插件替代默认的 ML2/Open vSwitch 驱动配置。红帽一直不断致力于通过我们的合作伙伴计划为 Red Hat OpenStack Platform 认证更多的 OpenStack Networking 插件。如需了解更多与认证计划相关的信息,以及已认证的 OpenStack Networking 插件,请访问 http://marketplace.redhat.com
  • 如果需要 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-agentneutron-l3-agent)的节点。

2.9. 租户和供应商网络

下图展示了租户网络和供应商网络的类型,以及它们如何在整个 OpenStack Networking 拓扑中工作:

network types

2.9.1. 租户网络

租户网络(Tenant network)是用户创建的、用来在项目中提供连接功能的网络,它们在默认情况下被完全分离,并且不会和其它项目进行共享。OpenStack Networking 支持以下网络类型:

  • Flat(扁平化) - 所有实例都位于同一个网络中。这个网络可以被主机共享,并且没有 VLAN tagging 或其它网络分离功能。
  • VLAN(虚拟局域网) - OpenStack Networking 允许用户使用 VLAN ID (802.1Q tagged)在物理网络中创建多个供应商(provider)或租户(tenant)网络。这将使实例可以和环境中的其它实例进行通讯,并可以和位于同一个第 2 层 VLAN 中的专用服务器、防火墙、负载均衡设备以及其它网络基础设施进行通讯。
注意

您也可以为租户网络配置 QoS 策略。如需了解更多相关信息,请参阅 第 10 章 配置 QoS

2.9.2. VXLAN 和 GRE 隧道

VXLAN 和 GRE 使用网络覆盖(network overlay)来支持实例间的私人通讯。如果要进行到 GRE 或 VXLAN 租户网络外的网络通讯,则需要一个 OpenStack Networking 路由器。另外,如果需要连接到和外部网络(包括 Internet)直接连接的租户网络时,也需要一个路由器,路由器提供了使用浮动 IP 地址从一个外部网直接连接到实例的功能。

2.9.3. 供应商网络

供应商网络(Provider network)由 OpenStack 管理员创建,并直接映射到数据中心中存在的一个物理网络上。这个网络的网络类型包括 flat(untagged)和 VLAN(802.1Q tagged)。作为网络创建的一部分,供应商网络可以被租户共享。

2.9.3.1. 扁平化供应商网络

您可以使用扁平化(flat) 供应商网络直接把实例连接到外部网络。当有多个物理网络(例如,physnet1physnet2),而且有独立的物理接口(eth0 - > physnet1eth1 → physnet2),并需要把每个 Compute 节点和 Network 节点连接到它们的外部网络时使用这个网络类型。如果您需要使用在一个接口上的多个 vlan-tagged 接口连接到多个供应商网络,请参阅 第 7.2 节 “使用 VLAN 供应商网络”

2.9.3.2. 配置控制器节点

1. 编辑 /etc/neutron/plugin.ini(它是到 /etc/neutron/plugins/ml2/ml2_conf.ini 文件的 symbolic link),把 flat 添加到已存在的值列表中,把 flat_networks 设置为 *

type_drivers = vxlan,flat
flat_networks =*

2. 创建一个外部网络作为 flat 网络,并把它和配置的 physical_network 进行关联。如果把它作为一个共享网络创建(使用 --shared),将允许其它用户在其中直接创建实例。

neutron net-create public01 --provider:network_type flat --provider:physical_network physnet1 --router:external=True --shared

3. 使用 neutron subnet-create 或 Dashboard 创建一个子网。

# neutron subnet-create --name public_subnet --enable_dhcp=False --allocation_pool start=192.168.100.20,end=192.168.100.100 --gateway=192.168.100.1 public 192.168.100.0/24

4. 重启 neutron-server 服务以使所做的改变生效:

systemctl restart neutron-server
2.9.3.3. 配置 Network 节点和 Compute 节点:

在 network 节点和 compute 节点上进行这些操作。这将把节点连接到外部网络,并使实例可以直接和外部网络进行通讯。

1. 创建一个外部网桥(br-ex),并为它添加一个相关联的端口(eth1):

/etc/sysconfig/network-scripts/ifcfg-br-ex 中创建外部网桥:

DEVICE=br-ex
TYPE=OVSBridge
DEVICETYPE=ovs
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=none

/etc/sysconfig/network-scripts/ifcfg-eth1 中,把 eth1 配置为与 br-ex 相连:

DEVICE=eth1
TYPE=OVSPort
DEVICETYPE=ovs
OVS_BRIDGE=br-ex
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=none

重启节点或网络服务以使所做的修改生效。

2./etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini 中配置物理网络,把网桥映射到相关的物理网络:

bridge_mappings = physnet1:br-ex
注意

如需了解更多与网桥相关的信息,请参阅 第 11 章 配置网桥映射

3. 在 Network 节点和 Compute 节点上重启 neutron-openvswitch-agent 服务以使所做改变生效:

systemctl restart neutron-openvswitch-agent
2.9.3.4. 配置网络节点

1./etc/neutron/l3_agent.ini 文件中的 external_network_bridge = 设为空值。

以前,当只使用一个网桥连接到外部网络时,OpenStack Networking 会使用 external_network_bridge。现在,这个值可以是一个空字符串,这将允许多个外部网桥,OpenStack Networking 会为每个到 br-int 的网桥创建一个 patch。

# Name of bridge used for external network traffic. This should be set to
# empty value for the linux bridge
external_network_bridge =

2. 重启 neutron-l3-agent 以使所做的修改生效。

systemctl restart neutron-l3-agent
注意

如果有多个 flat 供应商网络,每个网络都需要有独立的物理网络接口和网桥来与外部网络连接。请正确配置 ifcfg-* 脚本,并在 bridge_mappings 中设置网络映射(使用一个由逗号分隔的网络列表)。如需了解更多与网络映射相关的信息,请参阅第 11 章 配置网桥映射

2.10. 第 2 层和第 3 层网络

在设计网络时,您需要考虑多数网络流量在哪里进行。因为在不同逻辑网络间传递数据需要经过路由器,所以在同一个网络中传递网络数据比在不同网络间传递数据的速度要快。

下图展示了在独立 VLAN 中的实例间进行网络数据传输的过程。

layers

注意

即使在这种配置中使用高性能的硬件路由器,仍然会造成额外的速度延迟。

2.10.1. 尽量使用网络交换

网络数据交换的操作发生在更低的网络层上(第 2 层),因此它的速度比在第 3 层上的数据路由要快很多。在设计网络时,您需要考虑把经常要进行通讯的系统放置到临近的位置。例如,下图展示了一个包括了两个物理节点的交换网络,这就使其中两个实例可以在不需要进行网络路由的情况下就可以直接进行通讯。您可以注意到,实例共享相同的子网,这代表它们在同一个逻辑网络中:

switching

为了使独立节点上的实例可以象在同一个逻辑网络中一样进行通讯,需要使用“隧道(tunnel)”技术,如 VXLAN 或 GRE。我们推荐您考虑调整端点上的 MTU 的设置,从而可以处理隧道头所包括的额外数据,否则网络性能可能会因为网络被分隔受到负面影响。另外,您还可以使用支持的、带有 VXLAN offload 功能的硬件来进一步提高 VXLAN 隧道的性能。如需了解这些硬件的完整列表,请参阅 https://access.redhat.com/articles/1390483