OpenStack Kolla(Ocata)環境の構築

# はじめに

最近にわかに注目を集めているコンテナ版のOpenStack（OpenStack Kolla）をインストールしてみました。
基本的には公式のインストール手順で行けるのですが、ハマる要素もいくつかあったのでメモとしてまとめました。

<font color="red">2017-11-18追記
Pike版だとデプロイ中にエラーが発生します。[こちら](https://qiita.com/raichi/items/71869442e8101fd38230)の手順の方が成功率が高いです。</font>

# OpenStack Kollaとは

NovaやNeutronといったOpenStackの各コンポーネントをDockerコンテナの形態でデプロイするプロジェクトです。
通常のデプロイ手順だと、OpenStackのバージョンアップ等で再インストールする場合にホストのOS再インストールから必要になりますが、Dockerコンテナの形態だとホストOSの再イントールを必要とせず、コンテナのイメージを入れ替えるだけでバージョンアップができる点で便利と言えます（試したことはありませんが）。



・参考にしたURL：
　　公式ドキュメント(Quick Start)
　　https://docs.openstack.org/developer/kolla-ansible/quickstart.html

　　OpenStack Kolla を Macbook Air にインストールしてみた
　　http://qiita.com/radedance/items/ba656f69fad407097efc


# 環境構成

MACのVirtualBox上に作成したCentOS7.3のVMに、AllInOne構成で構築しました。
VMは以下の条件で作成しました。
　・VM名：Kolla_Ocata
　・CPU数：2CPU
　・メモリ：8GB（最低条件として8GB必要）
　・仮想ハードディスク：100GB（最低条件として40GB必要）
　・ネットワーク：以下の2つを作成（最低条件として2つ必要）
　　　(1)「ブリッジアダプター」・・・ダッシュボードアクセス用
　　　(2)「内部ネットワーク」・・・Publicネットワーク用

![Kolla_Network4.png](https://qiita-image-store.s3.amazonaws.com/0/94561/c491260c-d248-a175-7ca3-6a335b00108d.png)

ちょっとわかりにくいですが、OpenStackのダッシュボードへは自宅LANの192.168.0.159へ、OpenStack Novaが生成するインスタンスにはPublicネットワーク上のFloating IPへ接続するようにします。


# 構築メモ
# 1. VMにCentOS7.3をインストール

余計なものは入れず、最小限のインストールを行う。
インストーラ上では主に以下の設定を行った。
　・SECURITY POLICY：Apply security policyをオフ
　・ソフトウェアの選択は「最小限のインストール」（何もチェックを付けない）
　・ネットワークとホスト名
　　　・イーサネット(enp0s3)をオン、方式=手動、192.168.0.159を設定（ダッシュボードアクセス用）
　　　・イーサネット(enp0s8)をオン、方式=手動、IPアドレス設定なし（Publicネットワーク用）
　・ホスト名：kolla

インストール完了後、ファイアウォールの無効化と英語ロケール設定を行う。

```
$ sudo systemctl disable firewalld
$ sudo systemctl stop firewalld

$ sudo echo "LANG=en_US.utf-8" > /etc/environment
$ sudo echo "LC_ALL=en_US.utf-8" >> /etc/environment
$ sudo reboot
```

# 2. インストール前準備

以降はVirtualBoxのVMにSSHログインし、rootアカウントで実施する。

## 2.1 gitのインストール

```
# cd /root
# yum install -y git
```

## 2.2 EPELとPIPのインストール

```
# yum install -y epel-release
# yum install -y python-pip
# pip install -U pip
# yum install -y python-devel libffi-devel gcc openssl-devel
```

## 2.3 Ansibleのインストールとアップグレード

```
# yum install -y ansible
# pip install -U ansible
```

バージョンが2.0以上であることを確認する。

```
# ansible --version
ansible 2.3.0.0
  config file = /etc/ansible/ansible.cfg
  configured module search path = Default w/o overrides
  python version = 2.7.5 (default, Nov  6 2016, 00:28:07) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]
```

## 2.4 Dockerのインストール

```
# curl -sSL https://get.docker.io | bash
# docker --version
Docker version 17.04.0-ce, build 4845c56
```

## 2.5 Dockerをsystemdに登録

```
# mkdir -p /etc/systemd/system/docker.service.d
# tee /etc/systemd/system/docker.service.d/kolla.conf <<-'EOF'
[Service]
MountFlags=shared
EOF
```

Dockerを再起動する。

```
# systemctl daemon-reload
# systemctl enable docker
# systemctl restart docker
```

## 2.6 Docker Pythonのインストールとアップグレード

```
# yum install -y python-docker-py
# pip install -U docker-py
```

## 2.7 NTPのインストール

```
# yum install -y ntp
# systemctl enable ntpd.service
# systemctl start ntpd.service
# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*sv01.azsx.net   10.84.87.146     2 u    2   64    1    6.992   -0.183   1.114
 chobi.paina.net 131.113.192.40   2 u    1   64    1    5.951    0.167   0.791
 mmm21.wni.co.jp 172.16.20.210    3 u    2   64    1    6.948   -1.208   0.422
 x.ns.gin.ntt.ne 249.224.99.213   2 u    1   64    1   16.135    2.059   1.075
```

## 2.8 libvirtdが動いていたら止める

```
# systemctl stop libvirtd.service
# systemctl disable libvirtd.service
```

# 3. Kollaのインストール
ここから、Kolla関連の構築を行います。今回はイメージのビルドは行わず、公開されているイメージを利用する方法で実施します。

## 3.1 kolla-ansibleのインストール

2017年5月時点におけるkolla-ansibleの最新版は4.0.1だが、4.0.1に対応するkolla-toolboxが存在しないため（後述のdocker pullでエラーになる）、4.0.0を指定した。

```
# pip install kolla-ansible\==4.0.0
# cp -r /usr/share/kolla-ansible/etc_examples/kolla /etc/kolla/
# cp /usr/share/kolla-ansible/ansible/inventory/* .
```

## 3.2 コンフィグ編集

```
# vi /etc/kolla/globals.yml
```

・「Kolla options」のすぐ下に、HA設定を無効化する設定を追加する。
　（デフォルトではHA設定が有効になっているが、追加のIPアドレスを必要とするためHA設定を無効化する）

```
enable_haproxy: "no"
```

・「kolla_internal_vip_address」に、ダッシュボードアクセス用のIPアドレスを指定する。

```
kolla_internal_vip_address: "192.168.0.159"
```

・「network_interface」のコメントアウトを外し、ダッシュボードアクセス用のインターフェース名を指定する。

```
network_interface: "enp0s3"
```

・「neutron_external_interface」にはPublicネットワーク用のインターフェース名を指定する。

```
neutron_external_interface: "enp0s8"
```

・一緒に入れたいコンポーネントのコメントアウトを外し、yesを設定する。
　今回はMagnumとMistralを一緒に入れてみました（お好みで）。

```
enable_magnum: "yes"
enable_mistral: "yes"
```

## 3.3 パスワードファイル作成

```
# kolla-genpwd
```
/etc/kolla/passwords.ymlが作成される。

## 3.4 kolla.confの編集

```
# vi /etc/systemd/system/docker.service.d/kolla.conf
```

以下のように編集して保存する。

```
[Service]
MountFlags=shared
ExecStart=
ExecStart=/usr/bin/docker daemon
```

Dockerを再起動する。

```
# systemctl daemon-reload
# systemctl restart docker
```

## 3.5 DockerイメージのPull

```
# kolla-ansible pull
```

以下のコマンドで、ダウンロードしたイメージの一覧を確認できる。

```
# docker images
REPOSITORY                                      TAG                 IMAGE ID            CREATED             SIZE
kolla/centos-binary-neutron-server              4.0.0               8dedaf87d819        7 weeks ago         727MB
kolla/centos-binary-nova-compute                4.0.0               35da27fc5586        7 weeks ago         1.23GB
kolla/centos-binary-neutron-openvswitch-agent   4.0.0               d276dcdfcbb6        7 weeks ago         727MB
kolla/centos-binary-neutron-metadata-agent      4.0.0               e1c0bf5f7745        7 weeks ago         703MB
kolla/centos-binary-heat-api                    4.0.0               66332a0e6ad4        7 weeks ago         644MB
kolla/centos-binary-neutron-dhcp-agent          4.0.0               445442cd0f01        7 weeks ago         703MB
kolla/centos-binary-neutron-l3-agent            4.0.0               445442cd0f01        7 weeks ago         703MB
kolla/centos-binary-heat-api-cfn                4.0.0               ce92766d3ff1        7 weeks ago         644MB
kolla/centos-binary-nova-ssh                    4.0.0               3b0f5591ecc8        7 weeks ago         723MB
kolla/centos-binary-nova-placement-api          4.0.0               8a16c227e835        7 weeks ago         755MB
kolla/centos-binary-nova-conductor              4.0.0               65a844b9889e        7 weeks ago         703MB
kolla/centos-binary-nova-api                    4.0.0               d90b06229654        7 weeks ago         755MB
kolla/centos-binary-nova-consoleauth            4.0.0               487d0b6926d3        7 weeks ago         704MB
kolla/centos-binary-nova-scheduler              4.0.0               92bdcfc854ac        7 weeks ago         703MB
kolla/centos-binary-nova-novncproxy             4.0.0               7f246ab0d8f5        7 weeks ago         704MB
kolla/centos-binary-mistral-api                 4.0.0               dea0beefd398        7 weeks ago         747MB
kolla/centos-binary-kolla-toolbox               4.0.0               d771b993a59b        7 weeks ago         730MB
kolla/centos-binary-keystone                    4.0.0               9b0c48681973        7 weeks ago         677MB
kolla/centos-binary-magnum-conductor            4.0.0               013fa86c2b71        7 weeks ago         804MB
kolla/centos-binary-glance-registry             4.0.0               68da81d330c4        7 weeks ago         757MB
kolla/centos-binary-horizon                     4.0.0               dc5a666631eb        7 weeks ago         863MB
kolla/centos-binary-cron                        4.0.0               74a89fe112f0        7 weeks ago         418MB
kolla/centos-binary-openvswitch-db-server       4.0.0               37f21379cad8        7 weeks ago         440MB
kolla/centos-binary-heat-engine                 4.0.0               ab9138c4719c        7 weeks ago         644MB
kolla/centos-binary-glance-api                  4.0.0               bc61de7fba03        7 weeks ago         816MB
kolla/centos-binary-mistral-executor            4.0.0               692e80061a81        7 weeks ago         747MB
kolla/centos-binary-mistral-engine              4.0.0               b958be6864c7        7 weeks ago         747MB
kolla/centos-binary-magnum-api                  4.0.0               3ab836582293        7 weeks ago         762MB
kolla/centos-binary-fluentd                     4.0.0               5b98e39f1285        7 weeks ago         720MB
kolla/centos-binary-nova-libvirt                4.0.0               b21c5bacfbcf        7 weeks ago         966MB
kolla/centos-binary-openvswitch-vswitchd        4.0.0               b047dd6e83cd        7 weeks ago         440MB
kolla/centos-binary-memcached                   4.0.0               927246be7bd2        7 weeks ago         418MB
kolla/centos-binary-rabbitmq                    4.0.0               c9e9af5a39b9        7 weeks ago         477MB
kolla/centos-binary-mariadb                     4.0.0               7c9305397257        7 weeks ago         808MB
```

## 3.6 Novaの設定


```
# egrep -c '(vmx|svm)' /proc/cpuinfo
0
```

上記で0が返った場合は以下を設定する（VirtualBoxのVMの場合は0が返るはず）。

```
# cat << EOF > /etc/kolla/config/nova/nova-compute.conf
[libvirt]
virt_type = qemu
cpu_mode = none
EOF
```

## 3.7 デプロイ

```
# kolla-ansible prechecks -i all-in-one
```

プリチェックでエラーにならなければデプロイする。

```
# kolla-ansible deploy -i all-in-one
```

デプロイ完了後、以下を実行する。

```
# kolla-ansible post-deploy
```

## 3.8 OpenStack環境の初期設定

OpenStack Clientをインストールする。

```
# pip install python-openstackclient
```

続けて以下を実行する。
（途中で聞かれるパスフレーズは何も入力せずエンターキー押下しても問題ないです）

```
# . /etc/kolla/admin-openrc.sh
# cd /usr/share/kolla-ansible
# ./init-runonce
```

初期設定完了後、以下を実行してログインパスワードを確認する。

```
# env | grep OS_
OS_USER_DOMAIN_NAME=default
OS_PROJECT_NAME=admin
OS_IDENTITY_API_VERSION=3
OS_PASSWORD=djHvbaN8ns8gqFm4MUqHAc5X6vD6PEt8u8AZil6Z
OS_AUTH_URL=http://192.168.0.159:35357/v3
OS_USERNAME=admin
OS_TENANT_NAME=admin
OS_INTERFACE=internal
OS_PROJECT_DOMAIN_NAME=default
```

OS_PASSWORDの値が、ダッシュボードのログインパスワードとなる。

# 4. 動作確認

## 4.1 ダッシュボードにログイン

ブラウザでダッシュボード（http://192.168.0.159 ）を開き、adminでログインする。

![login.PNG](https://qiita-image-store.s3.amazonaws.com/0/94561/ac0708ed-48c2-083b-1abd-cdd2a456b40a.png)

## 4.2 テスト用インスタンス生成

プロジェクト→コンピュート→インスタンスを選択し、「インスタンスの起動」をクリック。
以下の設定を行い、「インスタンスの起動」をクリックしてインスタンスを作成する。
　・詳細タブのインスタンス名：Server1
　・ソースタブのイメージ：cirrosを選択
　・フレーバータブ：m1.tinyを選択
　・ネットワークタブ：demo-netを選択

インスタンス作成後、Floating IPもインスタンスに設定する。

以下のようにテスト用にインスタンスを２個作成しました。

![instance.PNG](https://qiita-image-store.s3.amazonaws.com/0/94561/e4f48a6e-852b-478e-9982-6ae122a17cdb.png)


## 4.3 セキュリティーグループ設定

プロジェクト→ネットワーク→セキュリティーグループを選択し、defaultのセキュリティグループに以下のルールを追加。
　・ルール：すべてのICMP、方向：送信

## 4.4 Publicネットワーク設定

構築直後はPublicネットワークへのアクセス用のブリッジが未設定のため、ホストOS上で以下を設定する。

```
# ip addr add 10.0.2.1/24 dev br-ex
# ip link set br-ex up
# ip route add 10.0.2.0/24 dev br-ex
```

しばらくすると、ホストOS上からインスタンスのFloating IPへのpingが通るようになる。

```
# ping 10.0.2.157
PING 10.0.2.157 (10.0.2.157) 56(84) bytes of data.
64 bytes from 10.0.2.157: icmp_seq=1 ttl=63 time=2.20 ms
64 bytes from 10.0.2.157: icmp_seq=2 ttl=63 time=0.540 ms
64 bytes from 10.0.2.157: icmp_seq=3 ttl=63 time=0.565 ms
64 bytes from 10.0.2.157: icmp_seq=4 ttl=63 time=0.583 ms
```


これで一通り使える環境が整いました。
別の機会に、イメージビルドして構築する手順も試してみたいと思います。