第 7 章 把一个实例连接到物理网络

本章介绍了如何使用供应商网络把实例直接连接到一个外部网络。

OpenStack Networking 拓扑概述:

OpenStack Networking(neutron)有两类服务分布在多个节点类型中。

  • Neutron API 服务器 - 这个服务运行 OpenStack Networking API 服务器,它为最终用户提供了 API,以及和 OpenStack Networking 进行通讯的服务。这个服务器还集成了底层的数据库来存储和获取租户网络、路由器、负载均衡设备以及其它信息。
  • Neutron agent(代理) - 为 OpenStack Networking 执行网络功能的服务:

    • neutron-dhcp-agent - 为租户私人网络管理 DHCP IP 地址。
    • neutron-l3-agent - 在租户私人网络、外部网络和其它系统间执行第 3 层路由。
    • neutron-lbaas-agent - 配置由租户创建的 LBaaS 路由器。
  • Compute(计算)节点 - 这个节点包括了运行虚拟机的虚拟机监控程序(hypervisor)。Compute 节点需要通过网线直接连接到网络以便为实例提供外部的网络连接。

服务的位置:

OpenStack Networking 服务可以在同一个物理服务器上运行,也可以分别在专用的服务器上运行(服务器的名称与它们所运行的服务相匹配):

  • 控制器节点(Controller node) - 运行 API 服务的服务器。
  • 网络节点(Network node) - 运行 OpenStack Networking agent 的服务器。
  • 计算节点(Compute node) - 运行实例的虚拟机监控程序服务器。

本章中介绍的步骤假设您的环境中已经部署了这 3 个节点类型。如果您的 Controller 节点和 Network 节点都运行在相同的物理节点上,针对于这两类节点的步骤都需要在这个服务器上执行。这同样适用于高可用性(HA)环境,在 HA 环境中,所有 3 个节点都可能运行 Controller 节点和 Network 节点以实现高可用性。因此,适用于 Contorller 节点和适用于 Network 节点的步骤都需要在这 3 个节点上运行。

7.1. 使用扁平化供应商网络

以下步骤创建可以把实例直接连接到外部网络的扁平化(flat)供应商网络。当您有多个物理网络(如 physnet1physnet2)和独立的物理接口(eth0 -> physnet1eth1 -> physnet2),并需要把每个 Compute 节点和 Network 节点连接到这些外部网络时,可以进行这个操作。

注意

如果您需要把同一个 NIC 中的多个 VLAN-tagged 接口连接到多个供应商网络,请参阅 VLAN 供应商网络

配置控制器节点:

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

type_drivers = vxlan,flat
flat_networks =*

2. 创建一个扁平化外部网络,并把它与配置的 physical_network 相关联。如果把它创建为一个共享网络,则允许其它用户把他们的实例直接连接到这个网络:

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

3. 使用 neutron subnet-create 或 OpenStack Dashboard 在这个外部网络中创建一个子网。

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

# systemctl restart neutron-server.service

配置网络节点和计算节点:

这些步骤需要在 Network 节点和 Compute 节点上进行。这些节点将会被连接到外部网络,并允许实例与外部网络直接进行通讯。

1. 创建 Open vSwitch 网桥和端口。这一步将创建一个外部网桥(br-ex)并添加相应的端口(eth1):

i. 编辑 /etc/sysconfig/network-scripts/ifcfg-eth1

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

ii. 编辑 /etc/sysconfig/network-scripts/ifcfg-br-ex

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

2. 重启 network 服务以使所做改变生效:

# systemctl restart network.service

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

注意

如需了解更多与配置 bridge_mappings 相关的信息,请参阅本指南中的配置网桥映射一章。

bridge_mappings = physnet1:br-ex

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

systemctl restart neutron-openvswitch-agent

配置 Network 节点:

1./etc/neutron/l3-agent.ini 文件中的 external_network_bridge = 设为空值。这将会使用外部供应商网络。

# 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.service
注意

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

