OpenShift Origin Minishift を CentOS 7.3 on VMware Workstationに入れてみた

# OpenShift Origin Minishiftとは
RedHat社が提供するOpenShift環境のOrigin(RedHatからみたfedora的な位置づけのOSSプロダクト）、検証環境です。

オフィシャルサイト： [OpenShift Origin - Minishift](https://docs.openshift.org/latest/minishift/index.html)

OpenShiftでは、PaaS開発環境としてS2Iという機能がある他、
Docker + Kubernetesの上に成り立つプラットフォームで、コンテナオーケストレーションがすごいプロダクトです。
盛大な開発環境を用意しなくとも、minimumでこのopenshiftを使えますよ。というものです。

KVMや、Hyper-V、xhyveなど仮想環境上に、VMをロードし、仮想マシン＋コンテナを動かして、
OpenShiftのコンポーネントさえもdockerイメージで動かしてしまうようです。
（このあたりの概要はまだ完全な理解で無いため、意図が正しくない場合はすいません）

# Minishiftのインストールできるバリエーション
どれがオススメというわけではありませんが、１、２は私が実際に導入までこぎつけました。
３，４，は私の環境特有の問題ということで、断念です。

1. macbook(xhyve)に入れる。
home brewを使ってインストール出来るので割りと考慮点なくサクッと入ったイメージ。
実は初めて使ったのですがxhyveという仮想環境をhomebrewの上で構築されます。
後日書く予定。

2. KVM based linuxに入れる。
今回の記事。
ただし、実機ではなく、VMware Workstation上に。
この記事ではOpenShift Originを入れることをメインに書きますが、
VMware Workstationなどの仮想環境に入れた際に考慮するポイントを書きます。   

3. Windows Hyper-V上に入れる
実はVMware Workstationに入れようとしてうまく行かなくて、
Hyper-VとVMware Workstation共存環境作ろうとしたのですが・・・　諦めました。
(Device Guardまわりで、VMware Workstationの方に影響したので)

4. Windows Virtual Boxに入れる
3と理由は同じで検討しましたが、Hyper-V入れたあとVMware WorkstationのVMが全て動かなくなり、
半泣きになったので諦めました。

実際にはmacbookで遊んでいるのですが、広いデスクトップでもopenshiftであそびたーい！ということで、Windows10上にVMで立ててみることとしました。
今回はうまくWindows nativeに建てられなかったので、もう少し課題が残っていますが起動するところまではこぎつけたので記録と紹介を兼ねてUpです。

# インストールに使用した環境
##ホストOS
|環境|構成|
|:--|:--|
|Host OS|Windows 10 Pro 64 Bit|
|Hypervisor|VMware Workstation Pro12|

##ゲストOS
|環境|構成|
|:--|:--|
|GustOS|CentOS 7.3 64bit|
|Guest vCPU| 2core|
|Guest vMem| 8GB|
|Guest vHDD|100GB|
|Guest vNIC| Bridge|

# ゲストOSのインストール
## ゲストVMの設定

1. 新規マシンウィザードからVM生成を開始します。
「カスタム」を選択し、「次へ」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/70c923e1-42f1-f057-0d7f-258cb1cf5032.png)

1. 仮想マシンのハードウェア互換性の選択
ハードウェア互換性を「Workstation 12.x」のままで「次へ」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/2d3285a9-5f9a-c9d2-9c06-49c78b83cb29.png)

1. ゲストOSのインストール
「後でOSをインストール」を選択し、「次へ」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/c2e97060-886d-3d6c-0f3f-d5b6cfd55a94.png)

1. ゲストOSの選択
ゲストOS「Linux」、バージョン「CentOS 64 ビット」を選択し、「次へ」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/3bf273dd-73a6-0630-0166-93eda363a02b.png)

1. 仮想マシンの名前
適当な名前、適当な場所を指定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/78afc9ac-9abe-b08a-2bd8-d494c29b6196.png)

1. プロセッサ構成
プロセッサ数「2」、プロセッサごとのコア数「1」としますが、
環境と必要数にそって変更してください。
指定後、「次へ」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/50f7f956-27f7-0722-7c10-2ca1fbdde964.png)

1. 仮想マシンのメモリ
今回は8GB分、「8192 MB」を指定し、「次へ」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/5b1821f3-e335-4fb4-294c-71e251754d06.png)

1. ネットワークの種類
「ブリッジ ネットワークを使用」を選択し、「次へ」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/5a3b3c16-bc90-65f0-c831-6882b4d503f2.png)

