LBaaS 第 7 层规则¶
Launchpad蓝图
https://blueprints.launchpad.net/neutron/+spec/lbaas-l7-rules
第 7 层交换源于 OSI 模型,表示设备基于第 7 层(应用层)数据来交换请求。第 7 层交换也称为“请求交换”、“应用交换”和“基于内容的路由”。第 7 层交换器向外部世界呈现一个“虚拟服务器”,该服务器代表多个服务器接受请求,并根据使用应用数据确定哪个服务器应该服务哪个请求的策略来分发这些请求。这允许针对特定类型的内容专门调整/优化应用基础设施。例如,一个服务器可以调整为仅提供图像,另一个用于执行服务器端脚本语言,如 PHP 和 ASP,而另一个用于静态内容,如 HTML、CSS 和 JavaScript。
问题描述¶
用例
将流量重定向到支持静态内容(HTML、CSS)的池
将流量重定向到提供图像(jpg、png 等)的池
提议的变更¶
扩展 LBaaS API 并支持第 7 层交换。
- 第 7 层实体
L7Rule - 一组属性,定义应匹配请求的哪个部分以及如何匹配。
L7Policy - L7Rule 的集合。保存当规则匹配时应执行的操作(重定向到池、重定向到 URL、拒绝)。L7Policy 包含 Listener ID,因此 Listener 可以评估 L7Policy 的集合。当属于此 L7Policy 的所有 L7Rule 都匹配时,L7Policy 将返回“true”。在特定 Listener 下的 L7Policy 按顺序排列,并且第一个返回匹配的 l7Policy 将被执行。当没有策略匹配请求时,请求将转发到 listener.default_pool_id
数据模型影响¶
模型
+--------------------+ +--------------------+
| Listener | | L7Policy |
+--------------------+ +--------------------+
| | | |
| id | | id |
| other attributes +--------+ action |
| | | pool id |
| | | redirect url |
| | | listener id |
+--------------------+ | index |
| |
| |
+-----------------+--+
|
|
+------------------+--+
| L7Rule |
+---------------------+
| |
| id |
| l7 policy id |
| type |
| compare type |
| key |
| value |
| |
+---------------------+
引入两个新实体:L7Rule 和 L7Policy。L7Policy 是 L7Rule 的容器。L7Policy 包含对 Listener 的引用
L7Rule 对象数据模型。
字段
类型
是否为空
键
默认值
id
string(36)
NO
主键
l7_policy_id
string(36)
NO
FK
type
Enum (*)
NO
compare_type
Enum (*)
NO
键
string(36)
NO
value
string(36)
YES
类型值
Hostname
Path
- FileType:这是文件扩展名。示例:txt、jpg、png、xls
查找文本文件的规则如下:type = FileType,compare_type=EqualTo,value = txt
Header
- Cookie:这是特定 cookie 的值
查找名为“department”且值以“finance-”开头的 cookie 的规则如下:type = Cookie,compare_type=StartsWith,key = department value = finance-
compare_type 值
Regexp
StartsWith
EndsWith
Contains
EqualTo
GreaterThan
LessThan
L7Policy 对象数据模型。
字段
类型
是否为空
键
默认值
id
string(36)
NO
主键
listener_id
string(36)
NO
FK
操作
Enum (*)
NO
pool_id
string(36)
YES
redirect_url
string(256)
YES
索引
int
NO
action: [Reject,RedirectToURL,RedirectToPool]
如果 action 为 RedirectToURL,redirect_url 不能为 null
如果 action 为 RedirectToPool,pool_id 不能为 null
索引
如果此 Listener 的总策略数少于索引,则附加到列表末尾。
索引编号从 0 开始
如果存在具有相同索引号的策略,则将新策略插入该索引号,并递增此 Listener 中具有相同或更高索引值的策略的所有索引值。
不指定索引会将策略附加到列表。
REST API 影响¶
l7rule-create 为给定租户创建一个 L7Rule。
请求
POST /v2.0/l7rules Accept: application/json
{
"l7rule":{
"l7_policy_id": "6b96ff0cb17a4b859e1e575d221683c5",
"type":"Header",
"compare_type":"StartsWith",
"key":'department',
"value":"HR"
}
}
响应
{
"l7rule":{
"id": "6b96ff0cb17a4b859e1e575d221683d7",
"l7_policy_id": "6b96ff0cb17a4b859e1e575d221683c5",
"type":"Header",
"compare_type":"StartsWith",
"key":'department',
"value":"HR",
"tenant_id":"6b96ff0cb17a4b859e1e575d2216845"
}
}
l7rule-show 显示给定 L7Rule 的信息。
请求
GET /v2.0/l7rules/6b96ff0cb17a4b859e1e575d221683d7 Accept: application/json
响应
{
"l7rule":{
"id": "6b96ff0cb17a4b859e1e575d221683d7",
"l7_policy_id": "6b96ff0cb17a4b859e1e575d221683c5",
"type":"Header",
"compare_type":"StartsWith",
"key":'department',
"value":"HR"
"tenant_id":"6b96ff0cb17a4b859e1e575d2216845"
}
}
l7rule-delete 删除给定的 L7Rule。
请求
DELETE /v2.0/l7rules/6b96ff0cb17a4b859e1e575d221683d7 Accept: application/json
l7policy-create 为给定租户创建一个 L7Policy。
POST /v2.0/l7policies Accept: application/json
{
"l7policy":{
"listener_id": "6b96ff0cb17a4b859e1e575d221683c5",
"action":"RedirectToPool",
"pool_id":6b96ff0cb17a4b859e1e575d22168399,
"index": 2
}
}
响应
{
"l7policy":{
"id": "6b96ff0cb17a4b859e1e575d221683d7",
"listener_id": "6b96ff0cb17a4b859e1e575d221683c5",
"action":"RedirectToPool",
"pool_id":6b96ff0cb17a4b859e1e575d22168399,
"tenant_id":"6b96ff0cb17a4b859e1e575d2216845",
"index": 2
}
}
l7policy-show 显示给定 L7Policy 的信息。
请求
GET /v2.0/l7policies/6b96ff0cb17a4b859e1e575d221683d7 Accept: application/json
响应
{
"l7policy":{
"id": "6b96ff0cb17a4b859e1e575d221683d7",
"listener_id": "6b96ff0cb17a4b859e1e575d221683c5",
"action":"RedirectToPool",
"pool_id":6b96ff0cb17a4b859e1e575d22168399,
"tenant_id":"6b96ff0cb17a4b859e1e575d2216845",
"index": 2
}
}
l7policy-delete 删除给定的 L7Policy。
请求
DELETE /v2.0/l7policies/6b96ff0cb17a4b859e1e575d221683d7 Accept: application/json
安全影响¶
无。
通知影响¶
无。
其他最终用户影响¶
无。
性能影响¶
无。
IPv6 影响¶
无
其他部署者影响¶
无。
开发人员影响¶
无。
社区影响¶
此更改自 Juno 以来一直在审查中。 IRC 和邮件列表中进行了大量讨论。
备选方案¶
无。
实现¶
负责人¶
- 主要负责人
- 其他贡献者
待定
工作项¶
REST API
DB Schema
LBaaS 插件和驱动程序 API
CLI 更新
依赖项¶
依赖于新的 LBaaS 模型 https://review.openstack.org/#/c/89903/
测试¶
Tempest 测试¶
DB mixin 和模式测试
带有模拟驱动程序的 LBaaS 插件端到端测试
Tempest 测试
CLI 测试
功能测试¶
针对支持第 7 层交换的每个现有驱动程序的特定驱动程序测试
API 测试¶
REST API 和属性验证测试
文档影响¶
用户文档¶
Neutron CLI 应使用 L7Rule 和 L7Policy 实体进行修改
开发人员文档¶
Neutron API 应使用 L7Rule 和 L7Policy 实体进行修改