持ち運び出来るクラウド環境を作る Powerd by OpenStack

# この記事はただの夢です（？）
修正も都度かけるかもしれません。殴り書きです。
2018/11/15 初版
2018/11/16 編集リクエスト承認
2018/11/17 修正・追記
2018/11/30 ネットワーク設定部分が不親切だったので修正してわかりやすくしてみました

## まえがき
IT系の企業であれば、社内で使う検証用の環境というのがありますよね。  
通常ならば大きなサーバをラックマウントタイプのものを共有してESXiなどの仮想化基盤で資源分配して使っていることが多いと思います。もしくは、クラウド。  
それとは別にして、持ち運べるデータセンタ的なものが存在します。これは、小型のコンピューターにメモリを大量に載せてマイクロなサーバを想像させるように設計して、客先などでデータセンタの模型のようにして実際に稼働させるなどの用途に利用されることがあります。（だいたいはIntelNUCが使われるのですが）。

今回書くのは、その小型コンピュータに仮想化基盤を載せようというお話。

## OpenStackとは（ざっくり）
  
プライベート環境にクラウド環境を構築出来るオープンソースな環境！
そのシステムは、様々なアプリケーションで成り立っています。
  

|コンポーネント|機能|概要|
|:--|:--:|:--|
|Nova|コンピューティング|仮想マシンの管理を担当している。|
|Glance|イメージ管理|仮想マシンで立ち上げるマシン用のOSイメージ管理を担当する。|
|Cinder|ブロックボリューム管理|物理ディスク管理を担当する。|
|Newtron|ネットワーク管理|プライベートクラウド内のネットワーク管理を担当する|
|Swift|オブジェクトストレージ管理|仮想マシンのストレージ管理を担当する。|
|Keystone|認証情報管理|ログインに使用する情報管理を担当する。| 
|Horizon|WebUI|WebブラウザでアプリケーションとしてGUIを提供する。| 


## こんな構成で作ります  
|Name|Value|
|:--:|:--|
|使用機器|Intel NUC|
|CPU|Intel® Core™ i5-3427U  (3M Cache、Max 2.80 GHz)
|RAM|16GB|
|SSD|248GB|
|OS|CentOS 7|
|IP|192.168.137.254|

## 使用環境

  - 利用想定  
    インターネットに直接接続できない状態である想定  
   （社内ネットとかだとADでログインして証明書持ってないと接続できないとかあるよね）
 
         [ Router ] <---Internetへ---> {{ [ Windows10 ] <---ICS経由---> [ OpenStack ] }}  

  多分こっちがわかりやすい

                インターネットへ
                  { Wi-Fi }
                      |
          [ Client PC - Windows10 ]                           [ Intel NUC - Open Stack]
                      |                                                   |
                 { Ethernet }----------------------------------------{ Ethernet }  
                                --  Internet Connection Share --

※ インターネット側から接続させることは今回想定しておらず、**自分のClient PCからOpenStackへ接続でき**、かつ**OpenStack内に構築するインスタンスがインターネットへ出られる**ようにするということが目的です。
※ **インターネット上から公開したい方**はここから先を見ないほうがいいかもしれません。

## インストール ※OpenStackにするマシンへの操作です。  

1. hostsをいじっておく（これやらないとnovncがうまく動かない）  

    ```
    echo "192.168.1.254  `hostname`" >> /etc/hosts
    ```

1. RDO Packstackリポジトリをインストールする    

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

1.  RDO Packstack からパッケージインストール   
 
    ```
    yum install `yum search centos-release-openstack | grep x86_64 | head -n 1|cut -d " " -f 1`
    ```  

1.  epelとpackstackをインストールする  

    ```
    yum install epel-release openstack-packstack
    ```  

1. SELinuxを無効にする  

    ```
    sed -i "s/SELINUX=.*/SELINUX=permissive/" /etc/selinux/config && setenforce 0
    ```

1.   ipv6を無効にする  

    ```
    echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf
    ```  

1. NetworkManagerを停止(インストール前にやっておかないとなぜかプロセスが止まることがある)  

    ```
    systemctl disable NetworkManager && systemctl enable network  
    systemctl stop NetworkManager && systemctl restart network
    ```  

1.  packstackを使ってOpenStackを立ち上げる   (nohupはリモートコンソールでやるときは入れておくといい)ひたすらnohup.outを見て終わるのを待つ

    ```
    nohup packstack --allinone \
    --cinder-volumes-size=200G \
    --provision-demo=n \
    --os-neutron-ovs-bridge-mappings=extnet:br-ex \
    --os-neutron-ovs-bridge-interfaces=br-ex:eno1 \
    --os-neutron-ml2-type-drivers=vxlan,flat &
    ```

1. 丁寧にログインメッセージを入れてあげましょう   

    ```
    printf "\n#########################\nWellcome to Redhat Open Stack \n#########################\n" > /etc/motd
    cat nohup.out | grep http  >> /etc/motd
    cat keystonerc_admin >> /etc/motd
    cat /etc/motd
    ```

1. KVMを有効にしてやる  

    ```
    grep -E 'svm|vmx' /proc/cpuinfo && modprobe vhost_net && modprobe kvm_intel
    echo "virt_type=kvm" >> /etc/nova/nova.conf && cat  /etc/nova/nova.conf | grep virt_type=
    ```

1.  検証環境用設定   
ネットワークは内部ネットワークと外部ネットワークに分離する。ちなみに、気をつけてほしいのは**NICがブリッジ直付で動作しているのでNATと勘違いしてDNSを設定ミスすると外に出られないなんで～ってなってしまう**。自分はまだテストでやってただけなのでhorizonのWebGUIから設定してしまった。

* ネットワークトポロジー  

```
  |E|                |I|
  |x|                |n|
  |t|      R T       |t|
  |e|------[X]-------|e|
  |r|                |r|--------[M] Instance  
  |n|                |n|
  |a|                |a|--------[M] Instance  
  |l|                |l|
  | |                | |--------[M] Instance  
  |N|                |N|
  |e|                |e|
  |t|                |t|
  | |                | |
--------------------------
```


* Internal network の設定  
* 
```
-  サブネット
サブネット名 : (任意)
ネットワークアドレス : 192.168.1.0/24
ゲートウェイ : 192.168.1.1
-  サブネットの詳細
IPアドレス割り当てプール : (任意)
DNSサーバ :  192.168.1.1と192.168.137.1を設定する
```

* External network の設定  

```
#管理>ネットワーク>ネットワークの順に開いて、右上のネットワークの作成をクリックする


 - ネットワーク
名前 : (任意)
プロジェクト : admin
プロバイダネットワーク種別 : フラット
物理的ネットワーク : extnet
[v] 管理状態有効
[ ] 共有
[v] 外部ネットワーク
[v] サブネットの作成


 -  サブネット
サブネット名 : (任意)
ネットワークアドレス : 192.168.137.0/24
ゲートウェイ : 192.168.137.1


  -  サブネットの詳細
IPアドレス割り当てプール : (任意)
DNSサーバ :  192.168.137.1を設定する
```


これで使えるようになったぁ！！