1. I/Oコントローラタイプの選択
デフォルトのままとします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/3511c085-8034-4aa9-b597-86d610523d0a.png)

1. ディスクタイプの選択
デフォルトのままとします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/6c0ac96b-94c8-2728-9ab0-1a0af9030b13.png)

1. ディスクの選択
「仮想ディスクの新規作成」とします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/d5c2fa6d-1088-bcae-2815-c21f7c829852.png)

1. ディスク容量の指定
ディスクサイズはまず100GBとしました。
I/Oパフォーマンスを重視して、「今すぐ全ディスク容量を割り当てる」と選択し、
「仮想ディスクを単一ファイルとして格納」を選択後、「次へ」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/d593c9d4-10e8-a828-740e-241cecc0fa4e.png)

1. ディスク ファイルの指定
デフォルトのままとします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/1d1678a3-56c6-439e-3008-2adda871bcd5.png)

1. 仮想マシンを作成する準備完了
ハードウェアをカスタマイズします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/53bcce23-95b7-7512-ebce-a747a85737e2.png)

1. ハードウェアのカスタマイズ#1 プロセッサ
非常に重要です！
VMware上に、Hypervisorを更に載せて仮想化するため、
「Intel VT-x/EPT または AMD-V/RVIを仮想化」をクリックし有効にします。
これを実行しないとKVMが有効になりません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/568dcd37-951e-ee36-cbac-b3cc94380336.png)

1. ハードウェアのカスタマイズ#2 CD-ROM
ISOイメージから"CentOS-7-x86_64-Minimal-1611.iso"を選びます。
選択後、「閉じる」をクリック、「完了」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/e1669565-4da7-3dfe-1a98-b9d77258a123.png)

## ゲストOSのインストール
VMをパワーオンしてインストールを開始します。

1. CentOSのインストール
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/17af67fd-b2aa-6f8d-6dae-b3fedc95c0e3.png)

1. Press ENTER
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/5ac11e99-e2aa-ffd2-8878-d9a3e92d1588.png)

1. 言語の選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/d3059f34-f5b4-03ac-08c8-d14a5e4f3829.png)

1. インストールの概要
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/29e04bcd-a614-c260-a1cf-a7f856b8a155.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/e4f746ac-9bbc-52c1-b2f8-240af438417b.png)

1. インストール先の選択
インストール先のディスクを選択して完了をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/a4fd3a09-8db7-f18c-7982-1d12176b9ac6.png)

1. ネットワークとホスト名
ホスト名を入力して、「適用」をクリック
イーサネットの「オフ」をクリックして「オン」にする。
「設定」をクリックする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/c18a9777-582f-59e5-5a5d-31a690e28762.png)

1. ネットワークとホスト名(IF設定ｰ>全般)
「この接続が利用可能になったときは自動に接続する」をクリックする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/6e15238f-2b08-6c65-da52-ef5bea53b509.png)

1. ネットワークとホスト名(IF設定ー＞IPv4のセッティング)
静的IPアドレスを設定して、「保存」（画面上では切れて「保」のみですが・・・）をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/5b770c0f-cb47-4d2b-6d0c-5fa1d2eb4074.png)

1. ネットワークとホスト名(確認)
「完了」をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/9402734a-f577-f0a2-0afa-d9b01a846b7e.png)

1. インストールの開始
「インストールの開始」をクリック。
インストールが始まりますが、rootユーザ、一般ユーザのパスワード入力を求められるので適宜変更します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/126158/bb0510dd-509a-0d42-ca5f-4869791c20d3.png)

1. 再起動
インストール完了後、「再起動」のボタンが表示されるので再起動します。

## ゲストOSの設定
### パッケージのアップデート
ここは有無言わずにまずはパッケージのアップデートです。

```shell-session
# yum -y update
```

### 基礎パッケージの導入
VMware WorkstationのVMですので、vmware-toolsを使います。
ここの所個人的には純正のVMware-toolsを使わず、RPMのみでお手軽導入できるopen-vm-toolsを利用します。

```shell-session
# yum install -y open-vm-tools
```

### wgetの導入
個人的に欲しくて入れてますが、ご自由に
※minishiftパッケージがうまく落とせなくて、私はwgetを利用しました

```shell-session
# yum install -y wget
```

### KVMのインストール
- KVMまわりのパッケージ

kvmとインターフェースをブリッジするツールをインストールします。

```shell-session
# yum -y install qemu-kvm libvirt virt-install bridge-utils virt-manager
```

