LBaaS API 和对象模型改进

https://blueprints.launchpad.net/neutron/+spec/lbaas-api-and-objmodel-improvement

LBaaS 需要改进的 API 和对象模型,以便为提供 L7、TLS、HA 等高级用例的新 API 部分奠定基础。

此蓝图描述了应该对对象模型进行的更改,以便进一步设计和实现 L7 交换、TLS 和 HA 功能成为可能。暴露新实体的新的 API 将在单独的扩展中完成。

此蓝图并未描述 L7、TLS API 部分的设计,但可能会简要假设这些功能的可能设计的某些方面。它也未描述与此对象模型匹配的 API 的更改。

问题描述

所有 LB 供应商(包括硬件和软件)都支持的“高级”LB 配置可能包含一个 IP 地址上的多个服务终结点和多个池。这里,“服务终结点”是指 IP 地址 + 端口。

现有 API/对象模型的问题在于它仅考虑每个负载均衡器一个 VIP 和一个池。

现有 API 和对象模型最大的问题之一是池扮演着“根对象”的角色,这完全阻止了单个配置中的多个池。

提议的变更

为了使 LBaaS API 适合添加 TLS、L7 和 HA 功能,需要完成一些事情。

1. 这将完全是一个新的扩展和服务插件。LBaaS V1 代码不应受到影响,但可能存在例外情况。

2. 目前池对象是根对象(*),这在逻辑上不正确且令人困惑。从 API 的角度来看,这意味着创建池对象将不会是工作流程的起点。

  1. 成员对象将添加 subnet_id 作为可选属性。

4. VIP 对象将不再使用。它的属性将被添加到 LoadBalancer 对象和 Listener 对象。

5. LoadBalancer 对象成为 LBaaS 对象模型的根对象(*)。它将持有与 vip 相关的属性,并将是 1 个或多个 listener 的父对象。

6. 引入了额外的对象 Listener,它是前 VIP 参数的占位符,例如 protocol_port 和 protocol,请参阅下面的详细描述

LoadBalancer 和 Listener 的关系为 1:M。Listener 最初将仅是 LoadBalancer 的子对象,因此其生命周期限制在 LoadBalancer 内。当它具有子 Listener 时,将不允许删除 LoadBalancer。

将来,如果确定需要,此关系可能变为 M:N。M:N 更改将是一个附加更改,因此不会破坏合同,但是,此蓝图不会尝试这样做。

7. 为了防止由于并发请求导致数据库中的实体与后端不同步,如果实体处于瞬态状态(PENDING_CREATE、PENDING_UPDATE、PENDING_DELETE),则不允许任何操作。

  1. 池与健康监控器的关系将从 M:N 变为 1:1。

9. 健康监控器和成员的属性将几乎保持不变,除了对父对象的引用之外。

10. 将创建一个新的同步 haproxy 驱动程序,以便轻松测试 API 和数据库的更改。它不适用于生产用途。将代理 haproxy 驱动程序重构留给另一个蓝图。

11. 由于我们需要担心两种类型的状态,LoadBalancer 和 Listener 将同时具有 provisioning_status 和 operating_status 字段,而 Pool 和 Member 将具有 operating_status 字段。

12. operating_status 将是枚举类型(‘ONLINE’、‘OFFLINE’、‘DEGRADED’、‘ERROR’)

13. provisioning_status 将是枚举类型(‘ACTIVE’、‘PENDING_CREATE’、‘PENDING_UPDATE’、‘PENDING_DELETE’、‘ERROR’)

14. 对 LoadBalancer 的任何更新,包括对子实体进行更新和添加/删除,都将使 LoadBalancer 进入 PENDING_UPDATE provisioning_status。在操作完成之前,不允许对该 LoadBalancer 或其子对象进行任何其他更新。

(*) 根对象是代表“服务实例”的对象。它可以被部署/取消部署、打开/关闭,或者可以应用能力要求。它也是配置工作流程的起点。

备选方案

数据模型影响

