服务质量 (QoS)

QoS 被定义为保证某些网络需求的能力,例如带宽、延迟、抖动和可靠性,以满足应用程序提供商和最终用户之间的服务级别协议 (SLA)。

诸如交换机和路由器之类的网络设备可以标记流量,以便以更高的优先级处理,从而满足 SLA 协议中约定的 QoS 条件。在其他情况下,某些网络流量,例如语音 over IP (VoIP) 和视频流,需要以最小的带宽限制进行传输。在没有网络 QoS 管理的系统上,所有流量都将以“尽力而为”的方式传输,这使得保证客户的服务交付变得不可能。

QoS 是一个高级服务插件。QoS 在多个级别与 OpenStack Networking 代码的其余部分分离,并且可通过 ml2 扩展驱动程序使用。

有关 DB 模型、API 扩展和用例的详细信息不在本指南的范围内,但可以在 Neutron QoS 规范 中找到。

支持的 QoS 规则类型

支持的 QoS 规则类型现在作为 VALID_RULE_TYPESQoS 规则类型 中提供

  • bandwidth_limit: 网络、端口或浮动 IP 上的带宽限制。

  • packet_rate_limit: 某些类型流量的包速率限制。

  • dscp_marking: 使用 DSCP 值标记网络流量。

  • minimum_bandwidth: 某些类型流量的最小带宽限制。

  • minimum_packet_rate: 某些类型流量的最小包速率限制。

任何 QoS 驱动程序都可以通过提供名为 supported_rules 的驱动程序属性来声明对某些 QoS 规则类型的支持,QoS 驱动程序管理器将动态地重新计算 QoS 驱动程序支持的规则类型。在最简单的情况下,该属性可以由类中定义的简单 Python 列表表示。

下表显示了网络后端、支持的 QoS 规则以及流量方向(从 VM 的角度)。

网络后端、支持的规则和流量方向

规则 \ 后端

Open vSwitch

SR-IOV

OVN

带宽限制

出口 \ 入口

出口 (1)

出口 \ 入口

包速率限制

出口 \ 入口

最小带宽

出口 \ 入口 (2)

出口 \ 入口 (2)

出口 \ 入口 (2)

最小包速率

DSCP 标记

出口

出口

注意

  1. 由于 IP 工具不支持,因此跳过最大突发参数。

  2. 基于位置的强制执行适用于出口和入口方向,但数据平面强制执行取决于后端。

Neutron 后端、支持的方向和最小带宽规则的强制执行类型

强制执行类型 后端

Open vSwitch

SR-IOV

OVN

数据平面

出口 (3)

出口 (1)

出口 (4)

放置

出口/入口 (2)

出口/入口 (2)

出口/入口 (4)

注意

  1. 自 Newton 以来

  2. 自 Stein 以来

  3. Open vSwitch 最小带宽支持仅针对出口方向实现,并且仅针对没有隧道流量的网络(仅 VLAN 和扁平网络类型)。

  4. 自 Zed 以来

注意

SR-IOV 代理不支持具有 direct-physical vnic_type 的端口的数据平面强制执行。但是,自 Yoga 以来,此 vnic_type 也支持位置强制执行。

Neutron 后端、支持的方向和最小包速率规则的强制执行类型

强制执行类型 后端

Open vSwitch

SR-IOV

OVN

数据平面

放置

任何(1)/出口/入口 (2)

注意

  1. 最小包速率规则支持 any 方向,该方向可用于非硬件卸载的 OVS 部署,其中来自出口和入口方向的包由相同的 CPU 核心处理。

  2. 自 Yoga 以来。

对于 ml2 插件,支持的 QoS 规则类型和参数列表定义为所有活动机制驱动程序支持的规则的公共子集。QoS 规则始终附加到 QoS 策略。当创建或更新规则时

  • 如果 QoS 策略未附加到任何端口或网络,QoS 插件将检查任何活动机制驱动程序是否支持此规则和参数。

  • 如果 QoS 策略附加到任何端口或网络,QoS 插件将检查管理这些端口的机制驱动程序是否支持此规则和参数。

有效的 DSCP 标记

有效的 DSCP 标记值是 0 到 56 之间的偶数,不包括 2-6、42 和 50-54。完整的有效 DSCP 标记列表是

0, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 44, 46, 48, 56

L3 QoS 支持

Neutron L3 服务已实现其自己的 QoS 扩展。可以将 QoS 策略应用于浮动 IP 和路由器;在后者(路由器)中,QoS 策略将应用于网关端口。

