L3 Agent Extension Framework¶
RFE: https://bugs.launchpad.net/neutron/+bug/1580239
问题描述¶
Neutron 高级服务 (*aaS) 项目有时需要访问 L3 agent 内部的资源。例如,FWaaS 需要
将 router_id 映射到 router 信息的能力,以便我们可以为正确的命名空间编程 iptables。
加载 Service Agent 的能力 - 这样我们就在 L3Agent 的上下文中拥有一个 RPC 端点。
目前,接受的方法是继承:L3NATAgent 继承自高级服务。只有其类从 L3NATAgent 继承的扩展才能访问 agent 资源,例如 router 和命名空间数据。这有几个缺点
引入新的高级服务需要修改 agent 代码。
同样,在不更改 agent 代码的情况下,无法实现供应商特定的 agent 扩展。
无法同时运行多个 agent。
由于它是硬编码的,因此无法任意启用高级服务。
提议的变更¶
为了解决这些问题,我们将这些服务从 agent 中解耦,以便每个 *aaS 都是一个单独的扩展,它向扩展管理器注册并向扩展管理器提供其希望消耗的 RPC 消息列表以及处理这些 RPC 消息的处理程序函数。扩展管理器会将每种 RPC 消息类型注册到 neutron 的回调注册表中作为使用者,并使用现有的 RPC 回调生产者模式来监听感兴趣的事件的通知。当发生 RPC 回调时,将调用已注册处理该类型 RPC 消息的每个扩展的处理程序函数。多个 *aaS 服务将能够同时插入,而不会相互干扰。供应商特定的扩展可以编写为 agent 扩展驱动程序。
此提案将在 L3 agent 中创建以下新对象
L3AgentExtension - 此对象将定义 agent 扩展的稳定抽象接口。
L3AgentExtensionManager - 此对象将是一个 stevedore.named.NamedExtensionManager,这是扩展注册并与 agent 接口的方式。在运行时只会实例化一个 L3AgentExtensionManager;这是 stevedore 的 NamedExtensionManager 的固有限制,但使扩展管理器可推广以处理多种情况是良好的做法。
此机制将类似于为 L2 agent 在 http://git.openstack.org/cgit/openstack/neutron/tree/neutron/agent/l2/extensions/manager.py?id=4821196f94d333cb4c310601776f9b2319a6ddf0 中实现的扩展系统。在最大程度上,可推广的代码将被移动到公共位置,以便 L2 和 L3 agent 都可以重用它。
可比实现¶
此实现基于 L2 agent 中 QoS agent 扩展的实现以及 neutron 服务器上的配套 L2 通知驱动程序的实现。本节描述了与代码指针(stable/mitaka 分支)的交互。在 neutron-openvswitch-agent 的上下文中提供了 agent 特定的示例。
neutron-server 中的实现流程如下
QoSPlugin 类初始化 QosServiceNotificationDriverManager 类的一个实例,并在需要创建、更新或删除 QoSPolicy 对象时将其传递给它。 http://git.openstack.org/cgit/openstack/neutron/tree/neutron/services/qos/qos_plugin.py?id=4821196f94d333cb4c310601776f9b2319a6ddf0#n37
QosServiceNotificationDriverManager 类加载所有已配置的通知驱动程序的实例,然后调用 RpcQosServiceNotificationDriver 类中的适当方法来发送更新或删除事件。 http://git.openstack.org/cgit/openstack/neutron/tree/neutron/services/qos/notification_drivers/manager.py?id=4821196f94d333cb4c310601776f9b2319a6ddf0#n30
当 RpcQosServiceNotificationDriver 收到 QosPolicy 更新或删除事件时,驱动程序会将有问题的 QosPolicy 对象提交到 RPC 回调注册表(neutron.api.rpc.callbacks.producer.registry)。 http://git.openstack.org/cgit/openstack/neutron/tree/neutron/services/qos/notification_drivers/message_queue.py?id=4821196f94d333cb4c310601776f9b2319a6ddf0#n40
neutron-openvswitch-agent 实现流程如下
AgentExtensionsManager 类提供了一种初始化 agent 扩展的方法。 http://git.openstack.org/cgit/openstack/neutron/tree/neutron/agent/l2/extensions/manager.py?id=4821196f94d333cb4c310601776f9b2319a6ddf0#n37
AgentsExtensionManager 类在 neutron-openvswitch-agent 的主要类 OVSNeutronAgent 类中的 init_extension_manager 函数内部实例化。 http://git.openstack.org/cgit/openstack/neutron/tree/neutron/plugins/ml2/drivers/openvswitch/agent/ovs_neutron_agent.py?id=4821196f94d333cb4c310601776f9b2319a6ddf0#n397
QosAgentExtension 通过向 RPC 注册表提交回调方法来订阅 QoS 策略事件,从而成为 QoS 策略事件的感兴趣方。这是 agent 接收感兴趣事件通知的机制。 http://git.openstack.org/cgit/openstack/neutron/tree/neutron/agent/l2/extensions/qos.py?id=4821196f94d333cb4c310601776f9b2319a6ddf0#n203
QosAgentExtension 类处理传入的 QoSPolicy 对象。 http://git.openstack.org/cgit/openstack/neutron/tree/neutron/agent/l2/extensions/qos.py?id=4821196f94d333cb4c310601776f9b2319a6ddf0#n188
在 neutron-openvswitch-agent 内部,QosOVSAgentDriver 类实现针对 agent 可用资源的 QoS 操作。 http://git.openstack.org/cgit/openstack/neutron/tree/neutron/plugins/ml2/drivers/openvswitch/agent/extension_drivers/qos_driver.py?id=4821196f94d333cb4c310601776f9b2319a6ddf0#n26
QosOVSAgentDriver 和所有其他 agent 扩展驱动程序都是 QoS Agent Driver 元类的子类,该元类定义了 QoS Agent Driver 的稳定抽象接口。 http://git.openstack.org/cgit/openstack/neutron/tree/neutron/agent/l2/extensions/qos.py?id=4821196f94d333cb4c310601776f9b2319a6ddf0#n37
为了通知驱动程序传入的事件,QosAgentExtension 加载 QosAgentDriver http://git.openstack.org/cgit/openstack/neutron/tree/neutron/agent/l2/extensions/qos.py?id=4821196f94d333cb4c310601776f9b2319a6ddf0#n196 然后显式调用它 http://git.openstack.org/cgit/openstack/neutron/tree/neutron/agent/l2/extensions/qos.py?id=4821196f94d333cb4c310601776f9b2319a6ddf0#n255 http://git.openstack.org/cgit/openstack/neutron/tree/neutron/agent/l2/extensions/qos.py?id=4821196f94d333cb4c310601776f9b2319a6ddf0#n275 http://git.openstack.org/cgit/openstack/neutron/tree/neutron/agent/l2/extensions/qos.py?id=4821196f94d333cb4c310601776f9b2319a6ddf0#n282
将想法简化为使用和调整现有的 L2 实现来处理 L3 通信也被考虑过并被拒绝。QoS 通知机制需要保持特定于端口和网络更新,以免压垮消息队列。
数据模型影响¶
无
命令行客户端影响¶
无
安全影响¶
无
通知影响¶
本规范中提出的通知将覆盖某些现有的通知,但不应显着增加通知的数量。
性能影响¶
无
IPv6 影响¶
无
其他部署者影响¶
必须进行服务器端和 agent 端配置更改。例如,对于 FWaaS
在服务器端,在 neutron.conf 中,需要将“firewall”添加到 neutron.conf 中的 service_plugins 列表中,如前所述。 同样在 neutron.conf 中,必须指定 [fwaas] 部分中所需的 notification_drivers(message_queue 是默认值)。
在 L3 agent 端,必须将“firewall”添加到 l3_agent.ini 中的“extension_drivers”。
L3 agent 变体(例如 neutron-vpn-agent)可以是基本 l3 agent 的别名,但具有不同的默认扩展驱动程序集。
开发人员影响¶
此更改引入了在 L3 agent 之上开发高级服务的标准化接口,从而简化了新 L3 高级服务的采用并促进了开发人员的实验。
社区影响¶
此更改扩展了 neutron 中扩展钩子的稳定性和标准化,使平台更加友好于新技术和供应商。
实现¶
负责人¶
skandasw
german-eichberger
nate-johnston
emspiege
margaret-frances
y-furukawa-2
victor-r-howard
工作项¶
将扩展管理框架推广化,以便尽可能地在 L2 和 L3 agent 之间共享。
在 L3 agent 中实现新的扩展框架,利用上一步中实现的代码。
在 Neutron 服务器中实现通知驱动程序。
为 L3 agent 扩展框架添加单元和功能测试。
为 Neutron 服务器中的通知驱动程序添加单元和功能测试。
实现适当的 devstack 配置以启用扩展测试。
实现采用新的扩展机制所需的任何 gate 更改。
实现使用此扩展管理能力的一个扩展(FWaaS)。
将 L2 agent(ML2/OVS 和 ML2/LB)中的 QoS agent 扩展更改为也使用通用的扩展管理代码。
依赖项¶
API 测试¶
无。
功能测试¶
功能测试需要验证 L3AgentExtensionManager 是否正在加载 L3AgentExtension,以及测试通知驱动程序的通信。
Fullstack 测试¶
需要存在全栈测试,以启用加载虚拟扩展,然后确保虚拟扩展在由 Neutron 服务器发出时能够正确接收 RPC 调用。
文档影响¶
用户文档¶
描述使用 L3 agent 设施的服务(例如 _Admin Guide 的“Networking 简介”部分 <https://docs.openstack.org/admin-guide/networking_introduction.html>_)的现有用户文档需要更新。
开发人员文档¶
需要创建描述 L3 agent 扩展机制的新开发人员文档。
API 文档¶
需要创建文档来发现哪些扩展处于活动状态的方法。