LBaaS v1 表将保持不变,并将添加以下表用于 LBaaS v2 使用:* neutron.lbaas_loadbalancers * neutron.lbaas_listeners * neutron.lbaas_pools * neutron.lbaas_members * neutron.lbaas_healthmonitors * neutron.lbaas_sessionpersistences * neutron.lbaas_listener_statistics

  1. lbaas_loadbalancers

  • id - 唯一标识符

  • tenant_id

  • name

  • description

  • vip_port_id - 与 vip 绑定的 neutron 端口(可用于获取 vip_subnet 和 vip_address)。这将在数据库中存储,但不会通过 API 暴露。

  • vip_subnet_id - 应在 neutron 端口上创建的子网

  • vip_address - 子网的地址

  • provisioning_status

  • operating_status

  • admin_state_up

  • listeners - 子 listener id 的反向引用列表

  • provider - 应在此负载均衡器中配置的提供程序

  1. lbaas_listeners

  • id - 身份

  • tenant_id

  • loadbalancer_id

  • default_pool_id - 默认池的 ID。必须具有与 listener 兼容的协议。

  • protocol - 负载均衡器的协议:HTTP、HTTPS、TCP、UDP

  • protocol_port - 监听端口号

  • admin_state_up - 管理状态(True 或 False)

  • provisioning_status

  • operating_status

Listener 模型稍后将通过超出此蓝图范围的 L7 和 TLS 相关属性进行修改。

  1. lbaas_pools

  • id - 身份

  • tenant_id

  • name

  • description

  • protocol - 负载均衡协议

  • lb_method - 负载均衡方法

  • healthmonitor_id - 健康监控器的 id

  • admin_state_up - 管理状态(True/False)。该属性定义了在所有实际部署的后端上池的行政状态。

  • operating_status

  1. lbaas_members

  • id - 身份

  • tenant_id

  • address - ip 地址

  • pool_id - 所需的父池

  • subnet_id - 成员所在的可选子网

  • protocol_port

  • weight

  • operating_status

  • admin_state_up

  1. lbaas_healthmonitors

  • id - id

  • tenant_id

  • type - (TCP, HTTP)

  • delay

  • timeout

  • max_retries

  • http_method

  • url_path

  • expected_codes

  • admin_state_up

  1. lbaas_sessionpersistences

  • pool_id

  • type - (HTTP_COOKIE, SOURCE_IP, APP_COOKIE)

  • cookie_name

  1. lbaas_listener_statistics

  • listener_id

  • bytes_in

  • bytes_out

  • active_connections

  • total_connections

REST API 影响

将创建一个新的扩展,暴露以下资源

  • /lbaas/loadbalancers

  • /lbaas/listeners

  • /lbaas/pools

  • /lbaas/pools/{pool_id}/members

  • /lbaas/healthmonitors

资源属性

/lbaas/loadbalancers

CSVTable

属性名称

类型

访问

默认值

验证转换

描述

id

字符串 (UUID)

RO,全部

生成

N/A

identity

tenant_id

字符串 (UUID)

RW, all (No Update)

生成

string

tenant identity

name

string

RW,全部

‘’

string

Human-readable

description

string

RW,全部

‘’

string

Human-readable

vip_subnet_id

字符串 (UUID)

RW, all (No Update)

required

string

在此子网上创建 vip

vip_address

string (IP Address)

RW, all (No Update)

生成

IPv4 或 IPv6

前端 IP 地址

admin_state_up

bool

RW,全部

True

bool

enabled

provisioning_status

string

RO,全部

N/A

provisioning status

operating_status

string

RO,全部

N/A

operational status

删除负载均衡器仅在它不是任何 listener 的父对象时才会成功。

/lbaas/listeners

CSVTable

属性名称

类型

访问

默认值

验证转换

描述

id

字符串 (UUID)

RO,全部

生成

N/A

identity

tenant_id

字符串 (UUID)

RW,全部

生成

string

tenant identity

name

string

RW,全部

‘’

string

Human-readable

description

string

RW,全部

‘’

string

Human-readable

loadbalancer_id

字符串 (UUID)

RW, all (No Update)

required

string

父负载均衡器

connection_limit

integer

RW,全部

-1

integer

protocol 端口的最大连接数

protocol

string

RW, all (No Update)

required

‘TCP’、‘HTTP’、‘HTTPS’

监听协议

protocol_port

integer

RW,全部

required

0-65535

监听端口

admin_state_up

bool

RW,全部

True

bool

enabled

provisioning_status

string

RO,全部

N/A

provisioning status

operating_status

string

RO,全部

N/A

operational status

请注意,loadbalancer_id 目前是必需的。这不会阻止以后实现 M:N 负载均衡器到 listener,因为这只是一个 API 属性,因此可以从必需更改为可选。

请注意,default_pool_id 在此处未指定,因为池将定义其父 listener。

删除 Listener 仅在它不是池的父对象时才会成功。

/lbaas/pools

CSVTable

属性名称

类型

访问

默认值

验证转换

描述

id

字符串 (UUID)

RO,全部

生成

N/A

identity

tenant_id

字符串 (UUID)

RW,全部

生成

string

tenant identity

name

string

