OpenStack TackerによるNFVオーケストレーション

2016年7月26日(火)
高橋 信行安座間 勇二(あざま ゆうじ)

OpenStack TackerによるNFVオーケストレーション

OpenDaylightのユースケースにNFV(Network Functions Virtualization)があります。今回はNFVの視点から、Tacker(https://wiki.openstack.org/wiki/Tacker)について解説します。Tackerとは、OpenStackのプロジェクトの1つで、ETSI MANOアーキテクチャフレームワークに基づいたVNFM/NFVOの役割を果たすコンポーネントです。といっても、VNFM/NFVOって何?という方も多いと思いますので、ETSI(欧州電気通信標準化機構)が提唱するNFVについて簡単におさらいしておきます。

NFVアーキテクチャのおさらい

NFVとは、ファイアーウォールなどのこれまで専用のハードウェアアプライアンスで実現されていたネットワーク機能を、ソフトウェア(仮想マシン)として実現しようというものです。そのソフトウェアで動作するネットワーク機能をVNF(Virtualized Network Function)と呼びます。そして、VNFの実行基盤に必要なストレージやネットワークなどのハードウェアやハイパーバイザーなどのソフトウェアをNFVI(Network Functions Virtualization Infrastructure)と呼びます。

そうなると、VNFやNFVIをまとめて管理するコンポーネントが必要になってきます。それがNFV-MANO(NFV Management and Orchestration)になります。NFV-MANOは以下に示す3つの機能ブロックを持ちます。

  1. VIM(Virtualized Infrastructure Manager)
    • NFVIのコンピューティング、ストレージおよびネットワークリソースの制御、管理を行います
  2. NFVO(NFV Orchestrator)
    • NFVIのオーケストレーションやネットワークサービスのライフサイクルの管理を行います
  3. VNFM(VNF Manager)
    • VNFの設定やテンプレートによる展開、ソフトウェアアップグレードの管理、イベント/障害検出、オートヒーリングなど、VNFインスタンスのライフサイクルの管理を行います

OpenStackでNFVを実現するためにTackerが担っているのは、これらの機能ブロックの中のNFVOとVNFMです。そして、将来的にはTackerはNeutronのnetworking-sfcを経由してOpenDaylight(以降、ODLと省略)を利用する仕組みになります。このTackerとODL連携の仕組みは、2016年4月現在、実装が進められている段階ですが、すでに各方面から注目されており、ODLを用いたNFVとして広く使われる可能性があります。

しかしながら、Tackerについては、OpenDaylight以上に、構築についての情報が少なく、手動による構築は難易度が高いです。前回まで、OpenStack環境の構築にDevStackを利用しました。そこで、今回もDevStackを利用してTackerを構築した後、VNFを作成して使ってみるところまで解説していきます。

環境・バージョンについて

今回の構築はシングルノードの構成とします。筆者の環境ではvSphere ESXi上にNested KVMを有効にしたUbuntuの仮想マシンを1台用意しています。この仮想マシンは、DevStackの性質上、ルート権限(sudo)での実行が可能である必要があります。さらに、ソースコードのダウンロードを行うためインターネットアクセスができる環境が必要です。

OSディストリビューション カーネルバージョン
Ubuntu 14.04.2 LTS Linux version 3.16.0-30-generic

OpenStack環境の各コンポーネントはMitakaを使用します。

コンポーネント バージョン
Nova
Glance
Neutron
Horizon
Tacker
Mitaka

構築してみよう

それでは構築を始めていきます。まずは、構築を簡単にするためにファイアーウォールを無効化しておきます。

~$ sudo ufw disable

次にDevStackをダウンロードします。その際、gitコマンドが必要なので必要に応じてインストールしてください。ブランチ名はstable/mitakaを指定します。

~$ sudo apt-get install git
~$ git clone --branch stable/mitaka https://github.com/openstack-dev/devstack.git
~$ cd devstack/

今回使用するlocal.confをダウンロードします。

~/devstack$ wget https://raw.githubusercontent.com/YujiAzama/openstack-tacker/master/local.conf

後は、stack.shスクリプトを実行するだけです。以下の様なメッセージが出力されれば終了です。

~/devstack$ ./stack.sh
  :
This is your host IP address: 192.168.0.10
This is your host IPv6 address: ::1
Horizon is now available at http://192.168.0.10/dashboard
Keystone is serving at http://192.168.0.10:5000/
The default users are: admin and demo
The password: password
~/devstack$

以上で構築作業は終了です。

デフォルトでnet_mgmt、external、net0、net1のネットワークとそれぞれのサブネットが作成されていることを確認します。

~/devstack$ source openrc admin admin
WARNING: setting legacy OS_TENANT_NAME to support cli tools.
~/devstack$ neutron net-list
+--------------------------------------+----------+----------------------------------------------------------+
| id                                   | name     | subnets                                                  |
+--------------------------------------+----------+----------------------------------------------------------+
| 33afc037-bcb9-4fa0-bd90-ca54f1bade8f | external | f631a6b5-7f58-4a17-ae70-4e715cedbbdf 2001:db8::/64       |
|                                      |          | 556f45ec-2f62-4909-94ea-2428552fc891 10.12.161.0/24      |
| d1aa4aa3-9fb0-47b3-afa2-4af17d68e7ed | net1     | b141ef9d-610c-4e0f-b7a9-6a60cd2ce305 10.10.1.0/24        |
| 45b92be3-0a30-4df5-a2eb-38aba23b4da0 | net0     | b15d2770-ee41-49ca-9ce9-1fdd8e6fa2c8 10.10.0.0/24        |
| 6208b02e-130a-4622-a228-d73c27ddd587 | private  | 92409cb3-f8a2-4528-a2ee-2cb324b3a8e0 fd9f:c646:8f20::/64 |
|                                      |          | a0f4af9b-8493-46fe-b776-79f4828fe870 15.0.0.0/24         |
| 71c9ae3b-331d-4dbf-b090-cf53a9b177ce | net_mgmt | c5219e79-bed8-4f6e-8c68-49fbf8b2c483 192.168.120.0/24    |
+--------------------------------------+----------+----------------------------------------------------------+
~/devstack$ neutron subnet-list
+--------------------------------------+---------------------+---------------------+-------------------------------------------------------------------------------+
| id                                   | name                | cidr                | allocation_pools                                                              |
+--------------------------------------+---------------------+---------------------+-------------------------------------------------------------------------------+
| 556f45ec-2f62-4909-94ea-2428552fc891 | public-subnet       | 10.12.161.0/24      | {"start": "10.12.161.150", "end": "10.12.161.201"}                            |
| f631a6b5-7f58-4a17-ae70-4e715cedbbdf | ipv6-public-subnet  | 2001:db8::/64       | {"start": "2001:db8::3", "end": "2001:db8::ffff:ffff:ffff:ffff"}              |
|                                      |                     |                     | {"start": "2001:db8::1", "end": "2001:db8::1"}                                |
| 92409cb3-f8a2-4528-a2ee-2cb324b3a8e0 | ipv6-private-subnet | fd9f:c646:8f20::/64 | {"start": "fd9f:c646:8f20::2", "end": "fd9f:c646:8f20:0:ffff:ffff:ffff:ffff"} |
| a0f4af9b-8493-46fe-b776-79f4828fe870 | private-subnet      | 15.0.0.0/24         | {"start": "15.0.0.2", "end": "15.0.0.254"}                                    |
| b141ef9d-610c-4e0f-b7a9-6a60cd2ce305 | subnet1             | 10.10.1.0/24        | {"start": "10.10.1.2", "end": "10.10.1.254"}                                  |
| b15d2770-ee41-49ca-9ce9-1fdd8e6fa2c8 | subnet0             | 10.10.0.0/24        | {"start": "10.10.0.2", "end": "10.10.0.254"}                                  |
| c5219e79-bed8-4f6e-8c68-49fbf8b2c483 | subnet_mgmt         | 192.168.120.0/24    | {"start": "192.168.120.2", "end": "192.168.120.254"}                          |
+--------------------------------------+---------------------+---------------------+-------------------------------------------------------------------------------+

構築したOpenStackが、VIMとして登録されていることも確認します。

~/devstack$ tacker vim-list
+--------------------------------------+----------------------------------+------+-----------+-------------+--------------------------+------------------------------+-----------------------------------------------------------+
| id                                   | tenant_id                        | name | type      | description | auth_url                 | placement_attr               | auth_cred                                                 |
+--------------------------------------+----------------------------------+------+-----------+-------------+--------------------------+------------------------------+-----------------------------------------------------------+
| 1cdd90eb-c147-438a-8764-52cef1f4a0e8 | 3eda2401d7eb40c0bcdf655d1218ec62 | VIM0 | openstack |             | http://localhost:5000/v3 | {u'regions': [u'RegionOne']} | {u'username': u'nfv_user', u'project_name': u'nfv',       |
|                                      |                                  |      |           |             |                          |                              | u'user_id': u'', u'user_domain_id': u'default',           |
|                                      |                                  |      |           |             |                          |                              | u'project_id': u'', u'auth_url':                          |
|                                      |                                  |      |           |             |                          |                              | u'http://localhost:5000/v3', u'password': '***',          |
|                                      |                                  |      |           |             |                          |                              | u'project_domain_id': u'default'}                         |
+--------------------------------------+----------------------------------+------+-----------+-------------+--------------------------+------------------------------+-----------------------------------------------------------+

