サブネットプール

サブネットプール

サブネットプールは Kilo リリース以降で利用可能です。これは簡単な機能ですが、Networking サービス利用時のワークフローが大きくよくなる可能性があります。また、 OpenStack Networking に新しい他の機能を作り込む際の基本的な部品としても使われます。

お使いのクラウドでこの機能が利用可能かを確認するには、対応している API 拡張のエイリアスの一覧に含まれているかを確認します。 neutron クライアントの場合は以下のようにします。

$ neutron ext-list | grep subnet_allocation
| subnet_allocation | Subnet Allocation |

なぜ必要か?

Kilo より前では、 Networking にはサブネット作成時に使用するアドレスを自動的に割り当てる方法がありませんでした。サブネットを作るためには、自分のアドレスをシステムの助けなしに指定する必要がありました。この方法が意味のあるユースケースもありますが、以下のあげるような機能が求められる場合には、サブネットプールは役にたつことでしょう。

まず、あなたが使用するアドレスプールを Neutron の管理に任せてしまうと、いいとは思いませんか?サブネットを作る必要がある際に、プールからアドレスを割り当ててもらうように依頼するだけです。どのアドレスプールをすでに使用しているか、どのアドレスがあなたが使用できるアドレスプールに含まれているか、といったことを気にかける必要はありません。サブネットプールがこうしたことをやってくれます。

2 つめとして、サブネットプールはプロジェクトにまたがってアドレスを管理できます。アドレスは重複しないことが保証されます。アドレスが外部から到達可能なプールから割り当てられた場合、すべてのプロジェクトが 外部から到達可能 で一意なアドレスを持つことになります。この機能は以下のシナリオで有用です。

  1. OpenStack Networking の IPv6 では IPv6 Floating IP はサポートされていません。

  2. 外部ネットワークからプロジェクトネットワークへの直接のルーティング。

どのように動作するか?

サブネットプールはアドレスのプールを管理し、そこからサブネットを割り当てできます。同じサブネットプールから割り当てられた任意のサブネット間で重複がないことが保証されます。

OpenStack クラウドの通常プロジェクトは、自分用のサブネットプールを作成し、これを使って自分用のアドレスプールを管理できます。これを行うのに、管理者権限は全く不要です。あなたのプールは他のプロジェクトには一切見えません。

管理者の場合、任意の通常プロジェクトが利用可能なプールを作成できます。共有リソースの場合には、クォータ機構を使って利用を調停します。

クォータ

サブネットプールには、 Neutron の他のクォータとは少し違ったクォータ機構があります。 Neutron の他のクォータは、あるオブジェクトの個々のインスタンス数を数え、クォータと比較します。ルーター、ネットワーク、ポートなどを作成する度に、自分のクォータから 1 つ消費されます。

サブネットの場合、リソースは IP アドレス空間です。あるサブネットが他のサブネットよりも多くのアドレス空間を持つ場合もあります。例えば、 203.0.113.0/24 は 1 つのサブネットで 256 個のアドレスを使用しますが、 198.51.100.224/28 は 16 個のアドレスしか使用しません。アドレス空間が限られている場合、クォータ機構によりアドレス空間の効率的な利用が可能になります。

IPv4 の場合、 default_quota を使って、あるプロジェクトがプールから取得できるアドレスの絶対数を設定できます。例えば、クォータが 128 の場合、 203.0.113.128/26 と 203.0.113.224/28 を確保し、将来さらに 48 個のアドレスを確保することができます。

IPv6 の場合は少し違います。この場合、 1 つ 1 つのアドレスを数えるのは現実的ではありません。途方もなく大きな数字になるのを避けるため、クォータは割り当て可能な /64 サブネットの数で表現されます。例えば、 default_quota が 3 の場合、 2001:db8:c18e:c05a::/64 と 2001:db8:221c:8ef3::/64 を確保し、将来さらにこの /64 のプレフィックスをもう 1 つ確保することができます。

デフォルトサブネットプール

Mitaka リリースから、デフォルトのサブネットプールを指定できるようになりました。この機能は新しい機能拡張により提供されます。

$ neutron ext-list | grep default-subnetpools
| default-subnetpools | Default Subnetpools |

管理者は、サブネットプールにデフォルトであるというマークをつけることができます。各アドレスファミリーにつき 1 つのプールをデフォルトとして指定できます。

$ neutron subnetpool-update --is-default True 74348864-f8bf-4fc0-ab03-81229d189467
Updated subnetpool: 74348864-f8bf-4fc0-ab03-81229d189467

