第 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 DEVICEYPE=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
相关的信息,请参阅本指南中的配置网桥映射一章。
3. 检查网络数据流:
运行 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 DEVICEYPE=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 服务以使对网络的修改生效。
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 就会被添加到数据包的头数据中。
- 然后,数据包通过 br-int 上的 patch-peer int-br-ex <→ phy-br-ex 被移到 br-ex:
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 规则会为数据包添加内部 vlan tag 2(provider-171),以及 vlan tag 3(proivder-172)。
# 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
)并转发。
- 在 int-br-ex 上,因为内部 vlan tag 被添加到数据包中,qvo-xxx 会接受它,然后在删除 vlan tag 后把它转发到 qvb-xx,最后到达实例。
请注意,在这个例子中,neutron-openvswitch-agent 会自动在 compute 节点上使用 vlan 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 openvswitch agent 会添加数据流。如果在连接实例后没有创建数据流,请检查网络是否被创建为 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 routers 不能作为从实例到 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 地址会直接和实例内部相关联,从而使实例可以直接和外部网络进行交流。