TackerでVNFをデプロイしてみよう

VNFを作成するには、先にVNFD(VNF Descriptor)を作成する必要があります。VNFDとはTOSCAで定義されたVNFのトポロジに対して、どのようにデプロイやオペレーションするかを定義したものです。TOSCA(Topology and Orchestration Specification for Cloud Applications)とは、クラウド上に展開されるシステム構成(トポロジ)を定義したものです。TOSCAを使用することによって、異なるベンダ間のクラウドアプリケーションおよびサービスをスムーズに導入でき、多種多様なクラウドをまたがったアプリケーションの可搬性を確保し、システムの移行や連携を容易にできるメリットが得られます。

今回使用するTOSCAテンプレートの中では、VNFインスタンスのイメージの指定の他、net0とnet1、net_mgmtという3つのネットワークをVNFインスタンスに接続するように定義しています。

VNFイメージの登録

今回使用するVNFは、ファイアーウォールに見立てた簡易的なもので、Ubuntuのイメージをベースに筆者が独自に作成しました。ファイアーウォール機能にはiptablesを使っています。まず、そのVNFイメージのダウンロードとGlanceへの登録を行います。

編注:Google DriveのWeb Hostingサービス廃止に伴いVNFイメージをThink ITのサーバーにホストするように変更しました。会員登録、ログイン後に記事末からダウンロードをお試しください。

