跳转到: 导航, 搜索

Neutron/ServiceTypeFramework

本文档的目的是阐明和组织围绕所谓的“服务类型”的概念。它描述了实体和相应的流程。

服务类型框架的主要目的是
允许租户为请求的服务指定供应商(或服务提供商)
服务提供商是服务类型框架的主要实体。
此外,还可以基于服务提供商添加其他功能,例如服务产品、插入模式等。


服务类型框架的概念


1. 服务类型 (ServiceType)
服务的类型:负载均衡器、防火墙、VPN 等。
这在很大程度上是静态的字符串值集合,当前位于 neutron/plugins/common/constants.py 中。
这些字符串在分发 REST API 调用时用作插件字典中的键。

2. 服务提供商 (ServiceProvider)
这是指向实现特定服务的特定驱动程序的指针。
目前,其形式为 ServiceType:Name:Driver[:default],其中 Driver 是 neutron 加载的类标识。
Name 是人类可读的形式,用于向用户表示提供商。
Name 对于给定的 ServiceType 应该是唯一的,但可能在所有提供商中不唯一。
服务插件应使用一组服务类型提供商来加载插件驱动程序。ServiceProviders 在配置文件中以字符串列表(多行选项)的形式指定。

3. 提供商资源关联 (ProviderResourceAssociation)
将特定资源连接到提供商的实体。
关联由唯一的 resource_id 和 provider_name 组成。
假设 resource_id(uuid 类型)在整个数据库中是唯一的,因此不需要额外的 service_type 字段。

与服务的集成

为了将服务提供商配置与逻辑资源配置分离,使用了 ProviderResourceAssociation。

当管理员要从配置中删除服务提供商,或者租户决定更改现有资源的提供商时,需要进行特殊处理。在这种情况下,lbaas 应该使用一个提供商卸载资源,并使用另一个提供商部署它,或者在要删除提供商时直接卸载所有资源。
需要为每种服务提供额外的 API 调用。这是特定于服务的附加功能的主题。

管理员流程

管理员通常会将服务提供商添加到 quantum.conf 文件中。
这应该使服务插件加载指定的驱动程序,并允许租户列出服务提供商。
这些提供商选项应以多行形式指定,每个提供商一行,格式为

<service_type>:<name>:<driver>[:default] 

其中:- service_type 是标识服务的字符串,是允许的服务之一。在 Havana 中,将允许以下服务列表:LOADBALANCER、FIREWALL、VPN、ROUTER。
- name - 用户可见的提供商表示形式
- driver - 驱动程序标识。这可以是类路径,或其他标识(考虑使用 stevedore)
- default 选项。如果指定,该提供商将成为给定服务类型的默认提供商。

对于给定的服务类型,只能有一个默认提供商,驱动程序标识在所有提供商中应该是唯一的。
名称和服务类型也必须唯一。

quantum.conf 部分示例

[service_providers] 
service_provider=LOADBALANCER:reference:quantum.services.loadbalancer.plugin_drivers.haproxy.HaproxyOnHost:default
service_provider=LOADBALANCER:net_scaler:quantum.services.loadbalancer.plugin_drivers.netscaler.NetScDriver
service_provider=VPN:strong_swan:quantum.services.vpn.drivers.StrongSwan


为了从配置中删除提供商,管理员应该删除使用该提供商创建的所有资源,或者执行一个特殊步骤来卸载与要删除的提供商关联的所有资源。在重新启动 neutron 服务器之前需要这样做。

用户流程

为了请求特定的供应商(提供商),用户执行以下步骤
1. 从可用服务提供商列表中选择服务提供商名称。

neutron service-provider-list
| Service Type | Name | Default | ----------------------------------------------------- | LOADBALANCER | Haproxy | True | | LOADBALANCER | Netscaler | False |


2. 使用该提供商名称(实际上是驱动程序)创建资源。LBaaS 示例

lb-pool-create --provider Netscaler --lb-method ROUND_ROBIN ... ...

在用 Netscaler 提供商创建池之后,所有后续将其他对象与此池关联的命令都将通过 Netscaler 插件驱动程序进行处理。
如果未指定提供商,则将使用该服务类型的默认提供商,在给定的示例中 - Haproxy 插件驱动程序。(对于给定的服务类型只能指定单个默认值)。
某些服务类型可能没有默认提供商。在这种情况下,将引发异常。请注意,对 lbaas CLI/REST API 的此修改不在服务类型框架补丁的范围内。

REST 调用分发

目前考虑的模型是“一个服务插件 - 多个驱动程序”。

对于 REST 调用分发,将使用以下方法
仅为“创建根对象”(LBaaS 的 create_pool)指定 ServiceProvider 名称,这将添加提供商资源关联。
与现有根对象(池)相关的对象的任何 CRUD 调用都将分发到与根对象相同的驱动程序。因此,分发涉及在每次操作时从数据库中获取根对象。

示例(LBaaS)
Call dispatching workflow.png