デフォルトのサブネットプールがある場合は、 --subnetpool SUBNETPOOL の代わりに --use-default-subnetpool を使ってアドレスを確保することもできます。

デモ

Kilo 以降の Neutron を使った OpenStack を使用できるのであれば、この機能をすぐに使うことができます。やってみましょう。以下のコマンドはすべて IPv6 アドレスでも同じように動きます。

まず、管理者で、共有サブネットプールを作成します。

admin> neutron subnetpool-create --shared --pool-prefix 203.0.113.0/24 \
           --default-prefixlen 26 demo-subnetpool4
Created a new subnetpool:
+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| default_prefixlen | 26                                   |
| default_quota     |                                      |
| id                | 670eb517-4fd3-4dfc-9bed-da2f99f85c7a |
| ip_version        | 4                                    |
| name              | demo-subnetpool4                     |
| prefixes          | 203.0.113.0/24                       |
| shared            | True                                 |
| tenant_id         | c597484841ff4a8785804c62ba81449b     |
+-------------------+--------------------------------------+

default_prefixlen は、サブネット作成時に --prefixlen が指定されなかった場合に割り当てるサブネットのサイズを定義します。

IPv6 についても全く同じことを行うと、 2 つのサブネットプールができます。これらのサブネットプールは通常のプロジェクトから参照できます (この出力は見やすくするため少し省略しています)。

$ neutron subnetpool-list
+---------+------------------+------------------------------------+-------------------+
| id      | name             | prefixes                           | default_prefixlen |
+---------+------------------+------------------------------------+-------------------+
| 670e... | demo-subnetpool4 | [u'203.0.113.0/24']                | 26                |
| 7b69... | demo-subnetpool  | [u'2001:db8:1:2', u'2001:db8:1:2'] | 64                |
+---------+------------------+------------------------------------+-------------------+

このサブネットプールを使ってみましょう。プールからサブネットを作るのは簡単です。

$ neutron subnet-create --name demo-subnet1 --ip_version 4 \
      --subnetpool demo-subnetpool4 demo-network1
+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| id                | 6e38b23f-0b27-4e3c-8e69-fd23a3df1935 |
| ip_version        | 4                                    |
| cidr              | 203.0.113.0/26                       |
| name              | demo-subnet1                         |
| network_id        | b5b729d8-31cc-4d2c-8284-72b3291fec02 |
| subnetpool_id     | 670eb517-4fd3-4dfc-9bed-da2f99f85c7a |
| tenant_id         | a8b3054cc1214f18b1186b291525650f     |
+-------------------+--------------------------------------+

プールから特定のサブネットを割り当てることもできます。プールのプレフィックス内に収まるサブネットを指定する必要があります。サブネットがまだ割り当てられていなければ、要求は成功します。サブネットプールから IP バージョンは推定できるので、 IP バージョンの指定は省略できます。

$ neutron subnet-create --name demo-subnet2 \
      --subnetpool demo-subnetpool4 demo-network1 203.0.113.128/26
Created a new subnet:
+-------------------+----------------------------------------------------+
| Field             | Value                                              |
+-------------------+----------------------------------------------------+
| id                | b15db708-ce90-4ce3-8852-52e1779bae1f               |
| ip_version        | 4                                                  |
| cidr              | 203.0.113.128/26                                   |
| name              | demo-subnet2                                       |
| network_id        | 8d16c25d-690c-4414-a0c8-afbe698a1e73               |
| subnetpool_id     | 499b768b-0f8f-4762-8748-792e7e00face               |
| tenant_id         | a8b3054cc1214f18b1186b291525650f                   |
+-------------------+----------------------------------------------------+

プールを使い切った場合は、プレフィックスを追加します。

admin> neutron subnetpool-update --pool-prefix 203.0.113.0/24 \
           --pool-prefix 198.51.100.0/24 demo-subnetpool4
Updated subnetpool: demo-subnetpool4
admin> neutron subnetpool-show demo-subnetpool4
+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| default_prefixlen | 26                                   |
| default_quota     |                                      |
| id                | 670eb517-4fd3-4dfc-9bed-da2f99f85c7a |
| ip_version        | 4                                    |
| name              | demo-subnetpool4                     |
| prefixes          | 198.51.100.0/24                      |
|                   | 203.0.113.0/24                       |
| shared            | True                                 |
| tenant_id         | c597484841ff4a8785804c62ba81449b     |
+-------------------+--------------------------------------+
Creative Commons Attribution 3.0 License

Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.