~/devstack$ wget -O myvnf.qcow2 https://www.googledrive.com/host/0Bx3-Oe8aeU3FOUwxVlBLYW5KNEU
  :
myvnf.qcow2             [<=>                 ] 373.19M  10.9MB/s    in 34s     

2016-05-09 13:46:13 (10.9 MB/s) - `myvnf.qcow2' へ保存終了 [391315456]

~/devstack$ glance image-create --file myvnf.qcow2 --disk-format qcow2 --container-format bare --name='myvnf' --visibility public
+------------------+--------------------------------------+
| Property         | Value                                |
+------------------+--------------------------------------+
| checksum         | bbf3134efa2f67d31b48e2f681a37198     |
| container_format | bare                                 |
| created_at       | 2016-05-16T01:35:19Z                 |
| disk_format      | qcow2                                |
| id               | 876a2de8-58b5-41e3-8f53-e21de6f39098 |
| min_disk         | 0                                    |
| min_ram          | 0                                    |
| name             | myvnf                                |
| owner            | 3eda2401d7eb40c0bcdf655d1218ec62     |
| protected        | False                                |
| size             | 391315456                            |
| status           | active                               |
| tags             | []                                   |
| updated_at       | 2016-05-16T01:35:22Z                 |
| virtual_size     | None                                 |
| visibility       | public                               |
+------------------+--------------------------------------+

このVNFイメージを起動するために、RAMが3GB、ディスクが20GB程度のフレーバーを用意します。myvnf_flavorという名前のフレーバーを作成します。TOSCAテンプレート内でフレーバーを指定しているので同じ名前で作成して下さい。

~/devstack$ nova flavor-create --is-public true myvnf_flavor auto 3072 20 1
+--------------------------------------+--------------+-----------+------+-----------+------+-------+-------------+-----------+
| ID                                   | Name         | Memory_MB | Disk | Ephemeral | Swap | VCPUs | RXTX_Factor | Is_Public |
+--------------------------------------+--------------+-----------+------+-----------+------+-------+-------------+-----------+
| d4c11af1-0d00-4a87-bcb0-ebf3f52b32e9 | myvnf_flavor | 3072      | 20   | 0         |      | 1     | 1.0         | True      |
+--------------------------------------+--------------+-----------+------+-----------+------+-------+-------------+-----------+

VNFDの作成

それではVNFDを作成しますが、先にTOSCAテンプレートをダウンロードします。

~/devstack$ wget https://raw.githubusercontent.com/YujiAzama/openstack-tacker/master/myvnf.yaml
~/devstack$ tacker vnfd-create --vnfd-file myvnf.yaml
Created a new vnfd:
+---------------+------------------------------------------------------------------------+
| Field         | Value                                                                  |
+---------------+------------------------------------------------------------------------+
| description   | A simple firewall based on Ubuntu.                                     |
| id            | 1b909041-76c8-4344-b10f-bff3d484973e                                   |
| infra_driver  | heat                                                                   |
| mgmt_driver   | noop                                                                   |
| name          | MyVNF                                                                  |
| service_types | {"service_type": "vnfd", "id": "7ed83b08-c658-4ffa-9b0b-4861290b1f7f"} |
| tenant_id     | 3eda2401d7eb40c0bcdf655d1218ec62                                       |
+---------------+------------------------------------------------------------------------+

VNFの作成

先ほど作成したVNFDのIDを指定してVNFを作成します。完了するまで、1分程度かかる場合があります。

~/devstack$ tacker vnf-create --name firewall --vnfd-id 1b909041-76c8-4344-b10f-bff3d484973e
Created a new vnf:
+----------------+--------------------------------------+
| Field          | Value                                |
+----------------+--------------------------------------+
| description    | A simple firewall based on Ubuntu.   |
| id             | 742e0260-115e-4832-8613-269706fd75e1 |
| instance_id    | 966bc8f8-4a02-41b9-b241-99f1c7d7ce75 |
| mgmt_url       |                                      |
| name           | firewall                             |
| placement_attr | {"vim_name": "VIM0"}                 |
| status         | PENDING_CREATE                       |
| tenant_id      | 3eda2401d7eb40c0bcdf655d1218ec62     |
| vim_id         | 1cdd90eb-c147-438a-8764-52cef1f4a0e8 |
| vnfd_id        | 1b909041-76c8-4344-b10f-bff3d484973e |
+----------------+--------------------------------------+

以下の様に、作成したVNFのステータスが「PENDING_CREATE」から「ACTIVE」になれば作成完了です。

~/devstack$ tacker vnf-list
+--------------------------------------+----------+------------------------------------+---------------------------+--------+--------------------------------------+------------------------+
| id                                   | name     | description                        | mgmt_url                  | status | vim_id                               | placement_attr         |
+--------------------------------------+----------+------------------------------------+---------------------------+--------+--------------------------------------+------------------------+
| 742e0260-115e-4832-8613-269706fd75e1 | firewall | A simple firewall based on Ubuntu. | {"vdu1": "192.168.120.3"} | ACTIVE | 1cdd90eb-c147-438a-8764-52cef1f4a0e8 | {u'vim_name': u'VIM0'} |
+--------------------------------------+----------+------------------------------------+---------------------------+--------+--------------------------------------+------------------------+

VNFインスタンスはserviceテナントに作られる

Novaコマンドから、VNFインスタンスの状態を確認してみます。

~/devstack$ nova list
+----+------+--------+------------+-------------+----------+
| ID | Name | Status | Task State | Power State | Networks |
+----+------+--------+------------+-------------+----------+
+----+------+--------+------------+-------------+----------+

先ほど作成したVNFインスタンスが見当たりません。実は、tackerによって展開されるVNFインスタンスはserviceテナントに作成されます。--all-tenantオプションを付けると全テナントのインスタンスが取得できます。

~/devstack$ nova list --all-tenant
+--------------------------------------+-------------------------------------------------------+----------------------------------+--------+------------+-------------+--------------------------------------------------------+
| ID                                   | Name                                                  | Tenant ID                        | Status | Task State | Power State | Networks                                               |
+--------------------------------------+-------------------------------------------------------+----------------------------------+--------+------------+-------------+--------------------------------------------------------+
| 0d2f79c0-149d-4f18-81fa-1c8810a274e1 | ta-0260-115e-4832-8613-269706fd75e1-vdu1-5xyg3hv6icwe | cb67d4395179494fa730979ccf73dcf3 | ACTIVE | -          | Running     | net_mgmt=192.168.120.3; net1=10.10.1.3; net0=10.10.0.3 |
+--------------------------------------+-------------------------------------------------------+----------------------------------+--------+------------+-------------+--------------------------------------------------------+

VNFの構成

今回作成したVNFインスタンスはnet0とnet1およびnet_mgmtのネットワークに接続されています。

ネットワーク図

net0はVNFインスタンスへのインバウンドパケットのためのネットワーク、それに対してnet1はVNFインスタンスからのアウトバウンドパケットのためのネットワークです。net_mgmtというネットワークはVNFインスタンスのための管理用ネットワークです。管理用ネットワークは、VNFインスタンスの設定やヘルスチェックなどを行うためのネットワークなので、全てのVNFインスタンスが接続されることになります。VNFの構成はTOSCAテンプレートで記述すると説明しましたが、今回使用したTOSCAテンプレートの中で、VNFインスタンスのイメージや接続するネットワーク、ヘルスチェックなど、VNFの構成を定義しています。

VNFを使ってみる

では、実際にVNFインスタンスを使ってみます。先ほど作成したVNFはiptablesを使った簡易的なファイアーウォール機能として動作します。

VNFインスタンスにはネットワークnet0とnet1が接続されていました。そこで、それぞれのネットワークにクライアントとなるインスタンスnet0-vm(cirros)とnet1-vm(cirros)を作成し疎通確認をしてみます。インスタンスはadminテナントで作成します。疎通確認は次の2点を確認します。

  1. 初期状態のVNFの設定ではnet0からnet1宛のpingが到達すること
  2. VNF(iptables)を設定することによって、net0からnet1宛のpingがブロックされるようになること
ネットワーク図

経路情報の追加

net0とnet1のインスタンス間をVNF経由で相互に通信できるように経路情報を登録する必要があります。まず、VNFのnet0側とnet1側のIPを調べます。

~/devstack$ nova list --all-tenant
+--------------------------------------+-------------------------------------------------------+----------------------------------+--------+------------+-------------+--------------------------------------------------------+
| ID                                   | Name                                                  | Tenant ID                        | Status | Task State | Power State | Networks                                               |
+--------------------------------------+-------------------------------------------------------+----------------------------------+--------+------------+-------------+--------------------------------------------------------+
| 0d2f79c0-149d-4f18-81fa-1c8810a274e1 | ta-0260-115e-4832-8613-269706fd75e1-vdu1-5xyg3hv6icwe | cb67d4395179494fa730979ccf73dcf3 | ACTIVE | -          | Running     | net_mgmt=192.168.120.3; net1=10.10.1.3; net0=10.10.0.3 |
+--------------------------------------+-------------------------------------------------------+----------------------------------+--------+------------+-------------+--------------------------------------------------------+

経路情報を登録します。

~/devstack$ neutron subnet-update subnet0 --host-route destination=10.10.1.0/24,nexthop=10.10.0.3
Updated subnet: subnet0
~/devstack$ neutron subnet-update subnet1 --host-route destination=10.10.0.0/24,nexthop=10.10.1.3
Updated subnet: subnet1

インスタンスの作成

それでは、net0-vmとnet1-vmを作成します。pingによる疎通確認さえできれば良いのでcirrosイメージを使用します。externalネットワークからインスタンスにSSH接続出きるようにフローティングIPも割り当てます。

~/devstack$ neutron net-list  # ネットワークのIDを調べる
+--------------------------------------+----------+----------------------------------------------------------+
| id                                   | name     | subnets                                                  |
+--------------------------------------+----------+----------------------------------------------------------+
| 45b92be3-0a30-4df5-a2eb-38aba23b4da0 | net0     | b15d2770-ee41-49ca-9ce9-1fdd8e6fa2c8 10.10.0.0/24        |  # net0
| 6208b02e-130a-4622-a228-d73c27ddd587 | private  | 92409cb3-f8a2-4528-a2ee-2cb324b3a8e0 fd9f:c646:8f20::/64 |
|                                      |          | a0f4af9b-8493-46fe-b776-79f4828fe870 15.0.0.0/24         |
| 71c9ae3b-331d-4dbf-b090-cf53a9b177ce | net_mgmt | c5219e79-bed8-4f6e-8c68-49fbf8b2c483 192.168.120.0/24    |
| 33afc037-bcb9-4fa0-bd90-ca54f1bade8f | external | 556f45ec-2f62-4909-94ea-2428552fc891 10.12.161.0/24      |
|                                      |          | f631a6b5-7f58-4a17-ae70-4e715cedbbdf 2001:db8::/64       |
| d1aa4aa3-9fb0-47b3-afa2-4af17d68e7ed | net1     | b141ef9d-610c-4e0f-b7a9-6a60cd2ce305 10.10.1.0/24        |  # net1
+--------------------------------------+----------+----------------------------------------------------------+
~/devstack$ nova boot --image cirros-0.3.4-x86_64-uec --flavor m1.tiny --nic net-id=45b92be3-0a30-4df5-a2eb-38aba23b4da0 net0-vm  # net0のネットワークを指定する
+--------------------------------------+----------------------------------------------------------------+
| Property                             | Value                                                          |
+--------------------------------------+----------------------------------------------------------------+
| OS-DCF:diskConfig                    | MANUAL                                                         |
| OS-EXT-AZ:availability_zone          |                                                                |
| OS-EXT-SRV-ATTR:host                 | -                                                              |
| OS-EXT-SRV-ATTR:hostname             | net0-vm                                                        |
| OS-EXT-SRV-ATTR:hypervisor_hostname  | -                                                              |
| OS-EXT-SRV-ATTR:instance_name        | instance-00000002                                              |
| OS-EXT-SRV-ATTR:kernel_id            | d208b1b8-815f-4916-a0f8-b6a0f9904dfe                           |
| OS-EXT-SRV-ATTR:launch_index         | 0                                                              |
| OS-EXT-SRV-ATTR:ramdisk_id           | 257c763b-5457-47c7-98a8-ff6b9455a9be                           |
| OS-EXT-SRV-ATTR:reservation_id       | r-nutjal63                                                     |
| OS-EXT-SRV-ATTR:root_device_name     | -                                                              |
| OS-EXT-SRV-ATTR:user_data            | -                                                              |
| OS-EXT-STS:power_state               | 0                                                              |
| OS-EXT-STS:task_state                | scheduling                                                     |
| OS-EXT-STS:vm_state                  | building                                                       |
| OS-SRV-USG:launched_at               | -                                                              |
| OS-SRV-USG:terminated_at             | -                                                              |
| accessIPv4                           |                                                                |
| accessIPv6                           |                                                                |
| adminPass                            | cJm8nfCq26Uz                                                   |
| config_drive                         |                                                                |
| created                              | 2016-05-16T01:45:29Z                                           |
| description                          | -                                                              |
| flavor                               | m1.tiny (1)                                                    |
| hostId                               |                                                                |
| host_status                          |                                                                |
| id                                   | fbc05daa-a1b9-4015-91e8-94ac02109d09                           |
| image                                | cirros-0.3.4-x86_64-uec (25db4eab-f79f-4773-8405-48e1da9dd543) |
| key_name                             | -                                                              |
| locked                               | False                                                          |
| metadata                             | {}                                                             |
| name                                 | net0-vm                                                        |
| os-extended-volumes:volumes_attached | []                                                             |
| progress                             | 0                                                              |
| security_groups                      | default                                                        |
| status                               | BUILD                                                          |
| tenant_id                            | 3eda2401d7eb40c0bcdf655d1218ec62                               |
| updated                              | 2016-05-16T01:45:30Z                                           |
| user_id                              | 15c5a599501e43abac606f643c1a7a6f                               |
+--------------------------------------+----------------------------------------------------------------+
~/devstack$ nova boot --image cirros-0.3.4-x86_64-uec --flavor m1.tiny --nic net-id=d1aa4aa3-9fb0-47b3-afa2-4af17d68e7ed net1-vm  # net1のネットワークを指定する
+--------------------------------------+----------------------------------------------------------------+
| Property                             | Value                                                          |
+--------------------------------------+----------------------------------------------------------------+
| OS-DCF:diskConfig                    | MANUAL                                                         |
| OS-EXT-AZ:availability_zone          |                                                                |
| OS-EXT-SRV-ATTR:host                 | -                                                              |
| OS-EXT-SRV-ATTR:hostname             | net1-vm                                                        |
| OS-EXT-SRV-ATTR:hypervisor_hostname  | -                                                              |
| OS-EXT-SRV-ATTR:instance_name        | instance-00000003                                              |
| OS-EXT-SRV-ATTR:kernel_id            | d208b1b8-815f-4916-a0f8-b6a0f9904dfe                           |
| OS-EXT-SRV-ATTR:launch_index         | 0                                                              |
| OS-EXT-SRV-ATTR:ramdisk_id           | 257c763b-5457-47c7-98a8-ff6b9455a9be                           |
| OS-EXT-SRV-ATTR:reservation_id       | r-lddzn7wd                                                     |
| OS-EXT-SRV-ATTR:root_device_name     | -                                                              |
| OS-EXT-SRV-ATTR:user_data            | -                                                              |
| OS-EXT-STS:power_state               | 0                                                              |
| OS-EXT-STS:task_state                | scheduling                                                     |
| OS-EXT-STS:vm_state                  | building                                                       |
| OS-SRV-USG:launched_at               | -                                                              |
| OS-SRV-USG:terminated_at             | -                                                              |
| accessIPv4                           |                                                                |
| accessIPv6                           |                                                                |
| adminPass                            | 7NTvzYv6f7eK                                                   |
| config_drive                         |                                                                |
| created                              | 2016-05-16T01:46:28Z                                           |
| description                          | -                                                              |
| flavor                               | m1.tiny (1)                                                    |
| hostId                               |                                                                |
| host_status                          |                                                                |
| id                                   | bce5e7fd-d1b4-4cbc-8049-54a9e798fc9e                           |
| image                                | cirros-0.3.4-x86_64-uec (25db4eab-f79f-4773-8405-48e1da9dd543) |
| key_name                             | -                                                              |
| locked                               | False                                                          |
| metadata                             | {}                                                             |
| name                                 | net1-vm                                                        |
| os-extended-volumes:volumes_attached | []                                                             |
| progress                             | 0                                                              |
| security_groups                      | default                                                        |
| status                               | BUILD                                                          |
| tenant_id                            | 3eda2401d7eb40c0bcdf655d1218ec62                               |
| updated                              | 2016-05-16T01:46:28Z                                           |
| user_id                              | 15c5a599501e43abac606f643c1a7a6f                               |
+--------------------------------------+----------------------------------------------------------------+
~/devstack$ nova list  # 作成したインスタンスのIPアドレスを確認する
+--------------------------------------+---------+--------+------------+-------------+----------------+
| ID                                   | Name    | Status | Task State | Power State | Networks       |
+--------------------------------------+---------+--------+------------+-------------+----------------+
| fbc05daa-a1b9-4015-91e8-94ac02109d09 | net0-vm | ACTIVE | -          | Running     | net0=10.10.0.4 |
| bce5e7fd-d1b4-4cbc-8049-54a9e798fc9e | net1-vm | ACTIVE | -          | Running     | net1=10.10.1.4 |
+--------------------------------------+---------+--------+------------+-------------+----------------+
~/devstack$ neutron router-interface-add router1 subnet0
Added interface 5425d90a-2d26-46a8-86a0-490744e7d877 to router router1.
~/devstack$ neutron floatingip-create external
Created a new floatingip:
+---------------------+--------------------------------------+
| Field               | Value                                |
+---------------------+--------------------------------------+
| description         |                                      |
| dns_domain          |                                      |
| dns_name            |                                      |
| fixed_ip_address    |                                      |
| floating_ip_address | 10.12.161.151                        |
| floating_network_id | 33afc037-bcb9-4fa0-bd90-ca54f1bade8f |
| id                  | c4a58b5f-e372-441d-889c-3eb18a89e9c8 |
| port_id             |                                      |
| router_id           |                                      |
| status              | DOWN                                 |
| tenant_id           | 3eda2401d7eb40c0bcdf655d1218ec62     |
+---------------------+--------------------------------------+
~/devstack$ neutron port-list
+--------------------------------------+---------------------------------------------------------------------------------------------------------+-------------------+---------------------------------------------------------------------------------------------------------+
| id                                   | name                                                                                                    | mac_address       | fixed_ips                                                                                               |
+--------------------------------------+---------------------------------------------------------------------------------------------------------+-------------------+---------------------------------------------------------------------------------------------------------+
| 105338dc-6c30-49a8-a9b5-fab17f04e211 |                                                                                                         | fa:16:3e:f1:09:b2 | {"subnet_id": "b141ef9d-610c-4e0f-b7a9-6a60cd2ce305", "ip_address": "10.10.1.2"}                        |
| 1aadee40-9606-44ec-b1d7-dd917f58257b |                                                                                                         | fa:16:3e:fe:d0:05 | {"subnet_id": "92409cb3-f8a2-4528-a2ee-2cb324b3a8e0", "ip_address": "fd9f:c646:8f20::1"}                |
| 268ccf93-3ec5-46e9-bc4f-a631614afd1d |                                                                                                         | fa:16:3e:22:0d:2c | {"subnet_id": "a0f4af9b-8493-46fe-b776-79f4828fe870", "ip_address": "15.0.0.1"}                         |
| 45334855-bb9c-41b5-b6a1-62906a4a9be6 |                                                                                                         | fa:16:3e:69:ca:e9 | {"subnet_id": "b15d2770-ee41-49ca-9ce9-1fdd8e6fa2c8", "ip_address": "10.10.0.2"}                        |
| 5425d90a-2d26-46a8-86a0-490744e7d877 |                                                                                                         | fa:16:3e:c7:4a:b9 | {"subnet_id": "b15d2770-ee41-49ca-9ce9-1fdd8e6fa2c8", "ip_address": "10.10.0.1"}                        |
| 5762b752-83a3-499d-badd-9cddb3ede6d5 |                                                                                                         | fa:16:3e:fd:3c:07 | {"subnet_id": "b15d2770-ee41-49ca-9ce9-1fdd8e6fa2c8", "ip_address": "10.10.0.4"}                        |  # net0-vm
| 58a1b424-474b-4f09-98f4-4867b590d0a5 | tacker.vm.infra_drivers.heat.heat_DeviceHeat-742e0260-115e-4832-8613-269706fd75e1-vdu1-net_mgmt-port-   | fa:16:3e:d3:9a:e6 | {"subnet_id": "c5219e79-bed8-4f6e-8c68-49fbf8b2c483", "ip_address": "192.168.120.3"}                    |
|                                      | inspycqjjnjn                                                                                            |                   |                                                                                                         |
| 5f4168c1-cd4e-4cf5-9790-98946e80388c |                                                                                                         | fa:16:3e:2f:28:aa | {"subnet_id": "a0f4af9b-8493-46fe-b776-79f4828fe870", "ip_address": "15.0.0.2"}                         |
|                                      |                                                                                                         |                   | {"subnet_id": "92409cb3-f8a2-4528-a2ee-2cb324b3a8e0", "ip_address":                                     |
|                                      |                                                                                                         |                   | "fd9f:c646:8f20:0:f816:3eff:fe2f:28aa"}                                                                 |
| 726acc29-7f25-4054-a7a5-c747008e7db6 |                                                                                                         | fa:16:3e:fa:1b:65 | {"subnet_id": "b15d2770-ee41-49ca-9ce9-1fdd8e6fa2c8", "ip_address": "10.10.0.3"}                        |
| 74236635-fa67-47f0-9673-297f84549e6c |                                                                                                         | fa:16:3e:23:3f:4f | {"subnet_id": "556f45ec-2f62-4909-94ea-2428552fc891", "ip_address": "10.12.161.150"}                    |
|                                      |                                                                                                         |                   | {"subnet_id": "f631a6b5-7f58-4a17-ae70-4e715cedbbdf", "ip_address": "2001:db8::3"}                      |
| 8cd5a363-687b-4ecd-ab3b-743ba7a18a50 |                                                                                                         | fa:16:3e:25:c7:e3 | {"subnet_id": "556f45ec-2f62-4909-94ea-2428552fc891", "ip_address": "10.12.161.151"}                    |
|                                      |                                                                                                         |                   | {"subnet_id": "f631a6b5-7f58-4a17-ae70-4e715cedbbdf", "ip_address": "2001:db8::4"}                      |
| a3db77a1-bc28-41db-80cc-23092ee2d62b |                                                                                                         | fa:16:3e:b5:96:ed | {"subnet_id": "b141ef9d-610c-4e0f-b7a9-6a60cd2ce305", "ip_address": "10.10.1.4"}                        |  # net1-vm
| ab355d02-9d58-471b-96f7-bf0d6539ff0f |                                                                                                         | fa:16:3e:6f:7d:f5 | {"subnet_id": "b141ef9d-610c-4e0f-b7a9-6a60cd2ce305", "ip_address": "10.10.1.3"}                        |
| e5f4b673-6fe8-4dc6-b44f-1071e0fba0ea |                                                                                                         | fa:16:3e:7d:ce:75 | {"subnet_id": "c5219e79-bed8-4f6e-8c68-49fbf8b2c483", "ip_address": "192.168.120.2"}                    |
+--------------------------------------+---------------------------------------------------------------------------------------------------------+-------------------+---------------------------------------------------------------------------------------------------------+
~/devstack$ neutron floatingip-associate c4a58b5f-e372-441d-889c-3eb18a89e9c8 5762b752-83a3-499d-badd-9cddb3ede6d5  # net0-vmのポートにフローティングIPを割り当てる
Associated floating IP c4a58b5f-e372-441d-889c-3eb18a89e9c8

今回使用しているVNFインスタンスは、初期状態で全てのパケットの転送を許可するようにしています。そのため、今の状態ではnet0からnet1への通信はできるようになっています。

別のターミナルを開き、net0-vmにSSHログインしてnet1-vmにping疎通ができることを確認してみます。フローティングIPから接続します。ユーザー名に「cirros」で、パスワードに「cubswin:)」を入力することでログインできます。

~/devstack$ ssh cirros@10.12.161.151
The authenticity of host '10.12.161.151 (10.12.161.151)' can't be established.
RSA key fingerprint is 32:6d:3a:ba:93:00:2d:95:e3:76:51:8c:c5:d7:a2:43.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.12.161.151' (RSA) to the list of known hosts.
cirros@10.12.161.151's password:   # 「cubswin:)」と入力する
$ ping 10.10.1.4 -c 5
PING 10.10.1.4 (10.10.1.4): 56 data bytes
64 bytes from 10.10.1.4: seq=0 ttl=63 time=7.145 ms
64 bytes from 10.10.1.4: seq=1 ttl=63 time=0.695 ms
64 bytes from 10.10.1.4: seq=2 ttl=63 time=0.450 ms
64 bytes from 10.10.1.4: seq=3 ttl=63 time=0.663 ms
64 bytes from 10.10.1.4: seq=4 ttl=63 time=0.483 ms

--- 10.10.1.4 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max = 0.450/1.887/7.145 ms

net0-vmからnet1-vmへの疎通が確認できました。それでは、VNFの設定を変更してnet0からnet1へのパケットをブロックします。

VNFの設定はマネジメントネットワークnet_mgmtからSSH接続して行います。まず、VNFのマネジメントネットワークのIPアドレスを確認します。

~/devstack$ tacker vnf-list  # VNFのマネジメントネットワークIPアドレス(mgmt_url)を確認する
+--------------------------------------+----------+------------------------------------+---------------------------+--------+--------------------------------------+------------------------+
| id                                   | name     | description                        | mgmt_url                  | status | vim_id                               | placement_attr         |
+--------------------------------------+----------+------------------------------------+---------------------------+--------+--------------------------------------+------------------------+
| 742e0260-115e-4832-8613-269706fd75e1 | firewall | A simple firewall based on Ubuntu. | {"vdu1": "192.168.120.3"} | ACTIVE | 1cdd90eb-c147-438a-8764-52cef1f4a0e8 | {u'vim_name': u'VIM0'} |
+--------------------------------------+----------+------------------------------------+---------------------------+--------+--------------------------------------+------------------------+

ユーザ名に「user」、パスワードに「password」を入力してVNFにSSHログインします。

~/devstack$ ssh user@192.168.120.3
The authenticity of host '192.168.120.3 (192.168.120.3)' can't be established.
ECDSA key fingerprint is 31:3f:a9:9e:91:78:03:83:88:30:0c:93:5c:eb:19:11.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.120.3' (ECDSA) to the list of known hosts.
user@192.168.120.3's password:   # 「password」と入力する
Welcome to Ubuntu 14.04.4 LTS (GNU/Linux 3.13.0-85-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

  System information as of Mon May 16 01:39:00 UTC 2016

  System load: 1.19              Memory usage: 2%   Processes:       102
  Usage of /:  67.1% of 1.42GB   Swap usage:   0%   Users logged in: 0

  Graph this data and manage this system at:
    https://landscape.canonical.com/

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

0 packages can be updated.
0 updates are security updates.


Last login: Wed Apr 27 07:38:52 2016 from 192.168.120.1
user@myvnf:~$

今回しようしているVNFのファイアーウォール機能にはiptablesを使用しています。net0からnet1への転送を拒否するように設定を変更します。

user@myvnf:~$ sudo iptables -A FORWARD -i eth1 -o eth2 -j REJECT
user@myvnf:~$ sudo iptables -L
sudo: unable to resolve host myvnf
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

net0-vmからnet1-vmへの疎通を確認してみます。

$ ping 10.10.1.4 -c 5
PING 10.10.1.4 (10.10.1.4): 56 data bytes

--- 10.10.1.4 ping statistics ---
5 packets transmitted, 0 packets received, 100% packet loss

VNFの設定を変更したことにより、net0-vmからnet1-vmへのping疎通ができなくなったことが確認できました。

再度、通信を許可するには以下の様に設定します。

~/devstack$ sudo iptables -D FORWARD -i eth1 -o eth2 -j REJECT

今回はOpenStackでNFVを実現するTackerをご紹介しました。ぜひOpenStack Tackerを使ったNFVの構築にチャレンジしてみて下さい。OpenDaylightと連携するための実装も進められているので、ドキュメントも充実していき、OpenDaylightユーザにとってもますます注目すべきコンポーネントとなっていくでしょう。

株式会社アインザ
主に通信主体の業務に携わり、元々は、企業向けネットワークサービスを提供(主にVPN)する業務に従事し、L2、L3通信機器の設定(主にCisco systems、Alcatel lucent、Alaxala Networks、NEC)、ネットワーク機器の検証などを行ってきた。2015年4月から、ネットワークエンジニアとしての経験より沖縄オープンラボラトリの活動に参加し、OpenStackでのSFC(Service Function Chaining)やOpenDaylightについての調査、主にOpenstack tackerを使っての環境構築、検証に携わる。
著者
安座間 勇二(あざま ゆうじ)
NECソリューションイノベータ株式会社
1991年、沖縄県生まれ。2014年の入社以来、ソフトウェアエンジニアとしてOpenStackでのSFC(Service Function Chaining)やOpenDaylightを使ったSDN/NFVを中心とした開発や検証などに携わる。OpenStack Neutronを中心にコントリビューションしており、OpenStack Summit Tokyo 2015においてSFCのR&Dについて発表。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています