Neutron QoS API 模型和扩展¶
https://blueprints.launchpad.net/neutron/+spec/quantum-qos-api
本规范的范围是实现带宽限制 API,并为未来 API 和模型扩展奠定 QoS 模型,引入更多类型的 QoS 规则。
在网络术语中,QoS(服务质量)是关于限制、优先排序或保证流量速度,在这种情况下,是在 neutron 端口上。例如,我们可以标记流量,以便交换机/路由器以更高的优先级处理(IP/VLAN 标头),或者我们可能希望为某些类型的流量设置最小或最大带宽限制(实时流量需要以更高的优先级处理:VoIP、流媒体等,以减少延迟),或者云的管理员可能希望根据可用的网络带宽提供不同的服务级别。
正如我们所建议的那样,QoS 策略可以应用到
- 每个网络:所有连接到应用了 QoS 策略的网络上的端口都将获得该策略的应用。
应用到它们。
- 每个端口:当端口已经有任何
网络策略时,该策略将被覆盖,特定端口将获得策略的应用。
问题描述¶
网络 QoS 的定义涉及许多参数,并且难以标准化跨安装和云服务提供商 (CSPs) 的支持。目前,有许多 Neutron 插件拥有自己的服务质量 API 扩展,但每个插件都有自己的参数和结构。(注意:查找扩展并引用它们)
提议的变更¶
CSP 可以提供从预配置的策略列表中选择 QoS 策略的选项,该列表是特定 CSP 支持的。表达这种分类的常用方法是使用 QoS 策略中的名称字段,该字段可用于创建任意的服务级别,例如“铂金”、“黄金”、“白银”、“青铜”和“尽力而为”级别。请注意,这些类别只是示例,具体的命名约定可以由 CSP 定义,并且该列表可能具有不同的策略集。
即使从租户的角度来看,从 CSP 提供的列表中选择所需的 QoS 也可能更方便和更容易,而不是必须阐明 QoS 策略的复杂细节。每个级别映射到的网络 QoS 的实际定义可能因安装和 CSP 而异,并且可能包括带宽保证、优先级等,并且默认情况下将由 CSP 管理员定义,如前所述。
在电信用例中,租户可能感兴趣(并且信任)自行配置策略。可以通过修改随 neutron 提供的默认 policies.json 来允许这样做。
数据模型影响¶
该模型由两部分组成,即策略和规则。策略由规则组成。即使从一开始看起来过于复杂,它也允许在不更改对象关系(QoSPolicy <-> Port / QoSPolicy <-> Network)的情况下轻松扩展该功能。
对于带宽限制的情况,我们有一个第三个模型 QoSBandwidthLimitRule,它扩展了 QoSRule 基本数据模型。
可以通过向 QoSRule 添加新的子模型来引入新的规则。
QoSPolicy 模型具有以下属性
属性名称 |
类型 |
访问 |
默认值 |
验证/转换 |
描述 |
|---|---|---|---|---|---|
id |
字符串 (UUID) |
RO,全部 |
生成 |
uuid |
identity |
name |
string |
RW, tenant |
N/A |
无 |
QoS 名称 |
description |
string |
RW, tenant |
N/A |
无 |
QoS 描述 |
共享 |
bool |
RW, tenant |
False |
布尔值 |
是否可供其他租户访问 |
tenant_id |
字符串 (UUID) |
只读,租户 |
N/A |
uuid |
QoS 对象所有者的租户 ID |
QoSRule 对象,它组成 QoSPolicy,具有以下属性
属性名称 |
类型 |
访问 |
默认值 |
验证/转换 |
描述 |
|---|---|---|---|---|---|
id |
字符串 (UUID) |
RO,全部 |
生成 |
uuid |
identity |
qos_policy_id |
字符串 (UUID) |
RO,全部 |
N/A |
uuid |
QoSPolicy 引用 |
type |
string |
RW, tenant |
N/A |
enum |
QoS 类型 |
方向 |
string |
RW, tenant |
egress |
入站/出站 |
(保留)从 VM 视角 |
tenant_id |
字符串 (UUID) |
只读,租户 |
生成 |
uuid |
QoS 对象所有者的租户 ID |
QoSBandwidthLimitRule 模型如下所示
属性名称 |
类型 |
访问 |
默认值 |
验证/转换 |
描述 |
|---|---|---|---|---|---|
qos_rule_id |
字符串 (UUID) |
RO,全部 |
N/A |
uuid |
我们扩展的 QoSRule |
max_kbps |
integer |
RW, tenant |
N/A |
非空,>0 |
|
max_burst_kbps |
integer |
RW, tenant |
N/A |
空或 >0 |
超过 max_kbps 的突发 |
超出本规范范围的未来工作¶
流量分类:可以附加到 QoS 规则的流量分类器,以便仅对某些类型的流量处理带宽限制或特定标记。
使用 TC 的示例工作流程
neutron qos-tc-create sip-traffic \
--protocol udp --port 5060 \
--description "SIP signaling"
neutron qos-rule-create <rule-type> \
<policy-name-or-id> \
[.. rule parameters ..] \
--traffic-classifier <tc-id>
我们认为流量分类器应该与 neutron 中的其他软件(服务即 TAP、服务链等)共享。
更多规则类型:* 流量标记:dscp、ipv6 流标签、vlan 802.1p * 带宽保证:尽力而为,或严格(与 nova-scheduling 结合)
可以通过通用的 RBAC 支持执行对 QoS 策略的访问控制。评估控制不同类型策略的配额。
其他 QoS 工作:* 拥塞通知支持:当无法满足保证时,在租户网络数据包上设置 IP ECN 位,例如。
探索与 flavor 框架的集成。
网络聚合带宽限制。
REST API 影响¶
拟议属性
QOS_RULE_COMMON_FIELDS = {
'id': {'allow_post': False, 'allow_put': False,
'validate': {'type:uuid': None},
'is_visible': True,
'primary_key': True},
'tenant_id': {'allow_post': True, 'allow_put': False,
'required_by_policy': True,
'is_visible': True},
}
RESOURCE_ATTRIBUTE_MAP = {
'policies': {
'id': {'allow_post': False, 'allow_put': False,
'validate': {'type:uuid': None},
'is_visible': True,
'primary_key': True},
'name': {'allow_post': True, 'allow_put': True,
'is_visible': True, 'default': '',
'validate': {'type:string': None}},
'description': {'allow_post': True, 'allow_put': True,
'is_visible': True, 'default': '',
'validate': {'type:string': None}},
'shared': {'allow_post': True, 'allow_put': True,
'is_visible': True, 'default': False,
'convert_to': attr.convert_to_boolean},
'tenant_id': {'allow_post': True, 'allow_put': False,
'required_by_policy': True,
'is_visible': True},
'rules': {'allow_post': False, 'allow_put': False,
'is_visible': True},
},
'rule_types': {
'type': {'allow_post': False, 'allow_put': False,
'is_visible': True},
}
}
SUB_RESOURCE_ATTRIBUTE_MAP = {
'bandwidth_limit_rules':{
'parent': {'collection_name': 'policies',
'member_name': 'policy'},
'parameters': {
dict(QOS_RULE_COMMON_FIELDS,
**{
'max_kbps': {'allow_post': True, 'allow_put': True,
'is_visible': True, 'default': None,
'validate': {'type:integer', None}},
'max_burst_kbps': {
'allow_post': True, 'allow_put': True,
'is_visible': True, 'default': 0,
'validate': {'type:integer', None}},
})
}
}
QOS = "qos_policy_id"
EXTENDED_ATTRIBUTES_2_0 = {
'ports': {QOS: {'allow_post': True,
'allow_put': True,
'is_visible': True,
'default': None,
'validate': {'type:uuid_or_none': None}}},
'networks': {QOS: {'allow_post': True,
'allow_put': True,
'is_visible': True,
'default': None,
'validate': {'type:uuid_or_none': None}}},
}
示例请求/响应
创建策略请求
POST /v2.0/qos/policies/
{
"policy": {
"name": "10Mbit",
"description": "This policy limits the ports to 10Mbit max.",
"shared": "False"
}
}
Response:
{
"policy": {
"name": "10Mbit",
"description": "This policy limits the ports to 10Mbit max.",
"id": "46ebaec0-0570-43ac-82f6-60d2b03168c4",
"tenant_id": "8d4c70a21fed4aeba121a1a429ba0d04",
"shared": "False"
}
}
列出可用规则类型
GET /v2.0/qos/rule-types
Response:
{
"rule_types": [{"type": "bandwidth_limit"}]
}
创建规则请求
POST /v2.0/qos/policies/46ebaec0-0570-43ac-82f6-60d2b03168c4/bandwidth_limit_rules/
{
"bandwidth_limit_rule": {
"max_kbps": "10000",
}
}
Response:
{
"bandwidth_limit_rule":{
"id": "5f126d84-551a-4dcf-bb01-0e9c0df0c793",
"policy_id": "46ebaec0-0570-43ac-82f6-60d2b03168c4",
"max_kbps": "10000",
"max_burst_kbps": "0",
}
}
显示特定策略
GET /v2.0/qos/policies/46ebaec0-0570-43ac-82f6-60d2b03168c4
Accept: application/json
Response:
{
"policy": {
"tenant_id": "8d4c70a21fed4aeba121a1a429ba0d04",
"id": "46ebaec0-0570-43ac-82f6-60d2b03168c4",
"name": "10Mbit",
"description": "This policy limits the ports to 10Mbit max.",
"shared": False,
"bandwidth_limit_rules": [{
"id": "5f126d84-551a-4dcf-bb01-0e9c0df0c793",
"policy_id": "46ebaec0-0570-43ac-82f6-60d2b03168c4",
"max_kbps": "10000",
"max_burst_kbps": "0",
}]
}
}
列表请求
GET /v2.0/qos/policies
Response:
{
“policies”:
[
{
"tenant_id": "8d4c70a21fed4aeba121a1a429ba0d04",
"id": "46ebaec0-0570-43ac-82f6-60d2b03168c4",
"name": "10Mbit",
"description": "This policy limits the ports to 10Mbit max.",
"shared": False,
"bandwidth_limit_rules": [{
"id": "5f126d84-551a-4dcf-bb01-0e9c0df0c793",
"policy_id": "46ebaec0-0570-43ac-82f6-60d2b03168c4",
"max_kbps": "10000",
"max_burst_kbps": "0",
}]
},
{
...
}
]
}
安全影响¶
默认情况下,QoS 策略和规则将由云管理员管理,这使得租户无法创建特定的 qos 规则,或将特定的端口附加到策略。
在某些用例中,例如电信,管理员可能信任租户,因此允许他们创建和将其自己的策略附加到端口。这些用例将通过修改 policy.json 并发布带有扩展的特定文档来支持。
可以通过使用 RBAC 部分克服此限制。
通知影响¶
无
其他最终用户影响¶
将向 python-neutronclient 添加其他方法,以创建、列出、更新和删除 QoS 策略和规则。将添加专用的 CLI 命令来创建和更新每种 QoS 规则类型。
策略操作
neutron qos-policy-list
neutron qos-policy-create <policy-name> [--description policy-description]
[--shared True]
neutron qos-policy-update <policy-name-or-id> [--description ....]
[--name ...]
neutron qos-policy-show <policy-name-or-id>
neutron qos-policy-delete <policy-name-or-id>
策略规则操作
neutron qos-bandwidth-limit-rule-create <policy-name-or-id> \
--max_kbps x [--max_burst_kbps y]
neutron qos-bandwidth-limit-rule-update <rule-id> <policy-name-or-id> \
--max_kbps x [--max_burst_kbps y]
neutron qos-bandwidth-limit-rule-list <policy-name-or-id>
neutron qos-bandwidth-limit-rule-delete <rule-id> <policy-name-or-id>
neutron qos-bandwidth-limit-rule-show <rule-id> <policy-name-or-id>
+-------------------+---------------------------------+
| Field | Value |
+-------------------+---------------------------------+
| id | <rule-id> |
| type | bandwidth_limit |
| description | 10 Mbps limit |
| max_kbps | 10000 |
| max_burst_kbps | 0 |
+-------------------+---------------------------------+
neutron qos-available-rule-types
+-----------------------+
| QoS policy rule types |
+-----------------------+
| bandwidth_limit |
+-----------------------+
将端口/网络附加到策略
neutron port-create NET-NAME-OR-ID --qos-policy <policy-name-or-id> ...
neutron net-create NAME --qos-policy <policy-name-or-id> ....
neutron port-update <port-id> --qos-policy <policy-name-or-id>
neutron net-update <net-name-or-id> --qos-policy <policy-name-or-id>
注意:基于初始实现,租户可能能够使用标记为 Shared 的策略,而无需修改 policy.json。 稍后,RBAC 实现可能会允许更精细的控制。
从策略中分离端口/网络
neutron port-update <port-id> --no-qos-policy
性能影响¶
在某些 QoS 驱动程序中,将创建其他消息调用,集群中的 L2 代理将使用这些调用来查询 QoS 信息,以便在创建网络和端口时使用。 尽管应优化这些消息流以避免规模问题,但我们应研究传播与端口和网络资源相关的此类信息的常用方法和消息。
IPv6 影响¶
无
其他部署者影响¶
将在 Neutron 插件配置中添加一个额外的配置部分,以配置实现 QoS API 的驱动程序。
开发人员影响¶
无
备选方案¶
在实例内部进行 QoS / 流量分类。 这仅限于最基本的,因为实例无法标记外部分段数据包以在 L2/L3 级别优先处理流量。 此外,租户可能无法被信任去做正确的事情。
Nova flavors 对 QoS 的支持 [2] 允许通过 libvirt 接口在 VM tap 上设置带宽限制。 这足以对 VM 进行基本的 BW 限制,但不支持其他 QoS 规则,并且也不支持服务端口 QoS。 用户可能需要坚持一种方法或另一种方法。 这需要记录。
社区影响¶
社区,特别是电信和运营商一直在寻找一种将 QoS 功能引入 neutron 管理的 SDN 的方法。 对于某些用例,优先级和低抖动对于某些类型的应用程序至关重要,例如 VoIP 或视频流。
实现¶
负责人¶
mangelajo
gsagie
scollins
irenab
vikram
Moshe Levi
Mathieu Rohon
gampel
工作项¶
REST API + API 测试
数据库模型和数据库迁移
python-neutronclient 支持
命令行客户端实现,包括 bash 补全。
openstack-sdk 实现
关于其他规范
RPC 方法
驱动程序模型
驱动程序实现
参考 OVS 实现 [1]
依赖项¶
无
测试¶
Tempest 测试¶
无,因为这涵盖在树内 API 测试中。
功能测试¶
无,在较低级别的规范中,功能测试将用于验证低级别参考实现,并确保执行有效的带宽限制。
API 测试¶
将通过 API 测试测试新的 api 接口,以确保所有操作都能按预期工作。
我们应该包括测试,以确保测试不兼容的规则,对于我们唯一的带宽限制,我们只需要查看一个策略中没有两个不同的带宽限制规则。
文档影响¶
用户文档¶
需要为部署者/操作员提供其他文档,包括替代 neutron 中提供的默认 policy.json 文件。
需要为 REST API 添加项提供其他文档。
需要为用户指南提供其他文档。
开发人员文档¶
设计文档。
关于如何添加新规则类型的文档。