サブネットプール

サブネットプール

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

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

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

なぜ必要か?

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

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

Second, subnet pools can manage addresses across projects. The addresses are guaranteed not to overlap. If the addresses come from an externally routable pool then you know that all of the projects have addresses which are routable and unique. This can be useful in the following scenarios.

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

  2. Routing directly to a project network from an external network.

どのように動作するか?

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

As a regular project in an OpenStack cloud, you can create a subnet pool of your own and use it to manage your own pool of addresses. This does not require any admin privileges. Your pool will not be visible to any other project.

If you are an admin, you can create a pool which can be accessed by any regular project. Being a shared resource, there is a quota mechanism to arbitrate access.

クォータ

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

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

With IPv4, the default_quota can be set to the number of absolute addresses any given project is allowed to consume from the pool. For example, with a quota of 128, I might get 203.0.113.128/26, 203.0.113.224/28, and still have room to allocate 48 more addresses in the future.

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 が指定されなかった場合に割り当てるサブネットのサイズを定義します。

Do essentially the same thing for IPv6 and there are now two subnet pools. Regular projects can see them. (the output is trimmed a bit for display)

$ 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.