QoS は、帯域、遅延、ジッター、信頼性などのある種のネットワーク要件を保証する機能で、アプリケーションプロバイダーとユーザー間のサービスレベル合意 (SLA) を満たすために使用されます。
スイッチやルーターといったネットワークデバイスはトラフィックにマークを付けることができ、そららを高優先度として扱うことで、 SLA において合意された QoS 条件を達成します。他の例としては、 Voice over IP (VoIP) やビデオストリーミングなどのネットワークトラフィックを最小限の帯域制約で転送するために QoS が必要です。ネットワーク QoS 管理のないシステムでは、すべてのトラフィックは「ベストエフォート」で転送され、顧客へのサービス提供を保証することが困難になります。
QoS はサービスプラグインです。 QoS は OpenStack Networking の他のコードから様々なレベルで疎結合になっており、ML2 extension ドライバー経由で利用可能になっています。
Details about the DB models, API extension, and use cases are out of the scope of this guide but can be found in the Neutron QoS specification.
プラグインや ML2 メカニズムドライバーは、対応している QoS ルール種別を、 supported_qos_rule_types
という名前のプロパティーを設定することで宣言できます。 supported_qos_rule_types
は QoS ルール種別 を指定します。
注釈
Bandwidth limit is supported on OVS, Linux bridge, and SR-IOV mechanism drivers. For the Newton release onward DSCP marking is supported on the OVS and Linux bridge mechanism drivers, and the minimum bandwidth rules on the SR-IOV NIC mechanism driver.
最も簡単な場合では、プロパティーはクラス内で単純な Python リストで定義されています。
ML2 プラグインの場合、サポートされる QoS ルール種別のリストは、有効になっている全メカニズムドライバーでサポートされているルールの共通のサブセットになります。
注釈
コアプラグインが返すサポートされているルール種別のリストは、 QoS ルールリソースにアクセスする際には適用されません。このようになっているのは、ML2 ドライバーのうち 1 つでも QoS をサポートしていないものがあると、ルールを作れなくなってしまうのが大きな理由です (執筆時点では macvtap ドライバーだけが QoS をサポートしていません)。
このサービスを有効にするには、以下の手順を行います。
ネットワークノード:
/etc/neutron/neutron.conf
の service_plugins
設定に QoS サービスを追加します。例:
service_plugins = \
neutron.services.l3_router.l3_router_plugin.L3RouterPlugin,
neutron.services.metering.metering_plugin.MeteringPlugin,
neutron.services.qos.qos_plugin.QoSPlugin
必要であれば、 /etc/neutron/neutron.conf
の [qos]
セクションで必要な notification_drivers
を設定してください (デフォルト値は message_queue
です)。
/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]
セクションで extensions
に qos
を設定します。
[agent]
extensions = qos
コンピュートノード:
/etc/neutron/plugins/ml2/openvswitch_agent.ini
で、 [agent]
セクションの extensions
設定に qos
を追加します。例:
[agent]
extensions = qos
注釈
現時点では QoS は ML2 でのみ動作します (Mitaka リリースでは QoS が有効なドライバーは SR-IOV、 Open vSwitch、 Linux ブリッジです)。
プロジェクトが信頼でき、クラウドでプロジェクトが自身の 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_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_dscp_marking_rule": "rule:regular_user",
"delete_dscp_marking_rule": "rule:regular_user",
"update_dscp_marking_rule": "rule:regular_user",
To enable minimum bandwidth rule:
"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",
デフォルトの policy.json
では管理者だけが QoS ポリシーを作成できます。そのため、クラウドオペレーターはクラウドのプロジェクトのために QoS ポリシーを作成する必要があります。
プロジェクトが信頼でき、自身のポリシーを作成してもよい場合には、「プロジェクトを信頼する場合の 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 |
+----------------+--------------------------------------+
注釈
バースト値はキロビットで指定します。パラメーターから連想されるようなキロビット/秒ではありません。この値は帯域制限が適用されるまでに送信できるデータ量です。
注釈
QoS 実装では、 Open vSwitch エージェントや Linux ブリッジエージェントで帯域制限ルールが適切に動作するためには、適切なバースト値が必要です。値を指定しなかった場合、デフォルト値は帯域制限の 80% になり、この値は通常の TCP トラフィックでは適切な値です。
Second, associate the created policy with an existing neutron port.
In order to do this, user extracts the port id to be associated to
the already created policy. In the next example, we will assign the
bw-limiter
policy to the VM with IP address 192.0.2.1
.
$ neutron port-list
+--------------------------------------+-----------------------------------+
| id | fixed_ips |
+--------------------------------------+-----------------------------------+
| 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"}|
+--------------------------------------+-----------------------------------+
$ 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
ポート作成時に QoS ポリシーを関連付けることもできます。
$ 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-192-0-2-4", ... } |
| dns_name | |
| fixed_ips | {"subnet_id": |
| | "fabaf9b6-7a84-43b6-9d23-543591b531b8", |
| | "ip_address": "192.0.2.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-list dscp-marking
+--------------------------------------+----------------------------------+
| id | dscp_mark |
+--------------------------------------+----------------------------------+
| 115e4f70-8034-4176-8fe9-2c47f8878a7d | 22 |
+--------------------------------------+----------------------------------+
$ 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
You can also include minimum bandwidth rules in your policy:
$ openstack network qos policy create bandwidth-control
+-------------+--------------------------------------+
| Field | Value |
+-------------+--------------------------------------+
| description | |
| id | 8491547e-add1-4c6c-a50e-42121237256c |
| name | bandwidth-control |
| project_id | 7cc5a84e415d48e69d2b06aa67b317d8 |
| rules | [] |
| shared | False |
+-------------+--------------------------------------+
$ openstack network qos rule create bandwidth-control \
--type minimum-bandwidth --min-kbps 1000 --egress
+------------+--------------------------------------+
| Field | Value |
+------------+--------------------------------------+
| direction | egress |
| id | da858b32-44bc-43c9-b92b-cf6e2fa836ab |
| min_kbps | 1000 |
| name | None |
| project_id | |
+------------+--------------------------------------+
A policy with a minimum bandwidth ensures best efforts are made to provide no less than the specified bandwidth to each port on which the rule is applied. However, as this feature is not yet integrated with the Compute scheduler, minimum bandwidth cannot be guaranteed.
It is also possible to combine several rules in one policy:
$ openstack network qos rule create bandwidth-control \
--type bandwidth-limit --max-kbps 50000 --max-burst-kbits 50000
+----------------+--------------------------------------+
| Field | Value |
+----------------+--------------------------------------+
| id | 0db48906-a762-4d32-8694-3f65214c34a6 |
| max_burst_kbps | 50000 |
| max_kbps | 50000 |
| name | None |
| project_id | |
+----------------+--------------------------------------+
$ openstack network qos policy show bandwidth-control
+-------------+-------------------------------------------------------------------+
| Field | Value |
+-------------+-------------------------------------------------------------------+
| description | |
| id | 8491547e-add1-4c6c-a50e-42121237256c |
| name | bandwidth-control |
| project_id | 7cc5a84e415d48e69d2b06aa67b317d8 |
| rules | [{u'max_kbps': 50000, 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'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 |
+-------------+-------------------------------------------------------------------+
Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.