把一个实例连接到外部网络:

在网络创建后,可以把它与一个实例进行相连来测试它是否可以正常工作:

1. 创建一个新实例。

2. 从 dashboard 的网络标签页中把新实例直接添加到新创建的外部网络中。

数据包传输是如何工作的?

本节介绍了在扁平化供应商网络被配置后,数据是如何传输到一个实例,以及数据如何从一个实例发送。

7.1.1. 出站网络数据的传输

数据包会离开实例并直接到达一个外部网络:一旦配置了 br-ex,添加物理接口,并把实例分配到一个 Compute 节点上。通过这一步所获得的接口和网桥将会和下图所示类似:

flat provider

1. 从实例的 eth0 接口发送的数据包会首先到达 linux 网桥 qbr-xx

2. 网桥 qbr-xx 通过 qvb-xx <-> qvo-xxx 连接到 br-int

3. 接口 qvb-xx 被连接到 qbr-xx linux 网桥,qvo-xx 被连接到 br-int Open vSwitch (OVS) 网桥。

在 Linux 网桥上配置 qbr-xx

qbr269d4d73-e7		8000.061943266ebb	no		qvb269d4d73-e7
							tap269d4d73-e7

br-int 上配置 qvo-xx

  Bridge br-int
        fail_mode: secure
            Interface "qvof63599ba-8f"
        Port "qvo269d4d73-e7"
            tag: 5
            Interface "qvo269d4d73-e7"

注意

端口 qvo-xx 以与扁平化供应商网络相关联的内部 VLAN tag 进行标记(tag)。在这个例子中,VLAN tag 是 5。一旦数据包到达了 qvo-xx,VLAN tag 会被添加到数据包头中。

然后,数据包会根据 int-br-ex <-> phy-br-ex 被移到 br-ex OVS 网桥。

br-int 上配置 patch-peer 的一个示例:

    Bridge br-int
        fail_mode: secure
       Port int-br-ex
            Interface int-br-ex
                type: patch
                options: {peer=phy-br-ex}

br-ex 上配置 patch-peer 的一个示例:

    Bridge br-ex
        Port phy-br-ex
            Interface phy-br-ex
                type: patch
                options: {peer=int-br-ex}
        Port br-ex
            Interface br-ex
                type: internal

当数据包到达 br-ex 中的 phy-br-ex 后,br-ex 内的 OVS 数据流会删除 VLAN tag(5),并转发到物理接口上。

在以下例子中,输出显示了 phy-br-ex 的端口号是 2

# ovs-ofctl show br-ex
OFPT_FEATURES_REPLY (xid=0x2): dpid:00003440b5c90dc6
n_tables:254, n_buffers:256
capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP
actions: OUTPUT SET_VLAN_VID SET_VLAN_PCP STRIP_VLAN SET_DL_SRC SET_DL_DST SET_NW_SRC SET_NW_DST SET_NW_TOS SET_TP_SRC SET_TP_DST ENQUEUE

 2(phy-br-ex): addr:ba:b5:7b:ae:5c:a2
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max

以下输出显示了,所有到达 phy-br-exin_port=2) 的数据包都带有一个 VLAN tag 5dl_vlan=5)。然后,VLAN tag 被删除,数据包被转发到(actions=strip_vlan,NORMAL)。

# ovs-ofctl dump-flows br-ex
NXST_FLOW reply (xid=0x4):
 cookie=0x0, duration=4703.491s, table=0, n_packets=3620, n_bytes=333744, idle_age=0, priority=1 actions=NORMAL
 cookie=0x0, duration=3890.038s, table=0, n_packets=13, n_bytes=1714, idle_age=3764, priority=4,in_port=2,dl_vlan=5 actions=strip_vlan,NORMAL
 cookie=0x0, duration=4702.644s, table=0, n_packets=10650, n_bytes=447632, idle_age=0, priority=2,in_port=2 actions=drop