- KVMの起動・有効化
KVMインストール後はデフォルトで自動起動になっているので、
起動のみ行います。

```shell-session
# systemctl start libvirtd
```

- KVM有効の確認
以下のようにkvmのモジュールがロードされていることを確認します。
ゲストVMの設定で「Intel VT-x/EPT または AMD-V/RVIを仮想化」を忘れると、
このモジュールが読み込まれません。

```shell-session
# lsmod | grep kvm
kvm_intel             170181  0
kvm                   554609  1 kvm_intel
irqbypass              13503  1 kvm
```


### KVMのインターフェース設定
KVM(libvirt)のインストールが終わると、仮想NICが追加されます。
デフォルトインストールでは、インターフェースがブリッジされず、外と通信できません。
このままでは、minishiftで立ち上がってくるコンテナが見えないため、
ブリッジの設定を行います。

- インターフェースの確認

```shell-session
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:72:82:31 brd ff:ff:ff:ff:ff:ff
    inet 192.168.xxx.172/24 brd 192.168.xxx.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::39e2:465f:f926:cbae/64 scope link
       valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN qlen 1000
    link/ether 52:54:00:1a:9b:8f brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN qlen 1000
    link/ether 52:54:00:1a:9b:8f brd ff:ff:ff:ff:ff:ff
```

- IPv4ブリッジの為、パケット転送を許可する

```shell-session
# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
# echo 'net.ipv4.ip_forward=1' > /etc/sysctl.d/10-ipv4.conf
```

#### CentOS 7.xからNetworkManagerが主流なので、逆らわずにnmtuiで管理する
ifcfg-ethXが無い！と嘆いていないで、時代の流れに逆らわずにnmtui使いましょう。

- インターフェースの管理状態の確認
デフォルトではbridgeとなるNICはあるものの(virbr0)、設定が無いので通信できません。

```shell-session
# nmcli device
デバイス    タイプ    状態      接続
virbr0      bridge    接続済み  virbr0
ens33       ethernet  接続済み  ens33
lo          loopback  管理無し  --
virbr0-nic  tun       管理無し  --
```

- ブリッジインターフェースの作成
virbr0はあくまでも内部用とし、外部用のブリッジインターフェースを作成します。
br0という名前のインターフェースとします。

```shell-session
# nmcli con add type bridge ifname br0
接続 'bridge-br0' (cae264d7-c4d5-42ee-bd40-d343b3a5bc76) が正常に追加されました。
```

- スパニングツリープロトコルを無効化
いらないので止めておく。

```shell-session
# nmcli con modify bridge-br0 bridge.stp no
```

- インターフェースIPなどの設定
インターフェースの設定をします。
ens33へOS導入時に設定したIPアドレスと同じものをbr0に割り当てます。
割当完了後、最後にens33のIPを消して入れ替えます。

```shell-session
# nmcli con modify bridge-br0 ipv4.method manual ipv4.address "192.168.xxx.172/24" ipv4.gateway "192.168.xxx.252" ipv4.dns 192.168.xxx.112
```

- VMブリッジインターフェースをbridgeデバイスに所属させる

```shell-session
# nmcli con add type bridge-slave ifname ens33 master bridge-br0
接続 'bridge-slave-ens33' (b90a8052-abca-48fb-a872-ecc1ce28126f) が正常に追加されました。
```

- VMブリッジインターフェースのIP設定を削除し、NetworkManagerの再起動を行う。
元のインターフェースとIPが重複するため、SSHなどでログインしている現IPの設定を削除して、
NetworkManagerを再起動します。delだけだと、繋がらなくなったり怖いので、;区切りでリスタートをしました。

```shell-session
# nmcli con del ens33; systemctl restart NetworkManager
接続 'ens33' (9b003d45-7b3a-4c99-86f0-97145c71eff6) が正常に削除されました。
```

- VMインターフェースの確認

```shell-session
# nmcli device
デバイス    タイプ    状態      接続
br0         bridge    接続済み  bridge-br0
virbr0      bridge    接続済み  virbr0
ens33       ethernet  接続済み  bridge-slave-ens33
lo          loopback  管理無し  --
virbr0-nic  tun       管理無し  --
```

### KVM関連ユーザの作成

```shell-session
# usermod -a -G libvirt root
# newgrp libvirt
```

### docker-machine-driver-kvmを導入
- Docker Machine Driver KVM のバイナリをダウンロード

```shell-session
# curl -L https://github.com/dhiltgen/docker-machine-kvm/releases/download/v0.10.0/docker-machine-driver-kvm-centos7 > /usr/local/bin/docker-machine-driver-kvm
```

