OpenStack(Newton)環境にTackerを構築する

# はじめに
OpenStackでNFVを実現するTackerをインストールしてみました。Tackerは情報が少なめで、公式のインストール手順通りに行ったらハマったため、私の環境でインストールが成功したときの手順をメモとしてまとめます。

# NFVとTackerについて
NFV(Network Functions Virtualization)は、ETSI（欧州電気通信標準化機構）が定める通信ネットワークを仮想化するためのアーキテクチャを定めた基本仕様で、NTTやKDDIといった通信事業者に大きく注目されています。NFVを活用すると、VM群やネットワーク群をセットにした一括デプロイや削除がワンストップでできるようになります。

そしてTackerは、OpenStack上でNFVを実現する（NovaやNeturonのような）コンポーネントです。NFV関連ではすでに何種類かのOSS製品が存在しますが、OpenStackのコンポーネントという知名度を考えると、TackerはNFV関連の本命になりそうです。

TackerとOpenStackの関係を簡単に表すと下図になります。TackerはNFVO（オーケストレーション）とVNFM（VNFの管理）の機能を担当します。

![OpenStackとtacker.png](https://qiita-image-store.s3.amazonaws.com/0/94561/a769201b-17af-4219-3fb0-846d1cdb1cd8.png)


# 構築メモ
[こちら](http://qiita.com/koyamaru3/items/e8882a4e98d1f7aeda23)で作成したPackstackによるAllInOne環境にTackerをインストールします。
![構成(tacker)_r2.png](https://qiita-image-store.s3.amazonaws.com/0/94561/c0f9a44b-4e66-4f23-f3ff-28724454b24c.png)

- VirtualBoxで作成したCentOS7.2のVM（図の黄色部分）にOpenStackを構築
- OpenStackはPackstackでAllInOneインストール
- CentOS7.2のVMは自宅LANにブリッジ接続（インターネット接続）
- **今回はCentOS7.2のVMにTackerを追加インストールする**


##1. 事前準備
Tackerのインストールで使用するopenstack-configコマンドやpipコマンドを使えるようにする。

```
# yum -y install openstack-utils
# yum -y install python-pip git
```

extension_driversにport_securityを追加して、いったん再起動する。

```
# cd /etc/neutron/plugins/ml2
# openstack-config --set ml2_conf.ini ml2 extension_drivers port_security

# reboot
```

admin権限を持つadmin以外のユーザがフレーバーを作成できるようにするため、"resource_types:OS::Nova::Flavor"を"role:admin"に書き換える。

```
# vi /etc/heat/policy.json
```

```json:policy.json
    "resource_types:OS::Nova::Flavor": "role:admin"
```

##2. Tacker用のユーザやサービスの作成
OpenStackの他のコンポーネントと同じように、Tacker用DBを作成する。

```
# mysql -u root
> CREATE DATABASE tacker;
> GRANT ALL PRIVILEGES ON tacker.* TO 'tacker'@'localhost' IDENTIFIED BY 'password';
> GRANT ALL PRIVILEGES ON tacker.* TO 'tacker'@'%' IDENTIFIED BY 'password';
> exit
```

Tackerのユーザやサービスを登録する。HeatからVNFをデプロイできるようにするため、heat_stack_owner権限も追加する。

```
# cd /root
# source ./keystonerc_admin
# openstack user create --password password tacker
# openstack role add --project services --user tacker admin
# openstack role add --project services --user tacker heat_stack_owner
# openstack service create --name tacker --description "Tacker Project" nfv-orchestration
# openstack endpoint create --region RegionOne --publicurl 'http://192.168.0.159:9890/' --adminurl 'http://192.168.0.159:9890/'  --internalurl 'http://192.168.0.159:9890/' `openstack service show -f value -c id tacker`
```

##3. Tackerのインストール

###3.1 インストール
Newtonのリポジトリをダウンロードしてインストールする。

```
# mkdir /root/work
# cd /root/work
# git clone -b stable/newton https://github.com/openstack/tacker
# cd tacker
# pip install -r requirements.txt
# python setup.py install
# mkdir /var/log/tacker
```

###3.2 設定ファイルの作成
Tackerの設定ファイルを作成する。

```
# cd /usr/etc/tacker
# vi tacker.conf
```

```tacker.conf
[DEFAULT]
auth_strategy = keystone
policy_file = /usr/etc/tacker/policy.json
debug = False
use_syslog = False
bind_host = <HOSTADDR>
bind_port = 9890
service_plugins = nfvo,vnfm
state_path = /var/lib/mysql/tacker

[nfvo]
vim_drivers = openstack

[keystone_authtoken]
memcached_servers = 11211
region_name = RegionOne
auth_type = password
username = tacker
project_name = services
password = password
auth_url = http://<HOSTADDR>:35357
auth_uri = http://<HOSTADDR>:5000

[agent]
root_helper = sudo /usr/bin/tacker-rootwrap /usr/etc/tacker/rootwrap.conf

[database]
connection = mysql://tacker:password@127.0.0.1:3306/tacker?charset=utf8

[tacker]
monitor_driver = ping,http_ping
```

Tackerの設定ファイルの<HOSTADDR>部分に、OpenStackのController NodeのIPアドレスを変更する。

```
# sed -i -e 's/<HOSTADDR>/192.168.0.159/g' tacker.conf
```

tacker.confからTackerのデータベースを作成する。

```
# tacker-db-manage --config-file /usr/etc/tacker/tacker.conf upgrade head
```

###3.3 サービス起動
Tacker起動用スクリプトを作成する。

```
# cd /root/work/tacker
# vi tacker-server.service
```

```tacker-server.service
[Unit]
Description="tacker-server"

[Service]
Restart=always
RestartSec=5

# Set the RUNBIN environment variable
Environment='RUNBIN="/usr/bin/tacker-server"'

# Change directory to service users home
WorkingDirectory="/var/lib/tacker"

# Pre start actions
ExecStartPre=\
  /bin/mkdir -p "/var/run/tacker-server" ;\
  /bin/chown root:root "/var/run/tacker-server" ;\
  /bin/mkdir -p "/var/lock/tacker-server" ;\
  /bin/chown root:root "/var/lock/tacker-server" ;\

PermissionsStartOnly=yes
User=root

# Run the start up job
ExecStart="/usr/bin/tacker-server" --config-file /usr/etc/tacker/tacker.conf --log-file /var/log/tacker/tacker-server.log

KillMode=process

[Install]
WantedBy=multi-user.target
```

Tackerをサービスとして起動する。

```
# cp tacker-server.service /usr/lib/systemd/system/
# systemctl enable tacker-server.service
# systemctl start tacker-server.service
```

Tackerのログ設定ファイルを作成する。

```
# vi logrotate.d_tacker
```

```tacker.log
/var/log/tacker/tacker.log
{
    daily
    dateext
    missingok
    rotate 62
    compress
    delaycompress
    copytruncate
    minsize 100k
}
```

```
# cp logrotate.d_tacker /etc/logrotate.d/tacker
```

###3.4 Tacker ClientとTacker Horizonのインストール
Tacker Clientをインストールする。

```
# cd /root/work
# git clone -b stable/newton https://github.com/openstack/python-tackerclient
# cd python-tackerclient/
# python setup.py install
```

Tacker Horizonをインストールする。

```
# cd /root/work
# git clone -b stable/newton https://github.com/openstack/tacker-horizon
# cd tacker-horizon/
# python setup.py install
# cp openstack_dashboard_extensions/* /usr/share/openstack-dashboard/openstack_dashboard/enabled/
# systemctl restart httpd.service
# systemctl restart openstack-heat-engine.service
```

###3.5 Tacker使用前の準備

以降は追加したtackerアカウントでTackerを操作する。
tackerアカウントの環境設定ファイルを作成する。

```
# vi /root/keystonerc_tacker
```

以下を記述する（OS_AUTH_URLのIPアドレスはKeystoneのIPアドレス）。

```keystonerc_tacker
unset OS_SERVICE_TOKEN
export OS_USERNAME=tacker
export OS_PASSWORD=password
export PS1='[\u@\h \W(keystone_tacker)]\$ '
export OS_AUTH_URL=http://192.168.0.159:5000/v2.0

export OS_TENANT_NAME=services
export OS_IDENTITY_API_VERSION=2.0
```

tackerアカウント用のネットワークを作成する。

```
# source /root/keystonerc_tacker

# openstack network create net_mgmt
# openstack subnet create net_mgmt_subnet \
 --subnet-range 10.0.0.0/24 \
 --allocation-pool start=10.0.0.21,end=10.0.0.100 \
 --gateway 10.0.0.1 \
 --network net_mgmt

# openstack router create net_mgmt_router
# neutron router-gateway-set net_mgmt_router public
# neutron router-interface-add net_mgmt_router net_mgmt_subnet
```


##4. Tackerの動作確認
実際にTackerを操作し、正常にインストールできたかを確認する。

###4.1 VIM(OpenStack)の登録
TackerとOpenStackが連携できるよう、TackerにVIM(OpenStack)を登録する。

- ダッシュボードにtackerアカウント（パスワードはpassword）でログイン
- NFV→NFV ORCHESTRATION→Register VIMを選択
- ダイアログで以下を入力して「Register VIM」ボタンを押す
    - 名前=Default VIM
    - 説明=Default VIM
    - Auth URL=(KeystoneのURL)　ここでは「http://192.168.0.159:5000」
    - Username=tacker
    - パスワード=password
    - プロジェクト名=services
    - ドメイン名=default
    - Defaultにチェックを入れる

![tacker_01.png](https://qiita-image-store.s3.amazonaws.com/0/94561/9d45ef2a-de69-1711-a657-183c0da2d408.png)


###4.2 VNFDの登録
VNFの定義ファイルとなるVNFDを作成する。
任意の場所でVNFD1.yamlを以下の内容で作成する。

```VNFD1.yaml
tosca_definitions_version: tosca_simple_profile_for_nfv_1_0_0

description: VNFD1

metadata:
  template_name: sample-tosca-vnfd

topology_template:
  node_templates:
    VDU1:
      type: tosca.nodes.nfv.VDU.Tacker
      properties:
        image: cirros
        flavor: m1.tiny

    CP1:
      type: tosca.nodes.nfv.CP.Tacker
      properties:
        management: true
        anti_spoofing_protection: false
      requirements:
        - virtualLink:
            node: VL1
        - virtualBinding:
            node: VDU1

    VL1:
      type: tosca.nodes.nfv.VL
      properties:
        network_name: net_mgmt
        vendor: Tacker
```

VNF CatalogにてVNFD1.yamlを登録する。

- NFV→VNF MANAGEMENT→VNF Catalogを選択
- 「+Onboard VNF」ボタンを押す
- ダイアログで以下を入力して「OnBoard VNF」ボタンを押す
    - 名前=VNFD1
    - 説明=VNFD1
    - TOSCA Template Source=TOSCA Template Fileを選択
    - TOSCA Template File=先ほど作成したVNFD1.yamlを選択
 
![tacker_02.png](https://qiita-image-store.s3.amazonaws.com/0/94561/5d1847ff-413c-352c-6c18-3b6d050cac5f.png)

###4.3 VNFインスタンスの作成
作成したVNFDからVNFインスタンスを生成する。

- NFV→VNF MANAGEMENT→VNF Managerを選択
- 「+Deploy VNF」ボタンを押す
- ダイアログで以下を入力して「Deploy VNF」ボタンを押す
    - VNF Name=VNF1
    - 説明=VNF1
    - VNF Catalog Name=VNFD1を選択
    - VIM Name=Default VIMを選択

![tacker_03.png](https://qiita-image-store.s3.amazonaws.com/0/94561/da5bf73d-25da-2384-468d-e6d073bb37fd.png)



###4.4 VNFの起動確認
生成したVNFインスタンスが正しく起動できたか確認する。

- プロジェクト→コンピュート→インスタンスを選択
- 下図のようにcirrosインスタンスが実行状態になっていればOK

![tacker_04.png](https://qiita-image-store.s3.amazonaws.com/0/94561/7a4f5314-7e08-ecc1-8371-e0de2ce1dccf.png)