然后,这个数据包被转发到物理接口。如果这个物理接口是一个不同的 vlan tagged 接口,接口会把它的 vlan tag 添加到数据包中。

7.1.2. 入站网络数据的传输

本节介绍了从外部网络发出的入站数据到达实例接口的流程。

flat provider

1. 入站网络数据首先到达物理节点的 eth1

2. 数据包被发送到 br-ex 网桥。

3. 数据包根据 phy-br-ex <--> int-br-ex 被移到 br-int

在下面的例子中,int-br-ex 使用端口 15。请参阅包括 15(int-br-ex) 的项:

ovs-ofctl show br-int
OFPT_FEATURES_REPLY (xid=0x2): dpid:00004e67212f644d
n_tables:254, n_buffers:256
capabilities: FLOW_STATS TABLE_STATS PORT_STATS QUEUE_STATS ARP_MATCH_IP
actions: OUTPUT SET_VLAN_VID SET_VLAN_PCP STRIP_VLAN SET_DL_SRC SET_DL_DST SET_NW_SRC SET_NW_DST SET_NW_TOS SET_TP_SRC SET_TP_DST ENQUEUE
 15(int-br-ex): addr:12:4e:44:a9:50:f4
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max

观察 br-int 上的网络流量

1. 当数据包到达 int-br-ex 后,br-int 网桥中的一个 OVS 流规则会把内部 VLAN tag 5 添加到数据包中。请参阅 actions=mod_vlan_vid:5 的项:

# ovs-ofctl dump-flows br-int
NXST_FLOW reply (xid=0x4):
 cookie=0x0, duration=5351.536s, table=0, n_packets=12118, n_bytes=510456, idle_age=0, priority=1 actions=NORMAL
 cookie=0x0, duration=4537.553s, table=0, n_packets=3489, n_bytes=321696, idle_age=0, priority=3,in_port=15,vlan_tci=0x0000 actions=mod_vlan_vid:5,NORMAL
 cookie=0x0, duration=5350.365s, table=0, n_packets=628, n_bytes=57892, idle_age=4538, priority=2,in_port=15 actions=drop
 cookie=0x0, duration=5351.432s, table=23, n_packets=0, n_bytes=0, idle_age=5351, priority=0 actions=drop

2. 第 2 个规则管理到达 int-br-ex (in_port=15) 上的不带有 VLAN tag (vlan_tci=0x0000) 的数据包:它把 VLAN tag 5 添加到数据包上(actions=mod_vlan_vid:5,NORMAL),然后把它转发到 qvo-xxx

3. qvo-xxx 接受数据包并在删除 VLAN tag 后把它转发到 qvb-xx

4. 数据包然后会到达实例。

注意

VLAN tag 5 是一个带有扁平化供应商网络的测试 Compute 节点的例子,neutron-openvswitch-agent 会自动分配这个值。它可能会和您自己的扁平化供应商网络的值不同,在两个独立 Compute 节点上的同一个网络的值也可能不同。

7.1.3. 故障排除

如果一个扁平化的供应商网络出现了问题,可以从上一节中所显示的输出中获取信息进行故障排除。以下介绍的步骤会进一步帮助您进行故障排除。

1. 检查 bridge_mappings

确认使用的物理网络名(例如 physnet1)和 bridge_mapping 配置的内容相匹配。例如:

# grep bridge_mapping /etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini
bridge_mappings = physnet1:br-ex

# neutron net-show provider-flat
...
| provider:physical_network | physnet1
...

2. 检查网络配置:

确认网络被创建为 external,类型是 flat

# neutron net-show provider-flat
...
| provider:network_type     | flat                                 |
| router:external           | True                                 |
...

3. 检查 patch-peer:

运行 ovs-vsctl show,确认 br-intbr-ex 通过使用 patch-peer int-br-ex <--> phy-br-ex 进行连接。

这个连接在 neutron-openvswitch-agent 服务重启时被创建,并需要 bridge_mapping/etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini 中被正确配置。如果没有被创建,请再次检查 bridge_mapping 的设置(即使已重启了服务)。

