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 中的实现流程如下

neutron-openvswitch-agent 实现流程如下

将想法简化为使用和调整现有的 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 文档

需要创建文档来发现哪些扩展处于活动状态的方法。

参考资料