URAMIRAIKAN

1020のなれの果て (since 2005.6.19)

OpenStackでテナントネットワークのVLAN IDとかを指定したい

 OpenStackでテナント内にネットワークを作成すると、VLAN IDはあらかじめ指定した範囲から選ばれるので通常はユーザーが意識することはありません(VxLANやGREトンネルでも同様)。

# crudini --get /etc/neutron/plugin.ini ml2_type_vlan network_vlan_ranges
physnet-tenant:60:210

 ところが、とある事情でVLAN IDを指定してネットワークを作成したいと言われました。
 方法はすぐに見つかったのでよかったのですが、動作確認したときのメモです。

 やりたかったことは、下図の赤線部分のように2つのリージョンがある環境で外部ネットワークに出ることなく各リージョンのテナントネットワークを繋ぎたかったようです。
 この環境はテナントネットワークにVLANを使っているので、両リージョンで同じVLAN IDのネットワークを作れば通信できるはずです(各スイッチはVLANが通るように設定済み)。


 VLANを指定してテナントネットワークを作成する方法自体はNeutronが備えているので、"neutron"コマンドで設定可能です。ただし、外部ネットワーク等と同じように一般ユーザーが設定することはできません。管理者ユーザーで操作する必要があります。

 以下のように、管理者でネットワークの情報を表示するとVLAN ID(segmentation_id)を確認できます。

【一般ユーザーで実行した場合】
$ neutron net-show private-net
+-----------------+--------------------------------------+ | Field | Value | +-----------------+--------------------------------------+ | admin_state_up | True | | id | 8bb861e9-1e7a-4bcc-b2f2-53ac1f6b66ca | | name | private-net | | router:external | False | | shared | False | | status | ACTIVE | | subnets | 9fd036b1-e49b-4d0e-95b2-dd7187ee1296 | | tenant_id | 97f83583476b4989aaacff4612dabb89 | +-----------------+--------------------------------------+
【管理ユーザーで実行した場合】
$ neutron net-show private-net
+---------------------------+--------------------------------------+ | Field | Value | +---------------------------+--------------------------------------+ | admin_state_up | True | | id | 8bb861e9-1e7a-4bcc-b2f2-53ac1f6b66ca | | name | private-net | | provider:network_type | vlan | | provider:physical_network | physnet-tenant | | provider:segmentation_id | 189 | | router:external | False | | shared | False | | status | ACTIVE | | subnets | 9fd036b1-e49b-4d0e-95b2-dd7187ee1296 | | tenant_id | 97f83583476b4989aaacff4612dabb89 | +---------------------------+--------------------------------------+

 このオプションをコマンド実行時に与えればいいわけです。
 (VLAN IDはNeutronで設定したレンジとは無関係に指定できます。)

$ neutron net-create --tenant_id 97f83583476b4989aaacff4612dabb89 net-vlan1000 --provider:network_type vlan --provider:physical_network physnet-tenant --provider:segmentation_id 1000
Created a new network: +---------------------------+--------------------------------------+ | Field | Value | +---------------------------+--------------------------------------+ | admin_state_up | True | | id | 77afb34f-6ee5-4a58-af19-a43f83a82196 | | name | net-vlan1000 | | provider:network_type | vlan | | provider:physical_network | physnet-tenant | | provider:segmentation_id | 1000 | | shared | False | | status | ACTIVE | | subnets | | | tenant_id | 97f83583476b4989aaacff4612dabb89 | +---------------------------+--------------------------------------+

 管理ユーザーの作業はここまでで、後は一般ユーザーで可能です。

 任意のVLANでネットワークを作成しましたが、このネットワークにインスタンスを接続するためにはサブネットを割り当てる必要があります。
 これは通常の操作でいいのですが、この後に2つのリージョンを接続するのでDHCPは無効にしてIPアドレスは手動で設定します。(一応、DHCPを有効にした場合も確認しましたが一方のリージョンでアドレスを取れない症状が出たりしました。とりあえずやることやったら調べようと思っています。)

 インスタンスを作成する前に、IPアドレスを指定してポートを作成します。

$ neutron port-create --fixed-ip subnet_id=9fd036b1-e49b-4d0e-95b2-dd7187ee1296,ip_address=192.168.100.201 8bb861e9-1e7a-4bcc-b2f2-53ac1f6b66ca
Created a new port: +-----------------------+----------------------------------------------------------------------------------------+ | Field | Value | +-----------------------+----------------------------------------------------------------------------------------+ | admin_state_up | True | | allowed_address_pairs | | | binding:vnic_type | normal | | device_id | | | device_owner | | | fixed_ips | {"subnet_id": "9fd036b1-e49b-4d0e-95b2-dd7187ee1296", "ip_address": "192.168.100.201"} | | id | 73a05d30-9b07-4dea-8b65-ba76fa08d708 | | mac_address | fa:16:3e:99:3c:29 | | name | | | network_id | 8bb861e9-1e7a-4bcc-b2f2-53ac1f6b66ca | | security_groups | 25903def-7814-459f-a641-cacb7a7324e0 | | status | DOWN | | tenant_id | 97f83583476b4989aaacff4612dabb89 | +-----------------------+----------------------------------------------------------------------------------------+

 作成したポートに接続するように"port-id"を指定してインスタンスを作成します。

$ nova boot --flavor m1.small --key_name ssh-key --nic port-id=73a05d30-9b07-4dea-8b65-ba76fa08d708 --image "CentOS 7 Cloud Image" --user-data setup.yaml VM01
+--------------------------------------+-------------------------------------------------------------+ | Property | Value | +--------------------------------------+-------------------------------------------------------------+ | OS-DCF:diskConfig | MANUAL | | OS-EXT-AZ:availability_zone | nova | | OS-EXT-STS:power_state | 0 | | OS-EXT-STS:task_state | - | | OS-EXT-STS:vm_state | building | | OS-SRV-USG:launched_at | - | | OS-SRV-USG:terminated_at | - | | accessIPv4 | | | accessIPv6 | | | adminPass | dS5Y7JKAXJZy | | config_drive | | | created | 2015-02-24T08:45:23Z | | flavor | m1.small (2) | | hostId | | | id | bf6877a1-1d24-44ab-a8d7-3a21d86a409d | | image | CentOS 7 Cloud Image (598776a6-5276-4b3d-89de-01a9669a8701) | | key_name | ssh-key | | metadata | {} | | name | VM01 | | os-extended-volumes:volumes_attached | [] | | progress | 0 | | security_groups | default | | status | BUILD | | tenant_id | 97f83583476b4989aaacff4612dabb89 | | updated | 2015-02-24T08:45:25Z | | user_id | 8135b07ca4ac470daf70fe0e2f185173 | +--------------------------------------+-------------------------------------------------------------+

 両リージョンで作業を行い、インスタンスが作成できたら疎通確認を行います。

 ちなみに要望のあったネットワークにはZabbixやファイルサーバがあったりするようで、それらと繋げたいとかなんとか…。こういうことをやっていると、OpenStackで管理する意味があるのかちょっと自信がなくなってきます。

 2つのリージョン(データセンター)をプライベートネットワークで接続したいという要望は他でもあるんじゃないかと思いますが、どういう方法がベストなのかは考えてみたいです。VPNだとイマイチかな。