注意

如需了解更多与配置 bridge_mappings 相关的信息,请参阅本指南中的配置网桥映射一章。

4. 检查网络数据流:

运行 ovs-ofctl dump-flows br-exovs-ofctl dump-flows br-int,检查内部 VLAND ID 是否已从向外的数据包中删除,以及 VLAN ID 是否已被添加到向内的数据包中。当在特定 Compute 节点的这个网络上分配实例时,这个数据流会被创建。

  • 如果在分配实例后没有创建这个数据流,请检查网络是否被创建为 flat,是否是 external,以及 physical_network 名是否正确。另外,请检查 bridge_mapping 的设置。
  • 最后,检查 ifcfg-br-exifcfg-ethx 的配置。确认 ethX 已作为 br-ex 内的端口被添加,它们在 ip a 中的输出中都带有 UP 标识。

例如,以下输出显示 eth1br-ex 中的一个端口:

    Bridge br-ex
        Port phy-br-ex
            Interface phy-br-ex
                type: patch
                options: {peer=int-br-ex}
        Port "eth1"
            Interface "eth1"

以下例子显示,eth1 被配置为一个 OVS 端口,内核知道从接口上传输所有数据包,并把它们发送到 OVS 网桥 br-ex。这些可以在 master ovs-system 项中找到。

# ip a
5: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master ovs-system state UP qlen 1000

7.2. 使用 VLAN 供应商网络

这个过程会创建一个可以把实例直接连接到外部网络的 VLAN 供应商网络。如果您需要把一个独立 NIC 上的多个 VLAN-tagged 接口连接到多个供应商网络,则要执行这些操作。这个例子使用一个名为 physnet1 的网络,它具有一组 VLAN(171-172)。网络节点和计算节点使用名为 eth1 的物理接口连接到物理网络。连接这些接口的交换机网络被配置为对所需的 VLAN 进行端口汇聚(trunk)。
以下过程使用上面提供的 VLAN ID 和名称对 VLAN 供应商网络进行配置。

配置控制器节点:

1. 编辑 /etc/neutron/plugin.ini (到 /etc/neutron/plugins/ml2/ml2_conf.ini 文件的符合链接)文件来启用 vlan 机制驱动,把 vlan 添加到存在的值列表中。如:

[ml2]
type_drivers = vxlan,flat,vlan

2. 配置 network_vlan_ranges 的设置来反映使用的物理网络和 VLAN。例如:

[ml2_type_vlan]
network_vlan_ranges=physnet1:171:172

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

systemctl restart neutron-server

4. 创建外部网络作为 vlan 类型,并把它们与配置的 physical_network 相关联。把它创建为一个 --shared 网络来允许其它用户直接连接到实例。这个例子会创建两个网络:一个为 VLAN 171,另一个为 VLAN 172:

neutron net-create provider-vlan171 \
			--provider:network_type vlan \
			--router:external true \
			--provider:physical_network physnet1 \
			--provider:segmentation_id 171 --shared

neutron net-create provider-vlan172 \
			--provider:network_type vlan \
			--router:external true \
			--provider:physical_network physnet1 \
			--provider:segmentation_id 172 --shared

5. 使用 neutron subnet-create 或 dashboard 创建一组子网,并把它们配置为使用外部网络。您需要确保从网络管理员处获得的外部子网信息正确地与每个 VLAN 相关联。在这个例子中,VLAN 171 使用子网 10.65.217.0/24,VLAN 172 使用 10.65.218.0/24

neutron subnet-create \
			--name subnet-provider-171 provider-171 10.65.217.0/24 \
			--enable-dhcp \
			--gateway 10.65.217.254 \

neutron subnet-create \
			--name subnet-provider-172 provider-172 10.65.218.0/24 \
			--enable-dhcp \
			--gateway 10.65.218.254 \

配置 Network 节点和 Compute 节点:

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

