OpenStack Mitakaの導入 (Win7, Virtual Box, CentOS 7, RDO)

OpenStackを学ぶ必要があり、まずはいろいろと試す環境を構築するため、WindowsノートPCに[All-in-one（RDO）](https://www.rdoproject.org/)インストールで環境構築。その際のメモです。

流れは、Win7 PCにVirtual BoxでCentOSを導入し、Mitakaを導入。その後、GlanceでFedoraのImageを登録し、テストインスタンスを作成し、外部ネットワークにアクセスできるところまでを確認。

順調にいって、3～4時間、実際はいろいろハマるので、1日～2日はかかると思われる。

## 導入したPCのスペック
* ノートPC
* CPU: Corei7 2.9GH, 2コア
* メモリ: 16GB
* ディスク: 512GB SSD
* OS: Windows 7 64bit

## OpenStack環境の構成
* Virtual BoxにてWindows 7上にCentOS7のVMを1台構築
* OpenStackはRed HadのディストリビューションRDOを利用
* Controller, Compute, Networkノードをすべて1台のマシンに導入(All-in-one構成)
* 二つのネットワークをVirtual Boxで作成（[ネットワーク構成ガイド](http://docs.openstack.org/mitaka/install-guide-rdo/environment-networking.html)）
  * Provider Network
      * 外部アクセス用ネットワーク
      * **10.0.2.0/24** （Virtual BoxのNATネットワーク）
      * OpenStackのVMに与えるFloating IPはこのネットワークから与える
  * Management Network
      * Controller/Compute/Networkノードが所属する管理サーバー用ネットワーク
      * 外部にアクセスできないネットワーク
      * **192.168.56.0/24**（Virtual Boxのホストオンリーネットワーク）

## 1. Virtual BoxでのVM作成
[こちら](http://www.kakiro-web.com/memo/virtualbox-create-virtual-machine.html)を参考にVMを作成。
VMの設定は下記の通り（Virtual Boxでの設定順）

#### **1.「新規作成」し、下記の設定でVMを作成**

* メモリ: 8GB
* 仮想ディスク: 100GB, VDI, 可変

#### **2.ホストオンリーネットワークアダプタの作成（Virtual Box側の設定）**
ファイル　→　環境設定　→　ネットワーク でホストオンリーネットワークのタブで作成
  
* 名前: 適当に
* IP: 192.168.56.1
* ネットマスク: 255.255.255.0
* DHCPは無効とする

#### **3.CPU数の設定（VMの設定）**

* VM設定パネルで「システム」を選択し、プロセッサーのタブで設定
* 2コアのCPUなので、2コアまで使用するように設定

#### **4.ネットワークアダプタの設定（VMの設定）**
ネットワークアダプタは下記の二つ。ホストOS（Windows）から、ゲストOS（CentOS）にアクセスでき、かつ、CentOSから外部ネットワークにアクセスできる構成とした。

1. NAT
  * デフォルト
  * VM(CetnOS7)が、外部ネットワークに接続するためのNATを行うアダプタ
  * Virtual Box(Win)のデフォルトでは10.0.5.0/24が割り当てられる
  * Provider Network
2. ホストオンリー
  * ゲストOS（CentOS）とホストOSの間で通信するためのネットワークアダプタ
  * 192.168.56.1/24を設定
  * **プロミスキャスモードを「すべて許可」に設定。（重要、ネストされたOpenStack上のVMが外部と通信するために必要な設定）**
  * Management Netowrk

## CentOS 7のインストール
#### 1. CentOSダウンロード
* CentOS 7.2 をダウンロード: [ダウンロード先](http://ftp.iij.ad.jp/pub/linux/centos/7.2.1511/isos/x86_64/)
* Minimal Installで良い

#### 2. VMの光学ドライブにCentOSのImage Fileをセット
VMの設定から「ストレージ」を選択し、ISOファイルをセット

#### 3. VMを起動し、インストール実施
VMを起動すると、CentOSのインストーラーが自動で起動するので、ガイドに従って、インストール。[こちら](http://www.kakiro-web.com/memo/centos-install.html)を参照。

* 言語: English
* Date & Time: Tokyo/Asia
* キーボード: Japanese
* Install タイプ: Minimal
* rootのパスワードをセットし、新規Userを作成

インストール後、CentOSを起動。

## CentOSの設定
OpenStackインストール前に、ネットワークの設定やFirewall無効化、OSのUpdate等を実施。

#### **1. ネットワークの設定**
##### 1.1. NICの確認
enp0s3（NAT）, enp0s8（ホストオンリー）の二つが認識されていることを確認

```
$ sudo ip addr
```

##### 1.2. NICの設定
/etc/sysconfig/network-scripts/にある、ifcfg-enp0s3, ifcfg-enp0s8を下記の通り編集

[ifcfg-enp0s3]
DHCPでIPが割り振られるように設定

```
TYPE=Ethernet
BOOTPROTO=dhcp
NAME=enp0s3
DEVICE=enp0s3
ONBOOT=yes
```

[ifcfg-enp0s8]
固定IPをセット。192.168.56.100とし、**OpenStackの各サービスのエンドポイントはこのIPを使用**する。

```
TYPE=Ethernet
BOOTPROTO=static
NAME=enp0s8
DEVICE=enp0s8
ONBOOT=yes
IPADDR=192.168.56.100
NETMASK=255.255.255.0
```

##### 1.3. ネットワークの設定確認
ネットワークをリスタートし、設定内容を確認。その後、VMから外部へ接続が可能となるので、pingで確認。<br>

また、**ここまで設定できていると、TeraTerm等でSSH接続可能なので、SSH接続も確認**する。

```
$ systemctl restart network.service
$ ip addr show enp0s3
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:d8:ae:9d brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic enp0s3
       valid_lft 86134sec preferred_lft 86134sec
    inet6 fe80::a00:27ff:fed8:ae9d/64 scope link
       valid_lft forever preferred_lft forever

$ ip addr show enp0s8
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:88:36:55 brd ff:ff:ff:ff:ff:ff
    inet 192.168.56.100/24 brd 192.168.56.255 scope global enp0s8
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe88:3655/64 scope link
       valid_lft forever preferred_lft forever

$ ping yahoo.co.jp
PING yahoo.co.jp (183.79.135.206) 56(84) bytes of data.
64 bytes from f1.top.vip.kks.yahoo.co.jp (183.79.135.206): icmp_seq=1 ttl=43 time=38.8 ms
64 bytes from f1.top.vip.kks.yahoo.co.jp (183.79.135.206): icmp_seq=2 ttl=43 time=37.9 ms
```
#### **2. CentOS Update**
OSを最新の状態にし、reboot。

```
$ yum -y update
$ shutdown -r now
```
#### **3. NTPのインストール**

```
$ yum -y install ntp
$ systemctl start ntpd
$ systemctl enable ntpd
```

#### **4. カーネルパラメータの変更**
/etc/sysctl.conf ファイルを編集して、以下のパラメーターを追加

```
net.ipv4.ip_forward = 1
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.bridge.bridge-nf-call-arptables = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
```

設定を反映。

```
$ sysctl -p
```

#### **5. SELINUXの無効化**
/etc/selinux/configを編集して、enforcing をpermissiveに変更

```
SELINUX=permissive
```
#### **6. Network Managerの無効化**

```
$ systemctl disable NetworkManager
$ systemctl stop NetworkManager
```
## RDOでのOpenStackのインストール
RDOの[quick start guide](https://www.rdoproject.org/install/quickstart/)を元に、OpenStackをインストールする。
#### **1. RDOリポジトリのセットアップ**

```
$ yum install -y https://rdoproject.org/repos/rdo-release.rpm
```

#### **2. Packstack Installer セットアップ**

```
$ yum install -y openstack-packstack
```
#### **3. Answer file作成**

```
$ packstack --gen-answer-file=answer.txt
```

#### **4. Answerfileの編集**
デフォルトでインストールされないサービスを必要に応じて、インストールするように設定

```
CONFIG_MANILA_INSTALL=y
CONFIG_SAHARA_INSTALL=y
CONFIG_HEAT_INSTALL=y
CONFIG_TROVE_INSTALL=y
```

各サービスのエンドポイントで使用されるIPアドレスを、管理用ネットワークのNICのIPアドレスに変更。
（Packstackで自動作成された、Answer fileでは、一つ目のNIC：enp0s3のIPアドレス(10.0.2.15)がデフォルトで設定される。
今回の構成では、二つ目のNIC：enp0s8のIPアドレス(192.168.56.100)を設定する。）

vi エディタで下記のように置換。

```
:%s/10.0.2.15/192.168.56.100/gc
```

各サービスのパスワードを変更。デフォルトのままでも良く、Answer Fileに記載されているので、わからなくなってもあとから確認は可能。

#### **5. OpenStackのインストール**
下記のコマンドを実行し、OpenStackをインストール。30分～1時間でインストールが完了。

```
$ packstack --answer-file=answer.txt
```

#### **6. OpenStack Dashboardの確認**
下記にアクセスして、User ID: admin、パスワードはAnswer Fileで設定したパスワードでLogin。
adminのパスワードは`~/keystonerc_admin`に書かれているので、確認可能。

```
http://192.168.56.100/dashboard/
```

ダッシュボード確認できれば、ひとまずインストールは成功。
![2016-04-20_18h37_54.png](https://qiita-image-store.s3.amazonaws.com/0/86169/cd7cf4c0-5a65-f8a4-d69a-a3056740700a.png)

#### **7. 各サービスのステータス確認**
下記コマンドで、インストールしたOpenStackの各サービスのステータスがAliveであることを確認する。（OpenStackのコマンドラインツールでOpenstackを操作するために、admin用の環境変数を読み込み、ステータスを確認。）

```
$ source keystonerc_admin
$ openstack-status
```

#### **8. 仮想ブリッジ: br-ex の設定**
RDOでのOpenStackインストール直後は、インスタンスが外部ネットワークにアクセスするルートが設定されていないので、設定する。Open vSwitchで仮想ブリッジ：br-exを作成し、外部ネットワークに繋がっているenp0s3を接続するように設定する。

ifcfg-enp0s3をコピーして、ifcfg-br-exを作成。

```
cp ifcfg-enp0s3 ifcfg-br-ex
```

ifcfg-enp0s3を下記のように設定。

```
TYPE=OVSPort
NAME=enp0s3
DEVICE=enp0s3
ONBOOT=yes
DEVICETYPE=ovs
OVS_BRIDGE=br-ex
```

 ifcfg-br-exを下記のように設定。OVSの仮想ブリッジにDHCPでIPを割り当てるため、
 OVSBOOTPROTO, OVSDHCPINTERFACESを設定。

 ```
 TYPE=OVSBridge
 OVSBOOTPROTO=dhcp
 OVSDHCPINTERFACES=enp0s3
 NAME=br-ex
 DEVICE=br-ex
 DEVICETYPE=ovs
 ```

 設定後、ネットワークをリスタート。

 ```
$ systemctl restart network.service
```

仮想ブリッジbr-exにNIC enp0s3が接続されていることを確認。

```
$ ovs-vsctl show
･･･
Bridge br-ex
     Port br-ex
         Interface br-ex
             type: internal
     Port "enp0s3"
         Interface "enp0s3"
 ovs_version: "2.4.0"
```

## テストインスタンスの作成
admin ユーザーでテストインスタンスを作成し、SSHで外部からアクセスできること、また、インスタンス内部から外部ネットワークにアクセスできることを確認する。

#### **1. 既存ネットワークの削除**
RDOでインストールすると、172.24.4.228/28というPublicネットワークが作成されていたが、ホストOSのWindowsからインスタンスにアクセスできるように、10.0.2.0/24をPublicネットワークとするように作り変える。

既存のPublic Networkには、demo tenantのルーター（router1）に接続されているため、このルーターとの接続を解除し、その後、Public Networkを削除する。削除は、adminでログインし、ルーター、および、ネットワークの設定画面（「管理」→「ルーター」「ネットワーク」）で行う。

![2016-04-21_10h20_38.png](https://qiita-image-store.s3.amazonaws.com/0/86169/05cad632-0012-e360-013a-df7dff15219a.png)

#### **2. Public Networkの作成**
同じ画面で、下記の通り外部接続用のPublic Networkを作成する。

![2016-04-21_11h20_04.png](https://qiita-image-store.s3.amazonaws.com/0/86169/744e172a-bd1c-9211-03cd-4c21c0930834.png)

プロジェクトのネットワーク設定画面（「プロジェクト」→「ネットワーク」→「ネットワーク」）にて、サブネットを追加する。

![2016-04-21_11h24_30.png](https://qiita-image-store.s3.amazonaws.com/0/86169/84d17b34-0075-7c0b-c33c-51b9bf9453e0.png)

* サブネット
  * ネットワーク名: Public_subnet
  * ネットワークアドレス: 10.0.2.0/24
  * ゲートウェイIP: 10.0.2.15
* サブネット詳細
  * DHCP有効
  * IP割当プール: 10.0.2.20,10.0.2.50 （とりあえず、20個）
  * DSN IP: 8.8.8.8（Googleのネームサーバー）


#### **3. Private Network作成**
インスタンスに割り当てるプライベートネットワークを作成する。設定は下記のように行った。

* ネットワーク
  * ネットワーク名: private
  * サブネット作成にチェック
* サブネット
  * ネットワーク名: private_subnet
  * ネットワークアドレス: 192.168.1.0/24
  * ゲートウェイIP: 192.168.1.1
* サブネット詳細
  * DHCP有効
  * IP割当プール: 192.168.1.10,192.168.1.30 （とりあえず、20個）
  * DSN IP: 8.8.8.8（Googleのネームサーバー）
 
#### **4. 仮想ルーター作成**
ルーター設定画面で、ルーターを新規作成。その後、「ゲートウェイの設定」でPublic Networkを、「インターフェースの追加」でPrivate Networkを接続する。

ネットワークトポロジーを見ると下記のように、ルーターにPublic/Private Networkが接続されていることが分かる。

![2016-04-21_13h24_34.png](https://qiita-image-store.s3.amazonaws.com/0/86169/67726779-898e-c341-744d-44d744c98e5c.png)


#### **5. OS Imageの登録**
Glanceに起動するインスタンスのImageを登録。[FedoraのOpenStack向けの公式Image](https://getfedora.org/cloud/download/)をダウンロードして使用することにする。

![2016-04-21_11h36_52.png](https://qiita-image-store.s3.amazonaws.com/0/86169/df3c3bba-3d4c-6b2c-b35a-79fc6e4ef543.png)

ダウンロード後、イメージ管理画面で、「イメージの作成」ボタンからImageを登録する。

![2016-04-21_11h39_15.png](https://qiita-image-store.s3.amazonaws.com/0/86169/b167d274-c03f-95db-e6e1-bc30bceb0f58.png)

#### **6. セキュリティーグループの設定**
デフォルトで用意されている「default」にセキュリティーポリシーを追加し、ICMPとSSHの受信を許可するようにする。（これを行わないと、インスタンスにPing, SSH接続ができない。）

「コンピュート」→「アクセスとセキュリティー」→「セキュリティーグループ」とたどり、「ルールの管理」にてALL ICMPとSSHを追加。

![2016-04-21_11h42_53.png](https://qiita-image-store.s3.amazonaws.com/0/86169/4294bbd2-b4cc-d198-e955-3665f5a7d429.png)

#### **7. キーペアの追加**
SSH接続するためのキーペアを追加する。Horizon上でキーペアを追加し、Windows PCへダウンロードするとWindows上でキーの変換を行う必要があるので、CentOS上でキーペアを作成し、OpenStackへ登録するようにする。ホームディレクトリに秘密鍵が作成されていることを確認。

```
$ source keystonerc_admin
$ nova keypair-add admin > admin_key.pem  　→ キーペア名: admin, 秘密鍵名: admin_key.pem
$ ls -l
-rw-r--r--. 1 root root  1688 Apr 17 23:40 admin_key.pem
-rw-------. 1 root root  1184 Feb 26 14:37 anaconda-ks.cfg
-rw-------. 1 root root 48576 Apr 17 20:26 answer.txt
-rw-r--r--. 1 root root  1684 Apr 17 22:44 demo_key.pem
-rw-------. 1 root root   233 Apr 17 23:40 keystonerc_admin
-rw-------. 1 root root   233 Apr 17 22:43 keystonerc_demo
```

#### **8. インスタンス作成**
「コンピュート」→「インスタンス」より「インスタンスの起動」を押して、起動するインスタンスのパラメータを設定し、インスタンスを作成。

* ソース
  * Fedora
* フレーバー
  * m1.small
* ネットワーク
  * Private
* セキュリティーグループ
  * default
* キーペア
  * admin 

![2016-04-21_11h52_04.png](https://qiita-image-store.s3.amazonaws.com/0/86169/a5125b68-e5fa-d8b0-442b-9ef58b0b6b53.png)

#### **9. Floating IPの設定**
作成したインスタンスのメニューから「Floating IPの割り当て」を選択し、IPの割当を行う。Private IPがNAT変換され、割り当てられたPublic IPで外部に接続しにいくことになる。

![2016-04-21_12h59_18.png](https://qiita-image-store.s3.amazonaws.com/0/86169/6931cf47-2ebf-98c5-650f-fa4576fba607.png)


結果、インスタンスには下記のIPが割り振られた。

* Floating IP
  * 10.0.2.22
* Private IP
  * 192.168.1.13

#### **10. テストインスタンスへのアクセス**
CentOS上から秘密鍵を使ってSSHで接続可能であることを確認する。Fedora公式ImageのUser IDは「fedora」が設定されているので、このIDでLogin。その後Login後、pingでインスタンスから外部にアクセス可能なことを確認。

```
$ ping 10.0.2.22
PING 10.0.2.22 (10.0.2.22) 56(84) bytes of data.
64 bytes from 10.0.2.22: icmp_seq=1 ttl=63 time=0.990 ms
64 bytes from 10.0.2.22: icmp_seq=2 ttl=63 time=0.559 ms
64 bytes from 10.0.2.22: icmp_seq=3 ttl=63 time=1.36 ms

$ chmod 600 admin_key.pem             → パーミッションを変更しないとSSHで接続できない。
$ ssh -i admin_key.pem fedora@10.0.2.22　　→ 公式イメージのUser IDは「fedora」

[fedora@test ~]$                      → ログイン成功
[fedora@test ~]$ ping www.yahoo.co.jp
PING www.g.yahoo.co.jp (182.22.71.251) 56(84) bytes of data.
64 bytes from f8.top.vip.ssk.yahoo.co.jp (182.22.71.251): icmp_seq=1 ttl=43 time=21.6 ms
64 bytes from f8.top.vip.ssk.yahoo.co.jp (182.22.71.251): icmp_seq=2 ttl=43 time=21.9 ms
64 bytes from f8.top.vip.ssk.yahoo.co.jp (182.22.71.251): icmp_seq=3 ttl=43 time=21.3 ms
```

RDOでAll-in-oneインストールといえど、いろいろはまりどころがある印象でした。特に仮想ネットワーク周りの知識が弱かったので、ネットワーク周りの設定に苦労しました。