Trunking¶
网络 Trunk 服务允许使用单个虚拟网络接口卡 (vNIC) 将多个网络连接到实例。可以通过将实例连接到单个端口来向实例呈现多个网络。
操作¶
网络 Trunk 由一个服务插件和一组管理不同二层机制驱动程序上的 Trunk 的驱动程序组成。用户可以创建一个端口,将其与 Trunk 关联,并在该端口上启动一个实例。用户可以动态地附加和分离额外的网络,而不会中断实例的运行。
每个 Trunk 都有一个父端口,并且可以有任意数量的子端口。父端口是 Trunk 关联的端口。用户创建实例并指定在附加到 Trunk 的实例启动时 Trunk 的父端口。
子端口呈现的网络是关联端口的网络。在创建子端口时,驱动程序可能需要一个 segmentation-id。 segmentation-id 定义了子端口网络在实例上呈现的分段 ID。某些驱动程序(如 OVS)可能需要 segmentation-type。目前支持以下 segmentation-type 值
vlan使用 VLAN 进行分段。inherit使用子端口连接的网络中的segmentation-type(如果未为子端口指定segmentation-type)。请注意,使用inherit类型需要启用provider扩展,并且仅当连接网络的segmentation-type为vlan时才有效。
注意
在 Networking API 中,segmentation-type 和 segmentation-id 参数是可选的。但是,从 Newton 版本开始,所有驱动程序在将子端口添加到 Trunk 时都需要提供这两个参数。未来的驱动程序可能不需要此要求。
用户在子端口上指定的 segmentation-type 和 segmentation-id 故意与网络的 segmentation-type 和 ID 分开。例如,可以将 Networking 服务配置为 tenant_network_types = vxlan,同时仍然创建具有 segmentation_type = vlan 的子端口。Networking 服务会根据需要执行重新映射。
示例配置¶
ML2 插件使用以下机制驱动程序支持 Trunking
Open vSwitch (OVS)
Open Virtual Network (OVN)
当使用 segmentation-type 为 vlan 时,OVS 驱动程序将父端口的网络呈现为未标记的 VLAN,并将所有子端口呈现为标记的 VLAN。
控制器节点¶
在
neutron.conf文件中,启用 Trunk 服务插件[DEFAULT] service_plugins = trunk
验证服务操作¶
获取管理项目凭据并列出启用的扩展。
使用命令 openstack extension list --network 验证是否启用了
Trunk Extension和Trunk port details扩展。
工作流程¶
总的来说,在 Trunk 上启动实例的基本步骤如下
创建用于 Trunk 和子端口的网络和子网
创建 Trunk
将子端口添加到 Trunk
在 Trunk 上启动实例
创建用于 Trunk 和子端口的网络和子网¶
为将添加到 Trunk 的 Trunk 和子端口创建适当的网络。在这些网络上创建子网,以确保通过 Trunk 实现所需的第三层连接性。
创建 Trunk¶
为 Trunk 创建父端口。
$ openstack port create --network project-net-A trunk-parent +-------------------+-------------------------------------------------------------------------+ | Field | Value | +-------------------+-------------------------------------------------------------------------+ | admin_state_up | UP | | binding_vif_type | unbound | | binding_vnic_type | normal | | fixed_ips | ip_address='192.0.2.7',subnet_id='8b957198-d3cf-4953-8449-ad4e4dd712cc' | | id | 73fb9d54-43a7-4bb1-a8dc-569e0e0a0a38 | | mac_address | fa:16:3e:dd:c4:d1 | | name | trunk-parent | | network_id | 1b47d3e7-cda5-48e4-b0c8-d20bd7e35f55 | | revision_number | 1 | | tags | [] | +-------------------+-------------------------------------------------------------------------+
使用
--parent-port创建 Trunk,以引用上一步中的端口$ openstack network trunk create --parent-port trunk-parent trunk1 +-----------------+--------------------------------------+ | Field | Value | +-----------------+--------------------------------------+ | admin_state_up | UP | | id | fdf02fcb-1844-45f1-9d9b-e4c2f522c164 | | name | trunk1 | | port_id | 73fb9d54-43a7-4bb1-a8dc-569e0e0a0a38 | | revision_number | 1 | | sub_ports | | +-----------------+--------------------------------------+
将子端口添加到 Trunk¶
可以将子端口以两种方式添加到 Trunk:在创建 Trunk 时创建子端口,或将子端口添加到现有 Trunk。
创建带有子端口的 Trunk
此方法涉及在 Trunk 创建时指定子端口创建 Trunk。
$ openstack port create --network project-net-A trunk-parent +-------------------+-------------------------------------------------------------------------+ | Field | Value | +-------------------+-------------------------------------------------------------------------+ | admin_state_up | UP | | binding_vif_type | unbound | | binding_vnic_type | normal | | fixed_ips | ip_address='192.0.2.7',subnet_id='8b957198-d3cf-4953-8449-ad4e4dd712cc' | | id | 73fb9d54-43a7-4bb1-a8dc-569e0e0a0a38 | | mac_address | fa:16:3e:dd:c4:d1 | | name | trunk-parent | | network_id | 1b47d3e7-cda5-48e4-b0c8-d20bd7e35f55 | | revision_number | 1 | | tags | [] | +-------------------+-------------------------------------------------------------------------+ $ openstack port create --network trunked-net subport1 +-------------------+----------------------------------------------------------------------------+ | Field | Value | +-------------------+----------------------------------------------------------------------------+ | admin_state_up | UP | | binding_vif_type | unbound | | binding_vnic_type | normal | | fixed_ips | ip_address='198.51.100.8',subnet_id='2a860e2c-922b-437b-a149-b269a8c9b120' | | id | 91f9dde8-80a4-4506-b5da-c287feb8f5d8 | | mac_address | fa:16:3e:ba:f0:4d | | name | subport1 | | network_id | aef78ec5-16e3-4445-b82d-b2b98c6a86d9 | | revision_number | 1 | | tags | [] | +-------------------+----------------------------------------------------------------------------+ $ openstack network trunk create \ --parent-port trunk-parent \ --subport port=subport1,segmentation-type=vlan,segmentation-id=100 \ trunk1 +----------------+-------------------------------------------------------------------------------------------------+ | Field | Value | +----------------+-------------------------------------------------------------------------------------------------+ | admin_state_up | UP | | id | 61d8e620-fe3a-4d8f-b9e6-e1b0dea6d9e3 | | name | trunk1 | | port_id | 73fb9d54-43a7-4bb1-a8dc-569e0e0a0a38 | | revision_number| 1 | | sub_ports | port_id='73fb9d54-43a7-4bb1-a8dc-569e0e0a0a38', segmentation_id='100', segmentation_type='vlan' | | tags | [] | +----------------+-------------------------------------------------------------------------------------------------+
将子端口添加到现有 Trunk
此方法涉及创建 Trunk,然后在创建 Trunk 后将子端口添加到 Trunk。
$ openstack network trunk set --subport \ port=subport1,segmentation-type=vlan,segmentation-id=100 \ trunk1
注意
该命令不提供任何输出。
$ openstack network trunk show trunk1 +----------------+-------------------------------------------------------------------------------------------------+ | Field | Value | +----------------+-------------------------------------------------------------------------------------------------+ | admin_state_up | UP | | id | 61d8e620-fe3a-4d8f-b9e6-e1b0dea6d9e3 | | name | trunk1 | | port_id | 73fb9d54-43a7-4bb1-a8dc-569e0e0a0a38 | | revision_number| 1 | | sub_ports | port_id='73fb9d54-43a7-4bb1-a8dc-569e0e0a0a38', segmentation_id='100', segmentation_type='vlan' | | tags | [] | +----------------+-------------------------------------------------------------------------------------------------+
在使用 OVN 驱动程序时,可以使用以下命令获取其他逻辑交换机端口信息
$ ovn-nbctl lsp-get-parent 61d8e620-fe3a-4d8f-b9e6-e1b0dea6d9e3 73fb9d54-43a7-4bb1-a8dc-569e0e0a0a38 $ ovn-nbctl lsp-get-tag 61d8e620-fe3a-4d8f-b9e6-e1b0dea6d9e3
在 Trunk 上启动实例¶
显示 Trunk 详细信息以获取 Trunk 的
port_id。$ openstack network trunk show trunk1 +----------------+--------------------------------------+ | Field | Value | +----------------+--------------------------------------+ | admin_state_up | UP | | id | 61d8e620-fe3a-4d8f-b9e6-e1b0dea6d9e3 | | name | trunk | | port_id | 73fb9d54-43a7-4bb1-a8dc-569e0e0a0a38 | | revision_number| 1 | | sub_ports | | | tags | [] | +----------------+--------------------------------------+
通过使用 Trunk 详细信息中
port_id的值指定port-id来启动实例。不支持在子端口上启动实例。
在实例内部使用 Trunk 和子端口¶
配置实例以使用子端口时,请确保实例上的接口设置为使用 Networking 服务分配给端口的 MAC 地址。实例不会意识到在实例处于活动状态后对 Trunk 所做的更改。例如,当将具有 segmentation-type 为 vlan 的子端口添加到 Trunk 时,任何允许实例在实例操作系统上发送和接收新 VLAN 流量的具体操作都必须在 Networking 服务之外处理。
在创建子端口时,可以将 Trunk 父端口的 MAC 地址设置为子端口。这将允许在启动在 Trunk 上的实例时配置 VLAN 子接口,而无需显式设置 MAC 地址。虽然可以使用唯一的 MAC 地址来配置子端口,但这可能会导致 ARP 欺骗保护和本机 OVS 防火墙驱动程序出现问题。如果使用本机 OVS 防火墙驱动程序,建议在所有子端口上重新使用父端口的 MAC 地址。
Trunk 状态¶
ACTIVE当逻辑和物理资源都已创建时,Trunk 为
ACTIVE。这意味着 Networking 和 Compute 服务中的所有操作都已完成,并且 Trunk 已准备好使用。DOWN当首次创建 Trunk 而未在 Trunk 上启动实例,或者与 Trunk 关联的实例已被删除时,Trunk 为
DOWN。DEGRADED当在配置过程中遇到临时故障时,Trunk 可能会处于
DEGRADED状态。这包括子端口添加或删除操作失败的情况。处于降级状态时,Trunk 仍然可用,并且一些子端口也可能可用。可以重试导致 Trunk 进入DEGRADED状态的操作,以修复临时故障并将 Trunk 移动到ACTIVE状态。ERROR如果请求导致冲突或无法通过重试请求修复的错误,则 Trunk 处于
ERROR状态。如果网络与 Trunk 配置不兼容或绑定过程导致持久性故障,则可能会遇到ERROR状态。当 Trunk 处于ERROR状态时,必须将其带到一个合理的状态(ACTIVE),否则将拒绝添加子端口的请求。BUILD在与 Trunk 关联的资源正在配置过程中时,Trunk 处于
BUILD状态。一旦 Trunk 和所有子端口都已成功配置,Trunk 将过渡到ACTIVE。如果发生部分故障,Trunk 将过渡到DEGRADED。当
admin_state设置为DOWN时,用户将被阻止对 Trunk 执行操作。admin_state由用户设置,不应用于监视 Trunk 的运行状况。
限制和问题¶
在
neutron-ovs-agent中,iptables_hybrid防火墙驱动程序和 Trunk 端口彼此不兼容。iptables_hybrid防火墙不会过滤子端口的流量。而是使用其他防火墙驱动程序,如openvswitch。有关更多信息,请参阅 bugs。