- 実行権限を付与する

```shell-session
# chmod +x /usr/local/bin/docker-machine-driver-kvm
```

### minishiftのダウンロード
curlでダウンロードしていたのですが、リダイレクトを追随してくれなかったりなど(curlオプション勉強不足で)不便を感じたので、wgetでダウンロードしました。

- 作業ディレクトリの作成

```shell-session
# mkdir -p /opt/minishift
# cd /opt/minishift
```

- wgetでパッケージのダウンロード

```shell-session
# wget https://github.com/minishift/minishift/releases/download/v1.1.0/minishift-1.1.0-linux-amd64.tgz
```

- パッケージの解凍
 
回答してあっけにとられたのですが、これだけ？？？


```shell-session
# tar xzvf minishift-1.1.0-linux-amd64.tgz
LICENSE
README.adoc
minishift
```

- 環境変数へパスを通す

```shell-session
# export PATH=$PATH:/opt/minishift
# cd ~/
# echo "export PATH=$PATH:/opt/minishift" >> .bashrc
```

## minishift の起動

minishiftコマンドを利用して、minishiftを起動する。
初回はISOのダウンロードやdockerコンテナのデプロイやらで少しまたされます。
管理IPなどが出てきたら成功です。

```shell-session
# minishift start
Starting local OpenShift cluster using 'kvm' hypervisor...
Downloading ISO 'https://github.com/minishift/minishift-b2d-iso/releases/download/v1.0.2/minishift-b2d.iso'
 40.00 MiB / 40.00 MiB [===========================================================================================================================================================] 100.00% 0s
Downloading OpenShift binary 'oc' version 'v1.5.1'
 19.96 MiB / 19.96 MiB [===========================================================================================================================================================] 100.00% 0s
-- Checking OpenShift client ... OK
-- Checking Docker client ... OK
-- Checking Docker version ... OK
-- Checking for existing OpenShift container ... OK
-- Checking for openshift/origin:v1.5.1 image ...
   Pulling image openshift/origin:v1.5.1
   Pulled 0/3 layers, 3% complete
   Pulled 1/3 layers, 73% complete
   Pulled 2/3 layers, 99% complete
   Pulled 3/3 layers, 100% complete
   Extracting
   Image pull complete
-- Checking Docker daemon configuration ... OK
-- Checking for available ports ... OK
-- Checking type of volume mount ...
   Using Docker shared volumes for OpenShift volumes
-- Creating host directories ... OK
-- Finding server IP ...
   Using 192.168.42.29 as the server IP
-- Starting OpenShift container ...
   Creating initial OpenShift configuration
   Starting OpenShift using container 'origin'
   Waiting for API server to start listening
   OpenShift server started
-- Adding default OAuthClient redirect URIs ... OK
-- Installing registry ... OK
-- Installing router ... OK
-- Importing image streams ... OK
-- Importing templates ... OK
-- Login to server ... OK
-- Creating initial project "myproject" ... OK
-- Removing temporary directory ... OK
-- Checking container networking ... OK
-- Server Information ...
   OpenShift server started.
   The server is accessible via web console at:
       https://192.168.42.29:8443

   You are logged in as:
       User:     developer
       Password: developer

   To login as administrator:
       oc login -u system:admin

```

# だがしかし、繋がらない(2017/06/25現在)
どうやら、「docker-machines」のvirbr1配下のとなったようなので、外からはアクセスできない。
※当然といえば当然。
このため、VMの外からは現状アクセスできない。

NATとかha-proxyとかでなんとかすればつながるのかもしれないが、今日は断念。。

# TODO:

- [ ] Windows 10上に直接minishiftをデプロイする方法をもう少し考える(virtualbox共存とか)
- [ ] OpenShift WebConsoleをVM外からアクセスする為に firewalldでnatを試す
- [ ] OpenShift WebConsoleをVM外からアクセスする為に ha-proxyで管理画面を外にだす



###参考にしたサイト
[Qiita: OpenShift Origin MinishiftをCentOS7にインストールしてみた](http://qiita.com/d_studio/items/4d47be845bbf26a5e79c)
既に同じ内容で書かれていたようですが、補完の意も含めてこの記事書かせて頂きました。

[Qiita: KVM環境で仮想マシンを外部ネットワークと接続する](http://qiita.com/toshiro3/items/9bfece0501d6963a3275)

[hosiiのメモ帳：CentOS7.2でブリッジインタフェースを作る](http://hosii.net/?p=446)