1. 创建一个外部网桥(br-ex),并把它与端口(eth1)进行关联:

  • 在这个例子中,把 eth1 配置为使用 bre-ex
/etc/sysconfig/network-scripts/ifcfg-eth1

DEVICE=eth1
TYPE=OVSPort
DEVICETYPE=ovs
OVS_BRIDGE=br-ex
ONBOOT=yes
NM_CONTROLLED=no
BOOTPROTO=none
  • 以下例子被用来配置 br-ex 网桥:
/etc/sysconfig/network-scripts/ifcfg-br-ex:

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

2. 重启节点或重启 network 服务以使对网络的修改生效。例如:

# systemctl restart network

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

bridge_mappings = physnet1:br-ex
注意

如需了解更多与配置 bridge_mappings 相关的信息,请参阅本指南中的配置网桥映射一章。

4. 在网络节点和计算节点上重启 neutron-openvswitch-agent 服务以使所做的修改生效:

systemctl restart neutron-openvswitch-agent

配置 Network 节点:

1./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 =

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

systemctl restart neutron-l3-agent

3. 创建一个新实例,并使用 dashboard 中的网络标签页把新实例直接添加到新创建的外部网络中。

数据包传输是如何工作的?

本节介绍了在供应商网络被配置后,数据是如何传输到一个实例,以及数据如何从一个实例发送。

7.2.1. 出站网络数据的传输

本节介绍了数据包离开一个实例并直接到达一个 VLAN 供应商外部网络的流程。这个例子使用了两个附加到两个 VLAN 网络的实例(171 和 172)。在配置完 br-ex 后,为它添加一个物理网络,并把一个实例分配到一个 Compute 节点。通过这一步所获得的接口和网桥将会和下图所示类似:

vlan provider

1. 如上所示,离开实例的 eth0 接口的数据会首先到达与实例相连接的 linux 网桥 qbr-xx

2. qbr-xx 使用 qvb-xx <→ qvo-xxx 连接到 br-int

3. qvb-xx 被连接到 linux 网桥 qbr-xxqvo-xx 连接到 Open vSwitch 网桥 br-int

以下是 Linux 网桥上的 qbr-xx 配置。

因为有两个实例,所以需要两个 linux 网桥:

# brctl show
bridge name	bridge id		STP enabled	interfaces
qbr84878b78-63		8000.e6b3df9451e0	no		qvb84878b78-63
							tap84878b78-63

qbr86257b61-5d		8000.3a3c888eeae6	no		qvb86257b61-5d
							tap86257b61-5d

br-int 上的 qvo-xx 配置:

                options: {peer=phy-br-ex}
        Port "qvo86257b61-5d"
            tag: 3

            Interface "qvo86257b61-5d"
        Port "qvo84878b78-63"
            tag: 2
            Interface "qvo84878b78-63"

  • qvo-xx 使用与 VLAN 供应商网络相关联的内部 VLAN tag 进行标记(tag)。在这个例子中,内部 VLAN tag 2 与 VLAN 供应商网络 provider-171 相关联;VLAN tag 3 与 VLAN 供应商网络 provider-172 相关联。一旦数据包到达 qvo-xx,相关的 VLAN tag 就会被添加到数据包的头数据中。
  • 然后,数据包会使用 patch-peer int-br-ex <→ phy-br-ex 移到 br-ex OVS网桥。以下是 br-int 中的一个 patch-peer 示例:
    Bridge br-int
        fail_mode: secure
       Port int-br-ex
            Interface int-br-ex
                type: patch
                options: {peer=phy-br-ex}

br-ex 上配置 patch peer 的示例:

    Bridge br-ex
        Port phy-br-ex
            Interface phy-br-ex
                type: patch
                options: {peer=int-br-ex}
        Port br-ex
            Interface br-ex
                type: internal
  • 当这个数据包到达 br-ex 上的 phy-br-ex 时,br-ex 内的一个 ovs flow 会使用与 VLAN 供应商网络相关联的实际的 VLAN tag 替换内部 VLAN tag。