规则支持取决于使用的 ML2 后端。

ML2/OVS

ML2/OVS L3 QoS 仅支持速率限制规则

  • 浮动 IP 带宽限制:速率限制独立地应用于每个浮动 IP 地址。

  • 网关 IP 带宽限制:速率限制应用于路由器命名空间网关端口(或在 DVR 边缘路由器的情况下,应用于 SNAT 命名空间)。速率限制适用于网关 IP;这意味着使用此网关 IP 的所有流量都将受到限制。此速率限制不适用于浮动 IP 流量。

ML2/OVN

ML2/OVN L3 QoS 支持速率限制和 DSCP 规则。浮动 IP 和网关端口 QoS 策略都使用 QoS 计量规则应用。

  • 浮动 IP:流量应匹配网关端口和浮动 IP 地址。端口可以是集中式的或分布式的。

  • 网关端口:流量应匹配网关 chassis 端口。

由于浮动 IP 和路由器都可以具有 QoS 策略,并且这两个 QoS 策略都将匹配相同的流量,因此浮动 IP 策略具有更高的优先级,并且将仅匹配该策略。在具有端口策略的情况下,将首先应用虚拟机的专用端口规则。这是 QoS 规则的优先级和结果

  • 速率限制规则:如果应用了专用端口 QoS 和路由器/浮动 IP 规则,由于两者都将执行,将应用最小的速率限制值。

  • DSCP 规则:如果应用了专用端口 QoS 和路由器/浮动 IP 规则,路由器/浮动 IP DSCP 标记将应用于出口数据包。

注意

在同时具有路由器和浮动 IP QoS 策略的情况下,浮动 IP QoS 策略始终优先于路由器 QoS 策略。请参阅 [OVN] 更改浮动 IP 的 OVN QoS 规则优先级

提供 QoS 扩展的 L3 服务

下表显示了 L3 服务、支持的 QoS 扩展以及用于带宽限制的流量方向。

L3 服务、支持的扩展以及带宽限制的流量方向

L3 服务

L3 路由器

OVN L3

浮动 IP

出口 \ 入口

出口 \ 入口

网关 IP

出口 \ 入口

出口 \ 入口

下表显示了 L3 服务、支持的扩展以及用于DSCP 标记的流量方向。

L3 服务、支持的扩展以及 DSCP 标记的流量方向

L3 服务

L3 路由器

OVN L3

浮动 IP

出口

网关 IP

出口

配置

要在具有 网络架构 中描述的架构的云中启用该服务,请按照以下步骤操作

在控制器节点上

  1. 将 QoS 服务添加到 service_plugins 设置在 /etc/neutron/neutron.conf 中。例如

    service_plugins = router,metering,qos
    
  2. 可选地,在 /etc/neutron/neutron.conf 中的 [qos] 部分中设置所需的 notification_driversmessage_queue 是默认值)。

  3. 可选地,为了启用浮动 IP QoS 扩展 qos-fip,将 service_plugins 选项在 /etc/neutron/neutron.conf 中设置为包括 routerqos。例如

    service_plugins = router,qos
    
  4. /etc/neutron/plugins/ml2/ml2_conf.ini 中,将 qos 添加到 [ml2] 部分中的 extension_drivers。例如

    [ml2]
    extension_drivers = port_security,qos
    
  5. 编辑您正在使用的代理的配置文件,并将 extensions 设置为在配置文件的 [agent] 部分中包含 qos。代理配置文件将位于 /etc/neutron/plugins/ml2/<agent_name>_agent.ini 中,其中 <agent_name> 是正在使用的代理的名称(例如 openvswitch)。例如

    [agent]
    extensions = qos
    

在网络和计算节点上

  1. 编辑您正在使用的代理的配置文件,并将 extensions 设置为在配置文件的 [agent] 部分中包含 qos。代理配置文件将位于 /etc/neutron/plugins/ml2/<agent_name>_agent.ini 中,其中 <agent_name> 是正在使用的代理的名称(例如 openvswitch)。例如

    [agent]
    extensions = qos
    
  2. 可选地,对于 Neutron openvswitch 代理,在 [ovs] 部分中设置 qos_meter_bandwidth 以启用 OVS 计量带宽限制。例如

    [ovs]
    qos_meter_bandwidth = True
    
  3. 可选地,为了启用浮动 IP 的 QoS,将 extensions 选项在 [agent] 部分的 /etc/neutron/l3_agent.ini 中设置为包含 fip_qos。如果启用了 dvr,则必须对所有 L3 代理执行此操作。例如

    [agent]
    extensions = fip_qos
    

