跳转到: 导航, 搜索

Neutron/EmbraneNeutronPlugin

Embrane Neutron 插件

范围

当前的蓝图包括实现一个 Embrane Neutron 插件,该插件使用户能够将 Neutron 与 Embrane heleos 平台进行接口交互。

用例

选择采用 OpenStack 和 Neutron 进行云编排的云服务提供商也可以通过 Neutron 使用 Embrane heleos。 使用 Embrane Neutron 插件,用户可以使用现有插件实现任何级别的 L2 隔离,并通过 Embrane Elastic Services Manager (ESM) 创建的 Embrane 分布式虚拟设备 (DVA) 构建 L3 连通性,ESM 是 Embrane heleos 平台中使用的配置系统。ESM 可以快速为每个租户在虚拟化主机池内提供“核心路由器”。这些路由器可以通过 Neutron 本身或其自己的 REST API 进行配置。


实现

本节讨论插件实现,重点关注插件特定的功能和配置。插件文件列表如下:neutron/plugins/embrane/EmbraneInit.py neutron/plugins/embrane/__init__.py neutron/plugins/embrane/agent/__init__.py neutron/plugins/embrane/agent/dispatcher.py neutron/plugins/embrane/agent/operations/__init__.py neutron/plugins/embrane/agent/operations/routerOperations.py neutron/plugins/embrane/l2base/__init__.py neutron/plugins/embrane/l2base/openvswitch/__init__.py neutron/plugins/embrane/l2base/openvswitch/openvswitch_support.py neutron/plugins/embrane/l2base/support_base.py neutron/plugins/embrane/l2base/support_exceptions.py neutron/plugins/embrane/plugin.py 此外,还包括更多 Embrane 特定的包:neutron/plugins/embrane/api/* neutron/plugins/embrane/embranerest/*

支持的功能

该插件支持以下功能


使用现有插件实现 L2 连通性

Embrane 插件的主要目标是将 OpenStack(特别是 Neutron)与 Embrane heleos 接口连接,为云环境提供 L3-7 网络服务。 因此,Embrane heleos 插件利用在配置时选择的现有插件的 L2 连通性。Embrane heleos 插件和 L2 插件共享有关网络实现的信息,该信息用于实现 L3。因此,任何时候将请求发送到 Neutron 时,它都将根据需要定向到 Embrane heleos。为了实现这一点,使用了 2 种主要技术

插件继承

在 'neutron/plugins/embrane/plugins/*' 中,实际插件所在的位置,每个插件类(例如 EmbraneOvsPlugin)都是使用基础 Embrane 插件(neutron/plugins/embrane/plugin.py.EmbranePlugin)和特定的 L2 插件作为基础创建的。 只要一切操作正确完成,这将确保 L2 网络由现有的 L2 插件提供,而 L3 连通性将由 Embrane heleos 插件管理。有关如何创建特定 Embrane 插件的更多详细信息,请参见下文。

插件中插件

为了使之工作,这两个插件,Embrane heleos 插件和所选的 L2 插件,需要共享一些关于实际网络实现的信息。 目前,只有实现通过 VLAN 进行网络隔离的插件才能与 Embrane heleos 插件一起使用。将来将添加对不同 L2 隔离方法的支持。信息共享是通过插件中的插件来实现的,这意味着对于每个受支持的 L2 插件,必须在 'neutron/plugins/embrane/l2base/' 中创建一个新的包,并创建一个继承自 'neutron/plugins/embrane/l2base/support_base.py' 的类。这个抽象类仅定义一个简单的方法,必须由支持类实现才能满足合同。

从不同基础构建新的 Embrane 插件的说明

请参阅以下示例:neutron.plugins.embrane.plugins.embrane_fake_plugin.EmbraneFakePlugin neutron.plugins.embrane.plugins.embrane_ovs_plugin.EmbraneOvsPlugin 要为 Embrane heleos Neutron 插件构建新的 L2 支持,首先必须实现特定的 l2base。在以下位置创建一个新的包:neutron.plugins.embrane.l2base 并使用特定的插件技术命名它。创建一个 Python 模块和一个扩展 support_base.SupportBase 的类,实现其所有抽象方法。@abstractmethod def retrieve_utif_info(self, context, neutron_port=None, network=None): 可以在 'neutron/plugins/embrane/l2base/openvswitch/openvswitch_support.py' 中找到支持类的示例。 满足合同后(有关更多信息,请参阅示例和代码中的注释),在以下位置创建一个新模块:neutron.plugins.embrane.plugins 引用特定的插件技术(请参阅现有示例)在模块内部,定义一个如下构建的类:class EmbraneNewPlugin(base.EmbranePlugin, l2.NewL2Plugin)

   _plugin_support = support.NewPluginSupport
   def __init__(self):
       First run plugin specific initialization, then Embrane's.
       self.supported_extension_aliases += ["extraroute", "router"]

#如果需要

       l2.NewL2Plugin.__init__(self)
       self._run_embrane_config()

注意:基础顺序非常重要。EmbranePlugin 始终应该是构建的插件的第一个基础,以便可以正确解析 L3 请求(MRO)

注意:插件需要某些基础和扩展:• REQUIRED_EXTENSIONS = ["extraroute", "router"] • REQUIRED_BASES = (ExtraRoute_db_mixin,) 如果需要(例如,L2 插件本身不支持它们),请添加它们。

异步调用

为了避免长时间操作上的过度等待时间,对 Embrane heleos 插件的调用是异步执行的,并且每个路由器使用不同的线程。这意味着每个请求都将发送到调度器('neutron/plugins/embrane/agent/dispatcher.py'),该调度器将使用不同的线程为每个路由器提供服务。所有操作都将排队并按顺序执行,同时将特定资源的可用数据库信息返回给用户(Nova 风格)。此外,路由器状态属性用于告诉用户路由器是否正忙于某个操作

表 1. 状态值

姓名
ACTIVE
待创建
待更新
待删除
非活动
错误


因此,当模型发生更改时(例如通过 POST、PUT 或 DELETE),调用可能在实际在虚拟系统上执行操作之前返回,从而使路由器进入“PENDING_*”状态。 后续 GET 应该始终反映虚拟设备的当前状态。当路由器处于给定状态时,只能对其执行一部分操作。

配置

配置文件存储在 'etc/neutron/plugins/embrane/heleos_conf.ini' 中,本节解释了每个字段的含义(示例在配置类本身中提供)。

  • esm_mgmt:ESM 的管理地址,Embrane heleos 模块是单独安装的,它将实际在云环境中配置路由器;
  • admin_username:用于对 ESM api 进行身份验证的管理员用户名;
  • admin_password:用于对 ESM api 进行身份验证的管理员密码;
  • router_image:存储在 ESM 内部的路由器图像的 ID,将用于创建路由器;
  • *_id:可以从插件或产品本身指定的,一系列产品特定的资源。


etc/neutron/neutron.conf 示例

  • core_plugin = neutron.plugins.embrane.plugins.embrane_ovs_plugin.EmbraneOvsPlugin