以下命令的输出显示了,phy-br-ex 端口号是 4

# ovs-ofctl show br-ex
 4(phy-br-ex): addr:32:e7:a1:6b:90:3e
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max

以下命令显示了到达 phy-br-ex(in_port=4)的数据包带有 vlan tag 2(dl_vlan=2)。Open vSwitch 会把这个 VLAN tag 替换为 171(actions=mod_vlan_vid:171,NORMAL)后转发数据包。 它还显示了到达 phy-br-ex(in_port=4)的数据包带有 vlan tag 3(dl_vlan=3)。Open vSwitch 会把这个 VLAN tag 替换为 172(actions=mod_vlan_vid:172,NORMAL)后转发数据包。这些规则由 neutron-openvswitch-agent 自动添加。

# ovs-ofctl dump-flows br-ex
NXST_FLOW reply (xid=0x4):
NXST_FLOW reply (xid=0x4):
 cookie=0x0, duration=6527.527s, table=0, n_packets=29211, n_bytes=2725576, idle_age=0, priority=1 actions=NORMAL
 cookie=0x0, duration=2939.172s, table=0, n_packets=117, n_bytes=8296, idle_age=58, priority=4,in_port=4,dl_vlan=3 actions=mod_vlan_vid:172,NORMAL
 cookie=0x0, duration=6111.389s, table=0, n_packets=145, n_bytes=9368, idle_age=98, priority=4,in_port=4,dl_vlan=2 actions=mod_vlan_vid:171,NORMAL
 cookie=0x0, duration=6526.675s, table=0, n_packets=82, n_bytes=6700, idle_age=2462, priority=2,in_port=4 actions=drop
  • 然后,这个数据包会被发送到物理接口 eth1
7.2.2. 入站网络数据的传输
  • 从外部网络发送到实例的数据包会首先到达 eth1,然后到达 br-ex
  • 从 br-ex 上,数据包通过 patch-peer phy-br-ex <-> int-br-ex 被移到 br-int。

以下命令显示了 int-br-ex 有一个端口号是 15:

# ovs-ofctl show br-int
 18(int-br-ex): addr:fe:b7:cb:03:c5:c1
     config:     0
     state:      0
     speed: 0 Mbps now, 0 Mbps max
  • 当数据包到达 int-br-ex 时,br-int 内的一个 OVS flow 规则会在数级包内为 provider-171 添加 VLAN tag 2,为 provider-172 添加 VLAN tag 3:
# ovs-ofctl dump-flows br-int
NXST_FLOW reply (xid=0x4):
 cookie=0x0, duration=6770.572s, table=0, n_packets=1239, n_bytes=127795, idle_age=106, priority=1 actions=NORMAL
 cookie=0x0, duration=3181.679s, table=0, n_packets=2605, n_bytes=246456, idle_age=0, priority=3,in_port=18,dl_vlan=172 actions=mod_vlan_vid:3,NORMAL
 cookie=0x0, duration=6353.898s, table=0, n_packets=5077, n_bytes=482582, idle_age=0, priority=3,in_port=18,dl_vlan=171 actions=mod_vlan_vid:2,NORMAL
 cookie=0x0, duration=6769.391s, table=0, n_packets=22301, n_bytes=2013101, idle_age=0, priority=2,in_port=18 actions=drop
 cookie=0x0, duration=6770.463s, table=23, n_packets=0, n_bytes=0, idle_age=6770, priority=0 actions=drop

第 2 个规则表示,一个带有 VLAN tag 172(dl_vlan=172)的数据包到达 int-br-ex(in_port=15),把 VLAN tag 替换为 3(actions=mod_vlan_vid:3,NORMAL)并转发。第 3 个规则表示,一个带有 VLAN tag 171(dl_vlan=171)的数据包到达 int-br-ex(in_port=15),把 VLAN tag 替换为 2(actions=mod_vlan_vid:2,NORMAL)并转发。

  • 当内部的 VLAN tag 被加入到数据包后,qvo-xxx 就可以接受它,并在删除 VLAN tag 后把数据包转发到 qvb-xx。最后,数据包就可以到达相关的实例。

