1.Quality of Service
本文基于openstack的Pike版本分析neutron qos 服务。Qos(Quality of Service)通过ml2 extension driver扩展了neutron的核心功能。DB models, API extension, and usecases可以在qos spec查看,链接如下<http://specs.openstack.org/openstack/neutron-specs/specs/liberty/qos-api-extension.html>
2. Configuration
使系统支持qos的配置:
1.修改neutron-server的neutron.conf配置
# vim/etc/neutron/neutron.conf
service_plugins = qos
2.修改neutron-server的ml2_conf.ini配置
# vim /etc/neutron/plugins/ml2/ml2_conf.ini
[ml2]
extension_drivers=qos
3.修改ovs-agent配置
# vim/etc/neutron/plugins/ml2/ml2_conf.ini
[agent]
extensions=qos
3.Userworkflow
首先创建Qos策略和带宽限制规则
$ openstack network qos policy create bw-limiter
Created a new policy:
+-------------+--------------------------------------+
| Field | Value |
+-------------+--------------------------------------+
| description | |
| id | 5df855e9-a833-49a3-9c82-c0839a5f103f |
| is_default | False |
| name | qos1 |
| project_id | 4db7c1ed114a4a7fb0f077148155c500 |
| rules | [] |
| shared | False |
+-------------+--------------------------------------+
$ openstack network qos rule create --type bandwidth-limit --max-kbps 3000\
--max-burst-kbits 300 --egress bw-limiter
Created a new bandwidth_limit_rule:
+----------------+--------------------------------------+
| Field | Value |
+----------------+--------------------------------------+
| direction | egress |
| id | 92ceb52f-170f-49d0-9528-976e2fee2d6f |
| max_burst_kbps | 300 |
| max_kbps | 3000 |
+----------------+--------------------------------------
第二步,查看端口的的ID,为端口加Qos策略
$ openstack port list
+--------------------------------------+-----------------------------------+
| ID | Fixed IP Addresses |
+--------------------------------------+-----------------------------------+
| 0271d1d9-1b16-4410-bd74-82cdf6dcb5b3 | { ... , "ip_address": "192.0.2.1"}|
| 88101e57-76fa-4d12-b0e0-4fc7634b874a | { ... , "ip_address": "192.0.2.3"}|
| e04aab6a-5c6c-4bd9-a600-33333551a668 | { ... , "ip_address": "192.0.2.2"}|
+--------------------------------------+-----------------------------------+
$ openstack port set --qos-policy bw-limiter \
88101e57-76fa-4d12-b0e0-4fc7634b874a
Updated port: 88101e57-76fa-4d12-b0e0-4fc7634b874a
删除端口策略
$ openstack port unset --no-qos-policy 88101e57-76fa-4d12-b0e0-4fc7634b874a
Updated port: 88101e57-76fa-4d12-b0e0-4fc7634b874a
当创建端口时,就创建端口策略
$ openstack port create --qos-policy bw-limiter --network private port1
Created a new port:
+-----------------------+--------------------------------------------------+
| Field | Value |
+-----------------------+--------------------------------------------------+
| admin_state_up | UP |
| allowed_address_pairs | |
| binding_host_id | |
| binding_profile | |
| binding_vif_details | |
| binding_vif_type | unbound |
| binding_vnic_type | normal |
| created_at | 2017-05-15T08:43:00Z |
| description | |
| device_id | |
| device_owner | |
| dns_assignment | None |
| dns_name | None |
| extra_dhcp_opts | |
| fixed_ips | ip_address='10.0.10.4', subnet_id='292f8c1e-...' |
| id | f51562ee-da8d-42de-9578-f6f5cb248226 |
| ip_address | None |
| mac_address | fa:16:3e:d9:f2:ba |
| name | port1 |
| network_id | 55dc2f70-0f92-4002-b343-ca34277b0234 |
| option_name | None |
| option_value | None |
| port_security_enabled | False |
| project_id | 4db7c1ed114a4a7fb0f077148155c500 |
| qos_policy_id | 5df855e9-a833-49a3-9c82-c0839a5f103f |
| revision_number | 6 |
| security_group_ids | 0531cc1a-19d1-4cc7-ada5-49f8b08245be |
| status | DOWN |
| subnet_id | None |
| updated_at | 2017-05-15T08:43:00Z |
+-----------------------+--------------------------------------------------+
更多用法请参考
<https://docs.openstack.org/neutron/latest/admin/config-qos.html>
4. Service side design
* neutron.extensions.qos:
扩展的描述需要从extensions.ExtensionDescriptor
继承, get_name, get_description, get_namespace, get_updated四个函数返回的内容,是在调用neutron ext-show qos命令时显示的内容。
* neutron.services.qos.qos_plugin:.
插件入口,插件的接口必须从ServicePluginBase继承,get_plugin_name, get_plugin_type, get_plugin_description必须实现,为插件的基础信息。
* neutron.services.qos.drivers.manager:
将对象操作传递给每个启用的QoS driver。
* neutron.services.qos.drivers.base:
用于可插拔QoS驱动程序的接口类,用于在任何规则或策略更改时更新关于新的{create,update,delete}事件的后端。驱动程序还声明支持哪些QoS规则,VIF驱动程序和VNIC类型。
* neutron.core_extensions.base:
包含实现核心资源(端口/网络)的接口类扩展。 核心资源扩展可以轻松地集成到
感兴趣的插件。 我们可能需要一个核心资源扩展管理器 这将利用这些扩展,以避免每个插件修改新的核心资源扩展。
* neutron.core_extensions.qos:
包含符合上述接口的QoS核心资源扩展。
* neutron.plugins.ml2.extensions.qos:
包含通过重用来处理核心资源更新的ml2扩展驱动程序上面提到的core_extensions.qos模块。 将来,我们愿意看到一个与插件无关的核心资源扩展管理器,可能是集成到其他插件中。
5.QoS plugin implementation guide
neutron.extensions.qos.QoSPluginBase类使用方法代理方法涉及QoS策略规则。 这些方法中的每一种在某种意义上都是通用的它旨在处理任何规则类型。 例如,QoSPluginBase有一个create_policy_rule方法,而不是
create_policy_dscp_marking_rule和create_policy_bandwidth_limit_rule方法。 代理背后的逻辑允许调用一个插件的create_policy_dscp_marking_rule来处理create_policy_rule方法,它将接收一个QosDscpMarkingRule对象参数,以便执行特定于DSCP标记规则类型的行为。
这种方法允许在不需要插件的情况下引入新的规则类型修改代码作为结果。 正如所料,QoSPluginBase的任何子类必须覆盖基类的abc.abstractmethod方法,即使加注未实现。
6.Supported QoS rule types
Networking back ends, supported rules, and traffic direction¶ | |||
Rule back end | Open vSwitch | SR-IOV | Linux bridge |
Bandwidth limit | Egress/Ingress | Egress (1) | EgressIngress |
Minimum bandwidth | Egress | ||
DSCP marking | Egress | Egress |
7.Database models
QoS设计定义了以下两个概念资源来应用QoS规则对于端口或网络:
* QoS policy
* QoS rule (type specific)
每个QoS策略包含零个或多个QoS规则。 然后将策略应用于网络或端口,使策略的所有规则应用于相应的neutron资源。策略规则可以适用或不适用到neutron内部端口(如路由器,dhcp,负载平衡器等)。 QosRule基础对象提供了一个默认的should_apply_to_port方法覆盖。将来我们可能希望在QoSNetworkPolicyBinding中有一个标志或QosRule来强制执行这种类型的应用程序(例如限制所有应用程序)路由器设备自动进入外部网络)。
从数据库的角度来看,以下对象在模式中定义:
* QosPolicy:直接映射到概念策略资源。
*QosNetworkPolicyBinding,QosPortPolicyBinding:定义neutron资源和QoS策略的关联。
*QosBandwidthLimitRule:定义限制最大出口的规则带宽。
*QosDscpMarkingRule:定义标记不同服务的规则位出口流量。
*QosMinimumBandwidthRule:定义创建最小带宽的规则约束。
所有数据库模型都定义在:
* neutron.db.qos.models
8.Agent side design
参考代理使用“L2代理扩展”实现QoS功能 <./ l2_agent_extensions.html>`_。
* neutron.agent.l2.extensions.qos 定义了QoS L2代理扩展。它接收handle_port和delete_port 事件并将其传递到QoS agent driver。
目前,Open vSwitch,SR-IOV和Linux Bridge支持QoS ml2驱动程序。每个代理后端定义了实现QosAgentDriver的QoS驱动程序接口。以OpenvSwitch为例:
OpenvSwitch
OpenvSwitch实现依赖于ovs_libOVSBridge功能:
*get_egress_bw_limit_for_port
*create_egress_bw_limit_for_port
*delete_egress_bw_limit_for_port
出口带宽限制通过设置在端口上有效配置端口接口参数ingress_policing_rate和ingress_policing_burst。这种方法比linux-htb,Queues和OvS QoS配置文件更不灵活,我们可能会在未来探索,但需要使用它结合openflow规则。
9.QoS driver design
QoS框架足够灵活,可以支持任何第三方供应商。整合一个第三方驱动程序(只是想知道QoS创建/更新/删除API)用,需要实现'neutron.services.qos.drivers.base并注册驱动程序在核心插件或机制驱动程序加载时,请参阅neutron.services.qos.drivers.openvswitch.driver注册方法为例。