LBaaS 第 7 层规则

Launchpad蓝图

https://blueprints.launchpad.net/neutron/+spec/lbaas-l7-rules

第 7 层交换源于 OSI 模型,表示设备基于第 7 层(应用层)数据来交换请求。第 7 层交换也称为“请求交换”、“应用交换”和“基于内容的路由”。第 7 层交换器向外部世界呈现一个“虚拟服务器”,该服务器代表多个服务器接受请求,并根据使用应用数据确定哪个服务器应该服务哪个请求的策略来分发这些请求。这允许针对特定类型的内容专门调整/优化应用基础设施。例如,一个服务器可以调整为仅提供图像,另一个用于执行服务器端脚本语言,如 PHP 和 ASP,而另一个用于静态内容,如 HTML、CSS 和 JavaScript。

问题描述

用例

  1. 将流量重定向到支持静态内容(HTML、CSS)的池

  2. 将流量重定向到提供图像(jpg、png 等)的池

提议的变更

扩展 LBaaS API 并支持第 7 层交换。

第 7 层实体
  1. L7Rule - 一组属性,定义应匹配请求的哪个部分以及如何匹配。

  2. 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 的引用

  1. 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

  1. 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 和邮件列表中进行了大量讨论。

备选方案

无。

实现

负责人

主要负责人

https://launchpad.net/~avishayb

其他贡献者

待定

工作项

  • REST API

  • DB Schema

  • LBaaS 插件和驱动程序 API

  • CLI 更新

依赖项

测试

Tempest 测试

  • DB mixin 和模式测试

  • 带有模拟驱动程序的 LBaaS 插件端到端测试

  • Tempest 测试

  • CLI 测试

功能测试

  • 针对支持第 7 层交换的每个现有驱动程序的特定驱动程序测试

API 测试

  • REST API 和属性验证测试

文档影响

用户文档

  • Neutron CLI 应使用 L7Rule 和 L7Policy 实体进行修改

开发人员文档

  • Neutron API 应使用 L7Rule 和 L7Policy 实体进行修改

参考资料

https://wiki.openstack.org/wiki/Neutron/LBaaS/l7