Neutron-Linux-Bridge-Plugin
- Git 分支: https://github.com/openstack/neutron/tree/master/neutron/plugins/ml2/drivers/linuxbridge
- 创建: 2011年12月24日
更新:现在已合并。
Neutron L2 Linux 桥接插件
摘要
该提案旨在实现一个 Neutron(前身为 Quantum)L2 插件,该插件配置 Linux 桥接器以实现 neutron 的网络、端口和附件抽象。每个网络将映射到插件管理的独立 VLAN。将在每个主机上创建与 VLAN 对应的子接口,并创建一个 Linux 桥接器来控制该子接口。然后,该主机上该网络中的一个或多个 VIF(虚拟机接口)将插入该桥接器。在某种程度上,这项工作将实现创建基本 VLAN 插件的目标(如在 Essex Summit 上讨论的那样),适用于支持 Linux 桥接器的系统。
需求
支持 Linux 桥接(brctl 包)。
设计
插件管理 VLAN。实际的网络工件由在必须创建 Neutron 网络的每个主机上运行的代理(守护程序)创建。这种基于代理的方法类似于 OpenVSwitch 插件采用的方法。
下图解释了插件和代理在创建网络和端口以及将 VIF 插入 Neutron 端口时的工作方式。
- 租户请求创建 Neutron 网络和该网络上的端口。插件创建网络资源并为该网络分配 VLAN。然后,它创建端口资源并将其与该网络关联。
- 租户请求实例化 VM。Nova-compute 将调用 Linux-bridge VIF 驱动程序(此驱动程序与 Nova 附带的 Linux 桥接 VIF 驱动程序不同),这将创建一个 tap 设备。随后 nova-compute 将实例化 VM,以便 VM 的 VIF 与 tap 设备关联。
- 租户将请求将上述 VIF 插入之前创建的 Neutron 端口。插件将在 DB 中创建 VIF 和端口的关联。
- 网络中每个主机的代理守护程序将获取在步骤 3 中创建的关联。
- 如果该主机上存在与该 VIF 对应的 tap 设备,则代理将在此主机上创建 VLAN 和 Linux 桥接器(如果它们尚不存在)。
- 注意:遵循使用 UUID 的前 11 个字符来命名 tap 设备的约定。代理使用此约定从 VIF UUID 中解析 tap 设备的名称。
- 代理随后会将 tap 设备绑定到 Linux 桥接器。VM 现在位于 Neutron 网络上。
与 Nova 的集成
- 提供了一个 nova-compute VIF 驱动程序。此 VIF 驱动程序与 OpenVSwitch 插件使用的驱动程序非常相似。此 VIF 驱动程序需要位于每个计算节点上。
- 还需要 Linux 网络驱动程序(linux_net.py)扩展,以便能够插入网关。与 VIF 驱动程序一样,此驱动程序也为插入网关接口创建一个 tap 设备。此 linux 网络/网关驱动程序在网关 IP 方面进行了一些额外的处理,如下所述。此 linux 网络/网关驱动程序需要位于每个 nova-network 主机上。
处理网关接口
创建和初始化网关接口涉及一些复杂性。执行以下操作集以实现此目的
- 上述网关驱动程序首先创建一个 tap 设备,并将 Nova 提供的 MAC 地址与此设备关联。这发生在驱动程序的“plug”钩子中,并在 nova 的进程空间内执行。随后,一旦此 plug 方法退出,QuantumManager 将将网关 IP 地址与此 tap 设备关联。但是,由于没有 VM 插入此 tap 设备,因此此 tap 设备将不会响应此 IP。为了克服这个问题,我们立即在此 plug 方法中为该网络创建桥接器,并将相同的网关 IP 地址与该桥接器关联。桥接器现在将响应网关 IP。
- 注意:我们还将与网关 tap 设备相同的 MAC 地址与桥接器关联。虽然网关 tap 设备不直接响应网关 IP,但它是必需的,因为为了使桥接器正常工作,桥接器上的至少一个设备应具有相同的 MAC 地址。在这种情况下,网关 tap 设备满足此要求。
- QuantumManager(nova 中与 Neutron 接口的网络管理器)将之前创建的网关 tap 设备插入到网络上的端口。这导致网关 tap 设备接口 ID 与 Neutron 端口/网络之间的逻辑绑定(LinuxBridge 插件处理此操作)。此步骤在 Neutron 服务器的进程空间中执行。
- 在相关主机上运行的代理获取逻辑绑定以及网关 tap 设备的存在。它将网关 tap 设备绑定到相关的桥接器(请注意,在这种情况下,桥接器已经在 linux 网络/网关驱动程序中创建)。此步骤在代理的进程空间中执行。
- 网关初始化在 linux 网络驱动程序(linux_net.py)的“initialize_gateway”钩子中完成。这包括将 DHCP IP 地址与网关 tap 设备关联并发送网关 IP 的 gratuitous ARP 等操作。此步骤在 nova 的进程空间中执行。
(联系人:Sumit Naiksatam,Salvatore Orlando)