RW,全部

‘’

string

Human-readable

description

string

RW,全部

‘’

string

Human-readable

listener_id

字符串 (UUID)

RW, all (No Update)

required

string

父 listener

protocol

string

RW, all (No Update)

required

‘TCP’、‘HTTP’、‘HTTPS’

发送到成员的协议

lb_algorithm

string

RW,全部

required

‘ROUND_ROBIN’、‘LEAST_CONNECTIONS’、SOURCE_IP

负载均衡算法

session_persistence

dictionary

RW,全部

{}

type: ‘SOURCE_IP’、‘HTTP_COOKIE’、‘APP_COOKIE’、cookie_name: string

会话持久性定义

admin_state_up

bool

RW,全部

True

bool

enabled

operating_status

string

RO,全部

生成

N/A

operational status

members

list

RO,全部

生成

N/A

属于此池的成员列表

请注意,listener_id 目前是必需的。将验证 listener 是否只有一个池作为子对象。

这不应阻止以后实现 M:N listener 到池。

如果它是健康监控器的父对象,则删除池将不会成功。但是,如果它是任何子对象的父对象,则这些子对象将被删除。

/lbaas/pools/{pool_id}/members

CSVTable

属性名称

类型

访问

默认值

验证转换

描述

id

字符串 (UUID)

RO,全部

生成

N/A

identity

tenant_id

字符串 (UUID)

RW,全部

生成

string

tenant identity

address

string (IP)

RW, all (No Update)

required

IPv4 或 IPv6

成员正在监听的 IP 地址

protocol_port

integer

RW,全部

required

0-65535

成员正在监听的端口

weight

integer

RW,全部

1

integer

流量分配权重

subnet_id

字符串 (UUID)

RW, all (No Update)

string

访问成员端口的子网

admin_state_up

bool

RW,全部

True

bool

enabled

operating_status

string

RO,全部

生成

N/A

operational status

/lbaas/healthmonitors

CSVTable

属性名称

类型

访问

默认值

验证转换

描述

id

字符串 (UUID)

RO,全部

生成

N/A

identity

tenant_id

字符串 (UUID)

RW,全部

生成

string

tenant identity

type

string

RW, all (No Update)

required

‘HTTP’、‘HTTPS’、‘PING’、‘TCP’

健康检查类型

pool_id

字符串 (UUID)

RW, all (No Update)

required

string

要监控的池的 id

delay

integer

RW,全部

required

integer

健康检查前的秒数

timeout

integer

RW,全部

required

integer

失败检查的秒数

max_retries

integer

RW,全部

required

integer

在成员被认为 OFFLINE 之前失败检查的次数

http_method

string

RW,all

‘GET’

‘GET’、‘POST’、‘PUT’

发送 http 检查的 http 动词

url_path

string

RW,全部

‘/’

string

发送 http 检查的 url

expected_codes

string

RW,全部

‘200’

逗号分隔的 HTTP 响应代码

成功检查的预期 HTTP 响应代码

admin_state_up

bool

RW,全部

TRUE

bool

enabled

请注意,pool_id 是必需的属性。与池对象上的 listener_id 类似,这不会阻止以后实现 1:M 池到健康监控器的关系。

(*) 表示必需的属性

安全影响

标准的 Neutron tenant 对象所有权规则将适用。

通知影响

新通知:- loadbalancer - listener - pool - healthmonitor - member

其他最终用户影响

用户可以访问新的 lbaas 资源。CLI 命令将根据加载的扩展而略有不同。

性能影响

IPv6 影响

其他部署者影响

LBaaS V1 和 LBaaS V2 可以共存于代码库中,但不应同时运行。这必须在代码中强制执行。

此蓝图不会从 LBaaS V1 到 V2 进行迁移路径,但是另一个蓝图应该这样做,因为它将是一项复杂的工作。

开发人员影响

一个新的扩展、服务插件和驱动程序。

社区影响

此更改自 Juno 以来一直在审查中。 IRC 和邮件列表中进行了大量讨论。

实现

负责人

主要负责人

brandon-logan

工作项

  • 对象模型更改

  • 用于新 API 的新的负载均衡器扩展

  • 单元测试

依赖项

测试

Tempest 测试

https://review.openstack.org/#/c/106089/

功能测试

负载均衡器插件的功能测试。

API 测试

扩展添加的所有新资源都将具有正向和负向测试。

文档影响

用户文档

LBaaS V1 和 V2 之间的差异应记录在案。

开发人员文档

应该有一个新的 LBaaS V2 API 文档部分,记录扩展添加的新资源。

参考资料