このページでは、OpenStack Networking の “Quality of Service” (QoS) 機能を使用するにはどうすればよいかの手順書として利用できます。
QoS は、帯域、遅延、ジッター、信頼性などのある種のネットワーク要件を保証する機能で、アプリケーションプロバイダーとユーザー間のサービスレベル合意 (SLA) を満たすために使用されます。
スイッチやルーターといったネットワークデバイスはトラフィックにマークを付けることができ、そららを高優先度として扱うことで、 SLA において合意された QoS 条件を達成します。他の例としては、 Voice over IP (VoIP) やビデオストリーミングなどのネットワークトラフィックを最小限の帯域制約で転送するために QoS が必要です。ネットワーク QoS 管理のないシステムでは、すべてのトラフィックは「ベストエフォート」で転送され、顧客へのサービス提供を保証することが困難になります。
QoS はサービスプラグインです。 QoS は Neutron の他のコードから様々なレベルで疎結合になっており、ML2 extension ドライバー経由で利用可能になっています。
DB モデル、 API 拡張、ユースケースなどの詳細はこのガイドの範疇を超えますが、 Neutron QoS specification に情報があります。
プラグインや ML2 メカニズムドライバーは、対応している QoS ルール種別を、 supported_qos_rule_types という名前のプロパティーを設定することで宣言できます。 supported_qos_rule_types は QoS ルール種別 を指定します。
注釈
Liberty リリース時点では、出力トラフィックの帯域制限ルールだけがサポートされています。
最も簡単な場合では、プロパティーはクラス内で単純な Python リストで定義されています。
ML2 プラグインの場合、サポートされる QoS ルール種別のリストは、有効になっている全メカニズムドライバーでサポートされているルールの共通のサブセットになります。
注釈
コアプラグインが返すサポートされているルール種別のリストは、 QoS ルールリソースにアクセスする際には適用されません。このようになっているのは、ML2 ドライバーのうち 1 つでも QoS をサポートしていないものがあると、ルールを作れなくなってしまうのが大きな理由です (執筆時点では Linux ブリッジドライバーは QoS をサポートしていません)。
このサービスを有効にするには、以下の手順を行います。
サーバー側:
service_plugins で qos サービスを有効にします。
[qos] セクションで必要な notification_drivers を設定します (message_queue がデフォルトです)。
ML2 プラグインの場合、 [ml2] セクションで extension_drivers に ‘qos’ を追加します。
エージェント (OVS) 側:
[agent] セクションで extensions に ‘qos’ を追加します。
注釈
QoS は現在のところ ML2 だけで動作します (Liberty リリースで QoS を有効にできるドライバーは SR-IOV と Open vSwitch だけです)。
テナントが信頼でき、クラウドでテナントが自身の 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:regular_user",
"delete_policy_bandwidth_limit_rule": "rule:regular_user",
"update_policy_bandwidth_limit_rule": "rule:regular_user",
"get_rule_type": "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 |
+----------------+--------------------------------------+
次に、作成したポリシーを存在する neutron ポートに関連付けます。このためには、ユーザーは作成済みのポリシーを関連付けるポートの ID を取得する必要があります。以下の例では、 bw-limiter ポリシーを IP アドレス 10.0.0.3 の VM に割り当てています。
$ 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
ポート作成時に 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-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
管理者は、テナントのポートやネットワークにポリシーを強制的に適用することができます。ポリシーが共有されていない限り、テナントは、ネットワークやポートに付与されたポリシーを解除することはできません。
ポリシーが共有されている場合、テナントは自分のポートやネットワークに共有ポリシーを付与したり解除したりできます。
実行中にルールを変更できます。ルールの変更はすべての関連ポートに反映されます。
$ neutron qos-bandwidth-limit-rule-update \
a49f02fe-6ab5-4cd2-8a68-f4589f58a010 bw-limiter \
--max-kbps 2000 --max-burst-kbps 200
Updated bandwidth_limit_rule: a49f02fe-6ab5-4cd2-8a68-f4589f58a010
$ neutron qos-bandwidth-limit-rule-show \
a49f02fe-6ab5-4cd2-8a68-f4589f58a010 bw-limiter
+----------------+--------------------------------------+
| Field | Value |
+----------------+--------------------------------------+
| id | a49f02fe-6ab5-4cd2-8a68-f4589f58a010 |
| max_burst_kbps | 200 |
| max_kbps | 2000 |
+----------------+--------------------------------------+
Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.