注意

自 Stein 版本以来,与 neutron 端口或端口转发关联的浮动 IP 都可以具有带宽限制。这些 neutron 服务器端和代理端扩展配置将在所有情况下启用它。

  1. 可选地,为了启用路由器网关 IP 的 QoS,将 extensions 选项在 [agent] 部分的 /etc/neutron/l3_agent.ini 中设置为包含 gateway_ip_qos。将此设置为所有 dvr_snatlegacy L3 代理。例如

    [agent]
    extensions = gateway_ip_qos
    

    并且 gateway_ip_qos 应与集中式路由器的 L3 代理中的 fip_qos 一起工作,然后所有具有绑定 QoS 策略的 L3 IP 都可以根据 QoS 带宽限制规则进行限制

    [agent]
    extensions = fip_qos, gateway_ip_qos
    
  2. 由于速率限制在 Open vSwitch 的 internal 端口上不起作用,因此可选地,作为解决方法,为了使 QoS 带宽限制适用于路由器的网关端口,将 ovs_use_veth/etc/neutron/l3_agent.ini 中的 DEFAULT 部分设置为 True

    [DEFAULT]
    ovs_use_veth = True
    

注意

QoS 当前仅与 ml2 一起工作(SR-IOV 和 Open vSwitch 是为 QoS 启用的驱动程序)。

覆盖网络的外部标头上的 DSCP 标记

