第 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)供应商网络。当您有多个物理网络(如 physnet1、physnet2)和独立的物理接口(eth0 -> physnet1 和 eth1 -> 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 节点上。通过这一步所获得的接口和网桥将会和下图所示类似:
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-ex(in_port=2) 的数据包都带有一个 VLAN tag 5(dl_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. 入站网络数据的传输
本节介绍了从外部网络发出的入站数据到达实例接口的流程。
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-int 和 br-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-ex 和 ovs-ofctl dump-flows br-int,检查内部 VLAND ID 是否已从向外的数据包中删除,以及 VLAN ID 是否已被添加到向内的数据包中。当在特定 Compute 节点的这个网络上分配实例时,这个数据流会被创建。
-
如果在分配实例后没有创建这个数据流,请检查网络是否被创建为
flat,是否是external,以及physical_network名是否正确。另外,请检查bridge_mapping的设置。 -
最后,检查
ifcfg-br-ex和ifcfg-ethx的配置。确认ethX已作为br-ex内的端口被添加,它们在ip a中的输出中都带有UP标识。
例如,以下输出显示 eth1 是 br-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 节点。通过这一步所获得的接口和网桥将会和下图所示类似:
1. 如上所示,离开实例的 eth0 接口的数据会首先到达与实例相连接的 linux 网桥 qbr-xx。
2. qbr-xx 使用 qvb-xx <→ qvo-xxx 连接到 br-int。
3. qvb-xx 被连接到 linux 网桥 qbr-xx;qvo-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-int 和 br-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-ex 和 ovs-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-ex 和 ifcfg-ethx 的配置。确认 ethX 作为一个端口在 br-ex 内添加,并且它们在 ip a 命令输出中有 UP 标记。
例如,以下输出显示,eth1 是 br-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 地址会直接和实例内部相关联,从而使实例可以直接和外部网络进行交流。

Where did the comment section go?
Red Hat's documentation publication system recently went through an upgrade to enable speedier, more mobile-friendly content. We decided to re-evaluate our commenting platform to ensure that it meets your expectations and serves as an optimal feedback mechanism. During this redesign, we invite your input on providing feedback on Red Hat documentation via the discussion platform.