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 的角度来看,这意味着创建池对象将不会是工作流程的起点。
成员对象将添加 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),则不允许任何操作。
池与健康监控器的关系将从 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 或其子对象进行任何其他更新。
(*) 根对象是代表“服务实例”的对象。它可以被部署/取消部署、打开/关闭,或者可以应用能力要求。它也是配置工作流程的起点。
备选方案¶
https://docs.google.com/a/mirantis.com/document/d/1mTfkkdnPAd4tWOMZAdwHEx7IuFZDULjG9bTmWyXe-zo/edit 该文档描述了使用“单次调用”方法的不同结构的 API。
https://etherpad.openstack.org/p/neutron-lbaas-api-proposals 其他对象模型的其他 API 的简要描述
http://lists.openstack.org/pipermail/openstack-dev/2014-November/051147.html Samuel Bercovici 解决共享对象状态问题的想法
数据模型影响¶
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
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 - 应在此负载均衡器中配置的提供程序
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 相关属性进行修改。
lbaas_pools
id - 身份
tenant_id
name
description
protocol - 负载均衡协议
lb_method - 负载均衡方法
healthmonitor_id - 健康监控器的 id
admin_state_up - 管理状态(True/False)。该属性定义了在所有实际部署的后端上池的行政状态。
operating_status
lbaas_members
id - 身份
tenant_id
address - ip 地址
pool_id - 所需的父池
subnet_id - 成员所在的可选子网
protocol_port
weight
operating_status
admin_state_up
lbaas_healthmonitors
id - id
tenant_id
type - (TCP, HTTP)
delay
timeout
max_retries
http_method
url_path
expected_codes
admin_state_up
lbaas_sessionpersistences
pool_id
type - (HTTP_COOKIE, SOURCE_IP, APP_COOKIE)
cookie_name
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
属性名称 |
类型 |
访问 |
默认值 |
验证转换 |
描述 |
|---|---|---|---|---|---|
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
属性名称 |
类型 |
访问 |
默认值 |
验证转换 |
描述 |
|---|---|---|---|---|---|
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
属性名称 |
类型 |
访问 |
默认值 |
验证转换 |
描述 |
|---|---|---|---|---|---|
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
属性名称 |
类型 |
访问 |
默认值 |
验证转换 |
描述 |
|---|---|---|---|---|---|
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
属性名称 |
类型 |
访问 |
默认值 |
验证转换 |
描述 |
|---|---|---|---|---|---|
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 测试¶
功能测试¶
负载均衡器插件的功能测试。
API 测试¶
扩展添加的所有新资源都将具有正向和负向测试。
文档影响¶
用户文档¶
LBaaS V1 和 V2 之间的差异应记录在案。
开发人员文档¶
应该有一个新的 LBaaS V2 API 文档部分,记录扩展添加的新资源。