QoS被定义为保证某些网络需求(如带宽,延迟,抖动和可靠性)以满足应用提供商与最终用户之间的服务水平协议(SLA)的能力。
网络设备(如交换机和路由器)可以标记流量,以便以更高的优先级处理流量,以满足SLA下约定的QoS条件。在其他情况下,诸如IP语音(VoIP)和视频流之类的某些网络流量需要以最小的带宽约束来传送。在没有网络QoS管理的系统上,所有流量将以“尽力而为”的方式传输,使得不可能保证向客户的服务传递。
QoS是一种高级服务插件。 QoS在多个级别上与OpenStack Networking代码的其余部分分离,并且可以通过ml2扩展驱动程序获得。
支持的QoS规则类型
任何插件或ml2机制驱动程序都可以通过提供一个名为supported_qos_rule_types的插件/驱动程序类属性来声明对某些QoS规则类型的支持,该属性返回与QoS规则类型对应的字符串列表。
在最简单的情况下,属性可以通过在类上定义的简单的Python列表来表示。
对于ml2插件,支持的QoS规则类型的列表被定义为所有活动机制驱动程序支持的规则的公共子集。
配置
要启用该服务,请按照以下步骤操作:
1.在网络节点上:
将QoS服务添加到/etc/neutron/neutron.conf中的service_plugins设置。 例如:
service_plugins = \
neutron.services.l3_router.l3_router_plugin.L3RouterPlugin,
neutron.services.metering.metering_plugin.MeteringPlugin,
neutron.services.qos.qos_plugin.QoSPlugin
2.可选的,在/etc/neutron/neutron.conf中的[qos]部分中设置所需的notification_drivers(默认为message_queue)。
3.在/etc/neutron/plugins/ml2/ml2_conf.ini中,在[ml2]部分的extension_drivers中添加qos。 例如:
[ml2]
extension_drivers = port_security, qos
如果正在使用Open vSwitch代理,请在/etc/neutron/plugins/ml2/openvswitch_agent.ini的[agent]部分中将扩展设置为qos。 例如:
[agent]
extensions = qos
在计算节点上:
1.在/etc/neutron/plugins/ml2/openvswitch_agent.ini中,将qos添加到[agent]部分中的扩展设置。 例如:
[agent]
extensions = qos
受信任的项目policy.json配置
如果项目被信任在您的云中管理自己的QoS策略,可以修改neutron的文件policy.json以允许这样做。
修改/etc/neutron/policy.json策略条目,如下所示:
"get_policy": "rule:regular_user",
"create_policy": "rule:regular_user",
"update_policy": "rule:regular_user",
"delete_policy": "rule:regular_user",
启用带宽限制规则:
"get_policy_bandwidth_limit_rule": "rule:regular_user",
"create_policy_bandwidth_limit_rule": "rule:admin_only",
"delete_policy_bandwidth_limit_rule": "rule:admin_only",
"update_policy_bandwidth_limit_rule": "rule:admin_only",
"get_rule_type": "rule:regular_user",
启用DSCP标记规则:
"get_policy_dscp_marking_rule": "rule:regular_user",
"create_dscp_marking_rule": "rule:admin_only",
"delete_dscp_marking_rule": "rule:admin_only",
"update_dscp_marking_rule": "rule:admin_only",
"get_rule_type": "rule:regular_user",
用户工作流
QoS策略仅由具有默认policy.json的管理员创建。 因此,您应该让云运营商代表云项目设置它们。
如果项目受信任以创建自己的策略,请检查受信任项目policy.json配置部分。
首先,创建QoS策略及其带宽限制规则:
$ neutron qos-policy-create bw-limiter
Created a new policy:
+-------------+--------------------------------------+
| Field | Value |
+-------------+--------------------------------------+
| description | |
| id | 0ee1c673-5671-40ca-b55f-4cd4bbd999c7 |
| name | bw-limiter |
| rules | |
| shared | False |
| tenant_id | 85b859134de2428d94f6ee910dc545d8 |
+-------------+--------------------------------------+
$ neutron qos-bandwidth-limit-rule-create bw-limiter --max-kbps 3000 \
--max-burst-kbps 300
Created a new bandwidth_limit_rule:
+----------------+--------------------------------------+
| Field | Value |
+----------------+--------------------------------------+
| id | 92ceb52f-170f-49d0-9528-976e2fee2d6f |
| max_burst_kbps | 300 |
| max_kbps | 3000 |
+----------------+--------------------------------------+
第二,将创建的策略与现有中子端口关联。 为此,用户提取要与已创建的策略关联的端口ID。 在下一个示例中,我们将为具有IP地址10.0.0.3的VM分配bw-limiter策略
$ neutron port-list
+--------------------------------------+----------------------------------+
| id | fixed_ips |
+--------------------------------------+----------------------------------+
| 0271d1d9-1b16-4410-bd74-82cdf6dcb5b3 | { ... , "ip_address": "10.0.0.1"}|
| 88101e57-76fa-4d12-b0e0-4fc7634b874a | { ... , "ip_address": "10.0.0.3"}|
| e04aab6a-5c6c-4bd9-a600-33333551a668 | { ... , "ip_address": "10.0.0.2"}|
+--------------------------------------+----------------------------------+
$ neutron port-update 88101e57-76fa-4d12-b0e0-4fc7634b874a --qos-policy bw-limiter
Updated port: 88101e57-76fa-4d12-b0e0-4fc7634b874a
为了将端口从QoS策略中分离,只需再次更新端口配置。
$ neutron port-update 88101e57-76fa-4d12-b0e0-4fc7634b874a --no-qos-policy
Updated port: 88101e57-76fa-4d12-b0e0-4fc7634b874a
端口可以通过附加的策略创建。
$ neutron port-create private --qos-policy-id bw-limiter
Created a new port:
+-----------------------+--------------------------------------------------+
| Field | Value |
+-----------------------+--------------------------------------------------+
| admin_state_up | True |
| allowed_address_pairs | |
| binding:vnic_type | normal |
| device_id | |
| device_owner | |
| dns_assignment | {"hostname": "host-10-0-0-4", ... } |
| dns_name | |
| fixed_ips | {"subnet_id": |
| | "fabaf9b6-7a84-43b6-9d23-543591b531b8", |
| | "ip_address": "10.0.0.4"} |
| id | c3cb8faa-db36-429d-bd25-6003fafe63c5 |
| mac_address | fa:16:3e:02:65:15 |
| name | |
| network_id | 4920548d-1a6c-4d67-8de4-06501211587c |
| port_security_enabled | True |
| qos_policy_id | 0ee1c673-5671-40ca-b55f-4cd4bbd999c7 |
| security_groups | b9cecbc5-a136-4032-b196-fb3eb091fff2 |
| status | DOWN |
| tenant_id | 85b859134de2428d94f6ee910dc545d8 |
+-----------------------+--------------------------------------------------+
您可以将网络连接到QoS策略。 这意味着任何连接到网络的计算端口将默认使用网络策略,除非端口具有特定的策略。 网络拥有的端口,如DHCP和路由器端口从网络策略应用程序中排除。
为了将QoS策略附加到网络,更新现有网络或初始创建附加到策略的网络。
$ neutron net-update private --qos-policy bw-limiter
Updated network: private
配置正确的突发值非常重要。 如果突发值设置得太低,即使使用适当的带宽限制设置,带宽使用也会受到限制。 此问题在各种文档源中讨论,例如在Juniper的文档中。 TCP流量的突发值可以设置为所需带宽限制值的80%。 例如,如果带宽限制设置为1000kbps,则足够的突发值将为800kbit。 如果配置的突发值太低,实现的带宽限制将低于预期。 如果配置的突发值太高,则可能限制太少的分组,并且实现的带宽限制将高于预期。
管理员强制
管理员能够在项目端口或网络上实施策略。 只要策略不共享,项目就无法分离任何连接到网络或端口的策略。
如果策略是共享的,则项目能够将其从其自己的端口和网络附加或分离。
规则修改
您可以在运行时修改规则。 规则修改将传播到任何连接的端口。
$ neutron qos-bandwidth-limit-rule-update \
92ceb52f-170f-49d0-9528-976e2fee2d6f bw-limiter \
--max-kbps 2000 --max-burst-kbps 200
Updated bandwidth_limit_rule: 92ceb52f-170f-49d0-9528-976e2fee2d6f
$ neutron qos-bandwidth-limit-rule-show \
92ceb52f-170f-49d0-9528-976e2fee2d6f bw-limiter
+----------------+--------------------------------------+
| Field | Value |
+----------------+--------------------------------------+
| id | 92ceb52f-170f-49d0-9528-976e2fee2d6f |
| max_burst_kbps | 200 |
| max_kbps | 2000 |
+----------------+--------------------------------------+
与带宽限制一样,创建DSCP标记规则的策略:
$ neutron qos-policy-create dscp-marking
Created a new policy:
+-------------+--------------------------------------+
| Field | Value |
+-------------+--------------------------------------+
| description | |
| id | 8569fb4d-3d63-483e-b49a-9f9290d794f4 |
| name | dscp-marking |
| rules | |
| shared | False |
| tenant_id | 85b859134de2428d94f6ee910dc545d8 |
+-------------+--------------------------------------+
您可以使用neutron客户端创建,更新,列出,删除和显示DSCP标记:
$ neutron qos-dscp-marking-rule-create dscp-marking --dscp-mark 26
Created a new dscp marking rule
+----------------+--------------------------------------+
| Field | Value |
+----------------+--------------------------------------+
| id | 115e4f70-8034-4176-8fe9-2c47f8878a7d |
| dscp_mark | 26 |
+----------------+--------------------------------------+
$ neutron qos-dscp-marking-rule-update \
115e4f70-8034-4176-8fe9-2c47f8878a7d dscp-marking --dscp-mark 22
Updated dscp_rule: 115e4f70-8034-4176-8fe9-2c47f8878a7d
$ neutron qos-dscp-marking-rule-show \
115e4f70-8034-4176-8fe9-2c47f8878a7d dscp-marking
+----------------+--------------------------------------+
| Field | Value |
+----------------+--------------------------------------+
| id | 115e4f70-8034-4176-8fe9-2c47f8878a7d |
| dscp_mark | 22 |
+----------------+--------------------------------------+
$ neutron qos-dscp-marking-rule-delete \
115e4f70-8034-4176-8fe9-2c47f8878a7d dscp-marking
Deleted dscp_rule: 115e4f70-8034-4176-8fe9-2c47f8878a7d
$ neutron qos-dscp-marking-rule-list dscp-marking
+--------------------------------------+----------------------------------+
| id | dscp_mark |
+--------------------------------------+----------------------------------+
| 115e4f70-8034-4176-8fe9-2c47f8878a7d | 22 |
+--------------------------------------+----------------------------------+