OpenStack TackerによるNFVオーケストレーション
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つの機能ブロックを持ちます。
- VIM(Virtualized Infrastructure Manager)
- NFVIのコンピューティング、ストレージおよびネットワークリソースの制御、管理を行います
- NFVO(NFV Orchestrator)
- NFVIのオーケストレーションやネットワークサービスのライフサイクルの管理を行います
- 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点を確認します。
- 初期状態のVNFの設定ではnet0からnet1宛のpingが到達すること
- 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ユーザにとってもますます注目すべきコンポーネントとなっていくでしょう。
myvnf-qcow2
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- OpenStack with OpenDaylight(DevStack編)
- RESTCONF APIを使ってフローを書き換えてみる
- OpenDaylightでクラスタを組んでみよう
- OpenStack with OpenDaylight (手動構築編)
- OpenStack Kilo(RDO版)でのMidoNet構築手順(2)
- TackerはVNFFGの柔軟性が向上
- PaaSもIaaSもオンプレミスもいいとこ取り!!Windows Azure Virtual Networksで合わせワザ一本!!
- Openstack Magnumの環境を構築する
- RHEL-OSP6でのDVR環境構築手順
- OpenStack Kilo(RDO版)でのMidoNet構築手順(1)