请注意,在这个例子中,neutron-openvswitch-agent 会自动在 Compute 节点上使用 VLAND tag 2 和 3 来分别代表 VLAN 供应商网络 provider-171 和 provider-172。这可能和您实际的 VLAN 供应商网络不同,并且两个不同 Compute 节点上的值也可能不同。

7.2.3. 故障排除

在对一个 VLAN 供应商网络中的网络连接性进行故障排除时,可以参阅本节中介绍的与数据包流相关的内容。另外,请检查以下配置选项:

1. 确认使用的网络名是一致的。在这个例子中,physnet1 在创建网络和 bridge_mapping 配置中被一致使用:

# grep bridge_mapping /etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini
bridge_mappings = physnet1:br-ex

# neutron net-show provider-vlan171
...
| provider:physical_network | physnet1
...

2. 确认网络被创建为 external,类型是 vlan,并且使用了正确的 segmentation_id 值:

# neutron net-show provider-vlan171
...
| provider:network_type     | vlan                                 |
| provider:physical_network | physnet1                             |
| provider:segmentation_id  | 171                                  |
...

3. 运行 ovs-vsctl show,确认 br-intbr-ex 使用 patch-peer int-br-ex <→ phy-br-ex 进行了连接。
这个连接会在重启 neutron-openvswitch-agent 后被创建(需要在 /etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini 中正确配置了 bridge_mapping)。
如果在重启服务后没有创建这个连接,请再次检查 bridge_mapping 的设置。

4. 运行 ovs-ofctl dump-flows br-exovs-ofctl dump-flows br-int 来检查出站数据流,确认数据流把内部 VLAN ID 映射到外部 VLAN id(segmentation_id)。对于入站的数据包,把外部 VLAN ID 映射到内部 VLAN ID。
当第一次把实例连接到这个网络时,neutron OVS 代理会添加数据流。如果在连接实例后没有创建数据流,请检查网络是否被创建为 vlan,并且是 external,检查 physical_network 名称是否正确。另外,再次检查 bridge_mapping 的设置。

5. 最后,重新检查 ifcfg-br-exifcfg-ethx 的配置。确认 ethX 作为一个端口在 br-ex 内添加,并且它们在 ip a 命令输出中有 UP 标记。
例如,以下输出显示,eth1br-ex 中的一个端口。

    Bridge br-ex
        Port phy-br-ex
            Interface phy-br-ex
                type: patch
                options: {peer=int-br-ex}
        Port "eth1"
            Interface "eth1"

以下命令显示,eth1 作为一个端口被添加,内核知道把所有数据包从节点移到 OVS 网桥 br-ex。这些信息包括在 master ovs-system 项中。

# ip a
5: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master ovs-system state UP qlen 1000

7.3. 启用 Compute 元数据访问

使用这种方式连接的实例会直接附加到供应商外部网络,并带有作为默认网关的外部路由器,而不是使用 OpenStack Networking(neutron)路由器。这意味着,neutron 路由不能作为从实例到 nova-metadata 服务器的元数据请求的代理,这会在运行 cloud-init 时出现错误。但是,这个问题可以通过把 dhcp agent 配置为元数据请求代理来解决。您可以在 /etc/neutron/dhcp_agent.ini 中启用这个功能。例如:

enable_isolated_metadata = True

7.4. 浮动 IP 地址

请注意,相同的网络可以被用来为实例分配浮动 IP 地址,即使它们同时已被加入到私人网络中。从这个网络中分配的浮动 IP 会和 Network 节点上的 qrouter-xxx 命名空间相关联,并会执行 DNAT-SNAT 来关联私人 IP 地址。与之相反,被分配用来进行外部网络访问的 IP 地址会直接和实例内部相关联,从而使实例可以直接和外部网络进行交流。