在使用覆盖网络(例如 VxLAN)时,DSCP 标记规则仅应用于内部标头,并且在封装期间,DSCP 标记不会自动复制到外部标头。

  1. 为了设置外部标头的 DSCP 值,请修改 /etc/neutron/plugins/ml2/<agent_name>_agent.ini 中的 dscp 配置选项,其中 <agent_name> 是正在使用的代理的名称(例如 openvswitch

    [agent]
    dscp = 8
    
  2. 为了将内部标头的 DSCP 字段复制到外部标头,请将 /etc/neutron/plugins/ml2/<agent_name>_agent.ini 中的 dscp_inherit 配置选项更改为 true,其中 <agent_name> 是正在使用的代理的名称(例如 openvswitch

    [agent]
    dscp_inherit = true
    

    如果将 dscp_inherit 选项设置为 true,则将覆盖以前的 dscp 选项。

受信任项目 policy.yaml 配置

如果您的云中的项目被信任以管理他们自己的 QoS 策略,则可以修改 neutron 的文件 policy.yaml 以允许这样做。

修改 /etc/neutron/policy.yaml 策略条目如下

"get_policy": "rule:regular_user"
"create_policy": "rule:regular_user"
"update_policy": "rule:regular_user"
"delete_policy": "rule:regular_user"
"get_rule_type": "rule:regular_user"

要启用带宽限制规则

"get_policy_bandwidth_limit_rule": "rule:regular_user"
"create_policy_bandwidth_limit_rule": "rule:regular_user"
"delete_policy_bandwidth_limit_rule": "rule:regular_user"
"update_policy_bandwidth_limit_rule": "rule:regular_user"

要启用 DSCP 标记规则

"get_policy_dscp_marking_rule": "rule:regular_user"
"create_policy_dscp_marking_rule": "rule:regular_user"
"delete_policy_dscp_marking_rule": "rule:regular_user"
"update_policy_dscp_marking_rule": "rule:regular_user"

要启用最小带宽规则

"get_policy_minimum_bandwidth_rule": "rule:regular_user"
"create_policy_minimum_bandwidth_rule": "rule:regular_user"
"delete_policy_minimum_bandwidth_rule": "rule:regular_user"
"update_policy_minimum_bandwidth_rule": "rule:regular_user"

要启用最小包速率规则

"get_policy_minimum_packet_rate_rule": "rule:regular_user"
"create_policy_minimum_packet_rate_rule": "rule:regular_user"
"delete_policy_minimum_packet_rate_rule": "rule:regular_user"
"update_policy_minimum_packet_rate_rule": "rule:regular_user"

用户流程

QoS 策略仅由使用默认 policy.yaml 的管理员创建。因此,您应该让云运营商代表云项目设置它们。

如果项目被信任以创建他们自己的策略,请检查受信任项目的 policy.yaml 配置部分。

首先,创建一个 QoS 策略及其带宽限制规则

$ openstack network qos policy create bw-limiter
+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| description       |                                      |
| id                | 5df855e9-a833-49a3-9c82-c0839a5f103f |
| is_default        | False                                |
| name              | bw-limiter                           |
| project_id        | 4db7c1ed114a4a7fb0f077148155c500     |
| rules             | []                                   |
| shared            | False                                |
+-------------------+--------------------------------------+


$ openstack network qos rule create --type bandwidth-limit --max-kbps 3000 \
    --max-burst-kbits 2400 --egress bw-limiter
+----------------+--------------------------------------+
| Field          | Value                                |
+----------------+--------------------------------------+
| direction      | egress                               |
| id             | 92ceb52f-170f-49d0-9528-976e2fee2d6f |
| max_burst_kbps | 2400                                 |
| max_kbps       | 3000                                 |
| name           | None                                 |
| project_id     |                                      |
+----------------+--------------------------------------+

注意

QoS 实现需要一个突发值,以确保 Open vSwitch 代理中带宽限制规则的正常行为。配置正确的突发值非常重要。如果突发值设置得太低,即使带宽限制设置正确,带宽使用也会受到限制。这个问题在各种文档资料中都有讨论,例如在 Juniper 的文档 中。对于 TCP 流量,建议将突发值设置为所需带宽限制值的 80%。例如,如果带宽限制设置为 1000kbps,那么足够的突发值将是 800kbit。如果配置的突发值太低,实际带宽限制将低于预期。如果配置的突发值太高,受限的数据包可能太少,实际带宽限制将高于预期。如果您没有提供值,它将默认设置为带宽限制的 80%,这适用于典型的 TCP 流量。

其次,将创建的策略与现有的 neutron 端口关联。为此,用户提取要关联到已创建策略的端口 ID。在下一个示例中,我们将把 bw-limiter 策略分配给 IP 地址为 192.0.2.1 的 VM。

$ 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

为了从 QoS 策略中分离一个端口,只需再次更新端口配置即可。

$ openstack port unset --qos-policy 88101e57-76fa-4d12-b0e0-4fc7634b874a

端口也可以在创建时附加策略。

$ openstack port create --qos-policy bw-limiter --network private port1
+-----------------------+--------------------------------------------------+
| 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                             |
| data_plane_status     | None                                             |
| 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                                             |
| tags                  | []                                               |
| trunk_details         | None                                             |
| updated_at            | 2017-05-15T08:43:00Z                             |
+-----------------------+--------------------------------------------------+

您可以将网络附加到 QoS 策略。这意味着连接到网络的任何计算端口默认将使用网络策略,除非端口附加了特定的策略。属于内部网络的端口,例如 DHCP 和内部路由器端口,不应用网络策略。

为了将 QoS 策略附加到网络,请更新现有的网络,或在创建网络时将其附加到策略。

$ openstack network set --qos-policy bw-limiter private

创建的策略可以与现有的浮动 IP 关联。为此,用户提取要关联到已创建策略的浮动 IP ID。在下一个示例中,我们将把 bw-limiter 策略分配给浮动 IP 地址 172.16.100.18

$ openstack floating ip list
+--------------------------------------+---------------------+------------------+------+-----+
| ID                                   | Floating IP Address | Fixed IP Address | Port | ... |
+--------------------------------------+---------------------+------------------+------+-----+
| 1163d127-6df3-44bb-b69c-c0e916303eb3 | 172.16.100.9        | None             | None | ... |
| d0ed7491-3eb7-4c4f-a0f0-df04f10a067c | 172.16.100.18       | None             | None | ... |
| f5a9ed48-2e9f-411c-8787-2b6ecd640090 | 172.16.100.2        | None             | None | ... |
+--------------------------------------+---------------------+------------------+------+-----+
$ openstack floating ip set --qos-policy bw-limiter d0ed7491-3eb7-4c4f-a0f0-df04f10a067c

为了从 QoS 策略中分离一个浮动 IP,只需更新浮动 IP 配置即可。

$ openstack floating ip set --no-qos-policy d0ed7491-3eb7-4c4f-a0f0-df04f10a067c

或者使用 unset 操作。

$ openstack floating ip unset --qos-policy d0ed7491-3eb7-4c4f-a0f0-df04f10a067c

浮动 IP 也可以在创建时附加策略。

$ openstack floating ip create --qos-policy bw-limiter public
+---------------------+--------------------------------------+
| Field               | Value                                |
+---------------------+--------------------------------------+
| created_at          | 2017-12-06T02:12:09Z                 |
| description         |                                      |
| fixed_ip_address    | None                                 |
| floating_ip_address | 172.16.100.12                        |
| floating_network_id | 4065eb05-cccb-4048-988c-e8c5480a746f |
| id                  | 6a0efeef-462b-4312-b4ad-627cde8a20e6 |
| name                | 172.16.100.12                        |
| port_id             | None                                 |
| project_id          | 916e39e8be52433ba040da3a3a6d0847     |
| qos_policy_id       | 5df855e9-a833-49a3-9c82-c0839a5f103f |
| revision_number     | 1                                    |
| router_id           | None                                 |
| status              | DOWN                                 |
| updated_at          | 2017-12-06T02:12:09Z                 |
+---------------------+--------------------------------------+

附加到浮动 IP 的 QoS 带宽限制规则在您将后者与端口关联时生效。例如,要将先前创建的浮动 IP 172.16.100.12 关联到 UUID 为 a7f25e73-4288-4a16-93b9-b71e6fd00862、固定 IP 为 192.168.222.5 的实例端口。

$ openstack floating ip set --port a7f25e73-4288-4a16-93b9-b71e6fd00862 \
    0eeb1f8a-de96-4cd9-a0f6-3f535c409558

注意

附加到浮动 IP 的 QoS 策略不应用于端口,它仅应用于关联的浮动 IP。因此,附加到浮动 IP 的 QoS 策略的 ID 在将浮动 IP 关联到端口后,在端口的 qos_policy_id 字段中不可见。它仅在浮动 IP 属性中可见。

注意

目前,L3 代理浮动 IP QoS 扩展仅支持 bandwidth_limit 规则。其他规则类型(如 DSCP 标记)对于浮动 IP 将被静默忽略。不包含任何 bandwidth_limit 规则的 QoS 策略在附加到浮动 IP 时将没有任何效果。

如果浮动 IP 绑定到端口,并且两者都绑定了 QoS 带宽规则,则 L3 代理浮动 IP QoS 扩展会忽略端口 QoS 的行为,并在路由器命名空间中的适当设备上安装与浮动 IP 关联的 QoS 策略中的规则。

每个项目最多可以有一个默认 QoS 策略,虽然这不是强制性的。如果定义了默认 QoS 策略,则在此项目内创建的所有新网络都将分配此策略,除非在创建过程中显式附加了其他 QoS 策略。如果取消设置默认 QoS 策略,则不会对现有网络进行任何更改。

为了将 QoS 策略设置为默认值,必须使用参数 --default。要取消将此 QoS 策略设置为默认值,必须使用参数 --no-default

$ openstack network qos policy create --default bw-limiter
+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| description       |                                      |
| id                | 5df855e9-a833-49a3-9c82-c0839a5f103f |
| is_default        | True                                 |
| name              | bw-limiter                           |
| project_id        | 4db7c1ed114a4a7fb0f077148155c500     |
| rules             | []                                   |
| shared            | False                                |
+-------------------+--------------------------------------+

$ openstack network qos policy set --no-default bw-limiter
+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| description       |                                      |
| id                | 5df855e9-a833-49a3-9c82-c0839a5f103f |
| is_default        | False                                |
| name              | bw-limiter                           |
| project_id        | 4db7c1ed114a4a7fb0f077148155c500     |
| rules             | []                                   |
| shared            | False                                |
+-------------------+--------------------------------------+

创建具有数据包速率限制规则的 QoS 策略

$ openstack network qos policy create pps-limiter
+-------------+--------------------------------------+
| Field       | Value                                |
+-------------+--------------------------------------+
| description |                                      |
| id          | 97f0ac37-7dd6-4579-8359-3bef0751a505 |
| is_default  | False                                |
| name        | pps-limiter                          |
| project_id  | 1d70739f831b421fb38a27adb368fc17     |
| rules       | []                                   |
| shared      | False                                |
| tags        | []                                   |
+-------------+--------------------------------------+

$ openstack network qos rule create --max-kpps 1000 --max-burst-kpps 100 --ingress --type packet-rate-limit pps-limiter
+----------------+--------------------------------------+
| Field          | Value                                |
+----------------+--------------------------------------+
| direction      | ingress                              |
| id             | 4a1cb166-9661-48d7-bddb-00b7d75846cd |
| max_burst_kpps | 100                                  |
| max_kpps       | 1000                                 |
| name           | None                                 |
| project_id     |                                      |
+----------------+--------------------------------------+

$ openstack network qos rule create --max-kpps 1000 --max-burst-kpps 100 --egress --type packet-rate-limit pps-limiter
+----------------+--------------------------------------+
| Field          | Value                                |
+----------------+--------------------------------------+
| direction      | egress                               |
| id             | 6abd67f7-0bde-4ad3-ac54-b0a6103b0449 |
| max_burst_kpps | 100                                  |
| max_kpps       | 1000                                 |
| name           | None                                 |
| project_id     |                                      |
+----------------+--------------------------------------+

注意

速率和突发的单位是千(1000)个数据包每秒。

现在将数据包速率限制 QoS 策略应用于端口

$ openstack port set --qos-policy pps-limiter 251948bd-08e4-4569-a47f-ecbc1fd4af4d

注意

数据包速率限制仅受 ml2 ovs 驱动程序支持。它利用 ovs 内核数据路径或用户空间 ovs dpdk 数据路径的计量操作。只有当数据路径处于用户模式或内核版本 >= 4.15 的 ovs 内核数据路径时,才支持计量操作。

管理员强制执行

管理员能够对项目端口或网络强制执行策略。只要策略未共享,项目就无法分离附加到网络或端口的任何策略。

如果策略是共享的,项目可以将其附加或分离到自己的端口和网络。

规则修改

您可以在运行时修改规则。规则修改将传播到任何附加的端口。

$ openstack network qos rule set --max-kbps 2000 --max-burst-kbits 1600 \
    --ingress bw-limiter 92ceb52f-170f-49d0-9528-976e2fee2d6f

$ openstack network qos rule show \
    bw-limiter 92ceb52f-170f-49d0-9528-976e2fee2d6f
+----------------+--------------------------------------+
| Field          | Value                                |
+----------------+--------------------------------------+
| direction      | ingress                              |
| id             | 92ceb52f-170f-49d0-9528-976e2fee2d6f |
| max_burst_kbps | 1600                                 |
| max_kbps       | 2000                                 |
| name           | None                                 |
| project_id     |                                      |
+----------------+--------------------------------------+

就像带宽限制一样,为 DSCP 标记规则创建策略

$ openstack network qos policy create dscp-marking
+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| description       |                                      |
| id                | d1f90c76-fbe8-4d6f-bb87-a9aea997ed1e |
| is_default        | False                                |
| name              | dscp-marking                         |
| project_id        | 4db7c1ed114a4a7fb0f077148155c500     |
| rules             | []                                   |
| shared            | False                                |
+-------------------+--------------------------------------+

您可以使用 neutron 客户端创建、更新、列出、删除和显示 DSCP 标记

$ openstack network qos rule create --type dscp-marking --dscp-mark 26 \
    dscp-marking
+----------------+--------------------------------------+
| Field          | Value                                |
+----------------+--------------------------------------+
| dscp_mark      | 26                                   |
| id             | 115e4f70-8034-4176-8fe9-2c47f8878a7d |
| name           | None                                 |
| project_id     |                                      |
+----------------+--------------------------------------+
$ openstack network qos rule set --dscp-mark 22 \
    dscp-marking 115e4f70-8034-4176-8fe9-2c47f8878a7d

$ openstack network qos rule list dscp-marking
+--------------------------------------+----------------------------------+
| ID                                   | DSCP Mark                        |
+--------------------------------------+----------------------------------+
| 115e4f70-8034-4176-8fe9-2c47f8878a7d | 22                               |
+--------------------------------------+----------------------------------+

$ openstack network qos rule show \
    dscp-marking 115e4f70-8034-4176-8fe9-2c47f8878a7d
+----------------+--------------------------------------+
| Field          | Value                                |
+----------------+--------------------------------------+
| dscp_mark      | 22                                   |
| id             | 115e4f70-8034-4176-8fe9-2c47f8878a7d |
| name           | None                                 |
| project_id     |                                      |
+----------------+--------------------------------------+

$ openstack network qos rule delete \
    dscp-marking 115e4f70-8034-4176-8fe9-2c47f8878a7d

您还可以在策略中包含最小带宽规则

$ openstack network qos policy create bandwidth-control
+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| description       |                                      |
| id                | 8491547e-add1-4c6c-a50e-42121237256c |
| is_default        | False                                |
| name              | bandwidth-control                    |
| project_id        | 7cc5a84e415d48e69d2b06aa67b317d8     |
| revision_number   | 1                                    |
| rules             | []                                   |
| shared            | False                                |
+-------------------+--------------------------------------+

$ openstack network qos rule create \
  --type minimum-bandwidth --min-kbps 1000 --egress bandwidth-control
+------------+--------------------------------------+
| Field      | Value                                |
+------------+--------------------------------------+
| direction  | egress                               |
| id         | da858b32-44bc-43c9-b92b-cf6e2fa836ab |
| min_kbps   | 1000                                 |
| name       | None                                 |
| project_id |                                      |
+------------+--------------------------------------+

具有最小带宽的策略可确保尽最大努力为应用于规则的每个端口提供不低于指定带宽。但是,由于此功能尚未与计算调度程序集成,因此无法保证最小带宽。

只要每条规则的类型或方向不同,就可以将多个规则组合在一个策略中。例如,您可以指定两个 bandwidth-limit 规则,一个方向为 egress,一个方向为 ingress

$ openstack network qos rule create --type bandwidth-limit \
    --max-kbps 50000 --max-burst-kbits 50000 --egress bandwidth-control
+----------------+--------------------------------------+
| Field          | Value                                |
+----------------+--------------------------------------+
| direction      | egress                               |
| id             | 0db48906-a762-4d32-8694-3f65214c34a6 |
| max_burst_kbps | 50000                                |
| max_kbps       | 50000                                |
| name           | None                                 |
| project_id     |                                      |
+----------------+--------------------------------------+

$ openstack network qos rule create --type bandwidth-limit \
    --max-kbps 10000 --max-burst-kbits 10000 --ingress bandwidth-control
+----------------+--------------------------------------+
| Field          | Value                                |
+----------------+--------------------------------------+
| direction      | ingress                              |
| id             | faabef24-e23a-4fdf-8e92-f8cb66998834 |
| max_burst_kbps | 10000                                |
| max_kbps       | 10000                                |
| name           | None                                 |
| project_id     |                                      |
+----------------+--------------------------------------+

$ openstack network qos rule create --type minimum-bandwidth \
    --min-kbps 1000 --egress bandwidth-control
+------------+--------------------------------------+
| Field      | Value                                |
+------------+--------------------------------------+
| direction  | egress                               |
| id         | da858b32-44bc-43c9-b92b-cf6e2fa836ab |
| min_kbps   | 1000                                 |
| name       | None                                 |
| project_id |                                      |
+------------+--------------------------------------+

$ openstack network qos policy show bandwidth-control
+-------------------+-------------------------------------------------------------------+
| Field             | Value                                                             |
+-------------------+-------------------------------------------------------------------+
| description       |                                                                   |
| id                | 8491547e-add1-4c6c-a50e-42121237256c                              |
| is_default        | False                                                             |
| name              | bandwidth-control                                                 |
| project_id        | 7cc5a84e415d48e69d2b06aa67b317d8                                  |
| revision_number   | 4                                                                 |
| rules             | [{u'max_kbps': 50000, u'direction': u'egress',                    |
|                   |   u'type': u'bandwidth_limit',                                    |
|                   |   u'id': u'0db48906-a762-4d32-8694-3f65214c34a6',                 |
|                   |   u'max_burst_kbps': 50000,                                       |
|                   |   u'qos_policy_id': u'8491547e-add1-4c6c-a50e-42121237256c'},     |
|                   | [{u'max_kbps': 10000, u'direction': u'ingress',                   |
|                   |   u'type': u'bandwidth_limit',                                    |
|                   |   u'id': u'faabef24-e23a-4fdf-8e92-f8cb66998834',                 |
|                   |   u'max_burst_kbps': 10000,                                       |
|                   |   u'qos_policy_id': u'8491547e-add1-4c6c-a50e-42121237256c'},     |
|                   |  {u'direction':                                                   |
|                   |   u'egress', u'min_kbps': 1000, u'type': u'minimum_bandwidth',    |
|                   |   u'id': u'da858b32-44bc-43c9-b92b-cf6e2fa836ab',                 |
|                   |   u'qos_policy_id': u'8491547e-add1-4c6c-a50e-42121237256c'}]     |
| shared            | False                                                             |
+-------------------+-------------------------------------------------------------------+