RDBOX-HQをWindowsのVirtualBoxでセットアップしてみました

# はじめに
[RDBOX](https://rdbox-intec.github.io/homepage_en/)は、Linuxベースで構築することを前提としています

『自分が使っている Windows マシンで使えたらよいのに...』って思ったことはありませんか？

今回、Windows マシンで構築してみました

【ご注意】今回の記事では、Windows マシンに以下のアプリを導入します

- VirtualBox
- vagrant
- Git for Windows

では、参考にしてください


# 実行環境
今回使用した環境です
## Windows
| 項目 | 内容 | 備考 |
|---|---|---|
| エディション | Windows 10 Pro | 64bit版 |
| バージョン | 1809 | Windows Update で最新に更新済み |

## 機器
| 項目 | 内容 | 備考 |
|---|---|---|
| プロセッサ | Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz 3.41GHz | |
| 実装RAM | 16.0 GB(15.9 GB 使用可能) | |
| システムの種類 | 64 ビット オペレーティング システム、x64 ベース プロセッサ | |
| 製造元 | HP Inc. | |
| 仮想化支援 | **IntelVT を有効化** | AMD の CPU を使用する場合は **AMDV を有効化**<br>**※VirtualBoxで64bit OS を動かす際に必要** |

## ネットワーク
| 項目 | 内容 | 備考 |
|---|---|---|
| DHCPサーバ | 利用可能 | |
| Internet接続 | あり | |
| Proxyサーバ | なし | |


# 使用する Windows アプリの導入
- **注意**（ご了承ください）
  - 本記事に出てくるバージョン番号等は、記事作成当時(2019年11月下旬)のものです
  - アプリのバージョン違いによる画面や動作に違いがある可能性があります

- VirtualBox をインストール
  1. ダウンロード
     - https://www.virtualbox.org/wiki/Downloads
     - [Windows hosts] をクリック
     - [All supported platforms] をクリック
  1. 取得ファイル名を確認
     - VirtualBox-6.0.14-133895-Win.exe
     - Oracle_VM_VirtualBox_Extension_Pack-6.0.14.vbox-extpack
  1. インストーラを起動してインストール（詳細省略、他の人の記事見てください）
     - 忘れずに機能拡張(extpack)をインストール

- vagrant をインストール
  1. ダウンロード
     - https://www.vagrantup.com/downloads.html
     - Windows 用 [64-bit] をクリック
  1. 取得ファイル名を確認
     - vagrant_2.2.6_x86_64 .msi
  1. インストーラを起動してインストール（詳細省略、他の人の記事見てください）

- Git for Windows をインストール
  1. ダウンロード
     - https://gitforwindows.org/
     - [Download] をクリック
  1. 取得ファイル名を確認
     - Git-2.24.0.2-64-bit.exe 
  1. インストーラを起動してインストール（詳細省略、他の人の記事見てください）
     - **【重要】Git Bash は必ずインストール**してください

- 上記アプリインストール後は、念のため Windows を再起動してから、以降の処理を行ってください

# 今回構築する環境
- RDBOX-HQ（仮想マシン３台）
  - VPN Server
  - Kubernetes master
  - Kubernetes node 01
- RDBOX 環境 setup（仮想マシン１台）
- RDBOX master（Raspberry PI １台）

# ssh 鍵ペアの作成
- Git Bash を起動し、以下の条件で鍵ペアを作成
  - 鍵の長さ（bit数）は 2048 ビット
  - 鍵種別は 'RAS'
  - パスフレーズは**任意の文字列**（忘れないように注意）

```
$ ssh-keygen.exe -b 2048 -t rsa -N 'YourPassphrase'
```
|![ssh-keygen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427107/446c61e3-b255-b317-c91a-1dfd7aa24894.png)|
|---|

- 以下のようなファイルが作成される

```
$ ls ${HOME}/.ssh/id_rsa*
/c/Users/YourName/.ssh/id_rsa
/c/Users/YourName/.ssh/id_rsa.pub
```


# GitHub から clone
- Git Bash を起動する
   - 以降は、Git Bash プロンプトからの入力がほとんどになります
- VirtualBox のコマンド(VBoxManage.exe)を起動できることを確認
  - 以下の例では、バージョン番号が表示されたのでOK
  - もし [command not found] と表示された場合、タイプミス、もしくは、VirtualBox のインストールに失敗していると思われます

  ```
$ VBoxManage.exe --version
6.0.14r133895
  ```

- GitHub より [RDBOX](https://github.com/rdbox-intec/rdbox) を clone する
  - 今回は、${HOME}/git ディレクトリ以下に clone します

```
$ mkdir ${HOME}/git
$ cd ${HOME}/git
$ git clone https://github.com/rdbox-intec/rdbox.git
```

# 仮想マシン(VPNServer / Kubernetes master)を構築
- conf/rdbox-hq-vb.params 準備

```
$ cd ${HOME}/git/rdbox/tutorials/setup-rdbox-hq-vb
$ cd conf
$ cp rdbox-hq-vb.params.sample  rdbox-hq-vb.params
$ # ↑ 今回はファイル修正せず、デフォルト設定を使用します
$ vi rdbox-hq-vb.params        ← 設定変更が必要な方は、このタイミングで修正してください
```

- VPNServer / Kubernetes(master) 用仮想マシンの構築

```
$ cd ../build-initVM
$ bash createVagrantfileOfInitVM.sh
$ bash setupInitVM.sh
$ bash setupInitVM.sh rdbox-master    ← [ご注意] Windows 環境だと rdbox-master 作成を指示する必要がある
```

- この時点で、以下のような２台の仮想マシンが作成されている
  - rdbox-vpn
  - rdbox-master

|![build-initVM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427107/58a782a8-b3d4-0759-a7c6-d2038c604899.png)|
|---|


# 仮想マシン(Kubernetes node)を構築
- Kubernetes(node) 用テンプレート(setup-rdbox-hq-vb/conf/Vagrantfile.in.worker)を修正
  - rdbox-hq 構築用サーバから ansible で制御可能とするため public_network(DHCP) を追加
  - 具体的な修正箇所は以下の内容(git diff)を参考

```
--- a/tutorials/setup-rdbox-hq-vb/conf/Vagrantfile.in.worker
+++ b/tutorials/setup-rdbox-hq-vb/conf/Vagrantfile.in.worker
@@ -23,6 +23,7 @@ Vagrant.configure(2) do |config|
                end
                worker.disksize.size = "WORKER_HDDGB"
                worker.vm.hostname = "WORKER_HOSTNAME"
+               worker.vm.network "public_network",  type: "dhcp"
                worker.vm.network "private_network", ip: "WORKER_PRIVATE_IP", netmask: "PRIVATE_NETMASK", virtualbox__intnet: "rdbox-hq"
                worker.vm.provision "shell", run: "always", inline: <<-ALWAYS_SHELL
                        rm -f /etc/apt/apt.conf.d/01proxy
```

- Kubernetes(node) 用仮想マシンの構築

```
$ cd ../build-workerVM
$ bash createVagrantfileOfWorkerVM.sh
$ bash addWorkerVM.sh
```

# 仮想マシン(setup-rdbox)を構築
- Kubernetes(node)用の設定ファイルを流用し rdbos-setup作業用の仮想マシンの構築
  - 新規に Ubuntu をインストールしても良いが、手間を省くため Kubernetes(worker) の設定を流用する
  - sed コマンドを用いVagrantfileを修正
    - 'rdbox-worker-01' を 'rdbox-worker-90' に変更
    - 'rdbox-k8s-worker-hq-01' を 'rdbox-setup' に変更
  - addWorkerVM.sh スクリプトを起動し仮想マシンを作成

```
$ sed -i -e 's/rdbox-worker-01/rdbox-worker-90/' Vagrantfile
$ sed -i -e 's/rdbox-k8s-worker-hq-01/rdbox-setup/' Vagrantfile
$ bash addWorkerVM.sh
```


- 新たに２台の仮想マシン（合計４台）が作成されている

|![build-workerVM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427107/b7fbda1f-3b04-1cb0-5139-54017e28cc9b.png)|
|---|



# 仮想マシンの IP アドレスの確認
- VirtualBox 上の仮想マシンは DHCP を使い IP アドレスを取得しているため（IP アドレスが不明）
- 最初に、仮想マシンの ssh ポート(localhost)の確認する
  - このポートを使い、仮想マシンに ssh 接続して IP アドレスを取得する

```
$ cd ../bin
$ bash getSshPorts.sh
build-initVM_rdbox-vpn_1574142163625_64069 2222
build-initVM_rdbox-master_1574142647190_89684 2200
build-workerVM_rdbox-worker-01_1574143450492_72936 2201
build-workerVM_rdbox-worker-90_1574145506545_54554 2202
```
- 上記コマンド実行結果より、以下のポート番号であることが確認できた

| 機器種別 | ポート番号 |
|---|--:|
| VPN server | 2222 |
| k8s master | 2200 |
| k8s worker 01 | 2201 |
| k8s worker 90 | 2202 |

- 各仮想マシンのIPアドレス取得と確認（IP アドレスは、あとの処理で使用するのでメモしてください）

```
$ CMD='ssh -p ${VMPORT} -i ${HOME}/.ssh/id_rsa ubuntu@localhost ifconfig | grep "inet " | grep -v 127 | grep -v 172 | awk '\''{print $2}'\'
$ IPADRS_vpn=`VMPORT=2222 bash -c "$CMD"`
$ IPADRS_k8sm=`VMPORT=2200 bash -c "$CMD"`
$ IPADRS_k8sn=`VMPORT=2201 bash -c "$CMD"`
$ IPADRS_setuphq=`VMPORT=2202 bash -c "$CMD"`
$
$ echo ${IPADRS_vpn}
$ echo ${IPADRS_k8sm}
$ echo ${IPADRS_k8sn}
$ echo ${IPADRS_setuphq}
```


# RDBOX-HQ の構築準備
- 先ほどの手順で作成した仮想マシン rdbox-worker-90 を使用する
- VirtualBox マネージャーにて以下の手順で操作し、仮想マシン名称を変更
  1. 仮想マシン k8s worker 99 を停止
  1. プロパティから名称を setup-rdbox に変更
  1. 仮想マシン setup-rdbox を起動

|![renamed-vm.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427107/d53ee52c-a341-892f-73b0-9037637964a7.png)|
|---|


- Git Bash で ssh コマンドを使い、仮想マシン setup-rdbox にログイン（以降の処理は、このマシン上で実行する）

```
$ ssh -i ${HOME}/.ssh/id_rsa ubuntu@${IPADRS_setuphq}
```


- GitHub より [RDBOX](https://github.com/rdbox-intec/rdbox) を clone する
  - 今回も同様に、${HOME}/git ディレクトリ以下に clone します

```
$ mkdir ${HOME}/git
$ cd ${HOME}/git
$ git clone https://github.com/rdbox-intec/rdbox.git
```

- Windows 用実行環境依存ファイルを修正
  - win/getServerAddressPublic.sh は、各仮想マシンのIPアドレスが対応するように修正

```
$ cd rdbox/tutorials/setup-rdbox-hq/bin
$ cp -r example win
$ cp aws/getServerSshPort.sh win/
$ echo "echo KubeNode01" >  win/getKubeNodeList.sh
$ vi win/getServerAddressPublic.sh
```

- 修正箇所は以下の IP アドレスの部分（前の処理で取得した IP アドレスに書き換える）

```
    "${SERVER_TYPE_VPNSERVER}" )  echo "192.168.100.1" ;;
    "${SERVER_TYPE_KUBEMASTER}" ) echo "192.168.100.2" ;;
    "${SERVER_TYPE_KUBENODE}" )   echo "192.168.100.100" ;;
```


- VirtualBox 設定用ファイルを準備
  - 今回は、デフォルト設定のまま修正せず使用する

```
$ cd ../conf
$ cp rdbox-hq-vb.params.sample rdbox-hq-vb.params
```


- 設定ファイル確認スクリプトファイルを修正

```
$ cd ../build
$ vi check_build_rdbox_hq.sh
```

  - 具体的な修正箇所は以下の内容(git diff)を参考

```
--- a/tutorials/setup-rdbox-hq/build/check_build_rdbox_hq.sh
+++ b/tutorials/setup-rdbox-hq/build/check_build_rdbox_hq.sh
@@ -40,6 +40,9 @@ if [ "${RDBOX_HQ_BUILD_PF}" = "vb" ] ; then
 elif [ "${RDBOX_HQ_BUILD_PF}" = "aws" ] ; then
     echo "passed."
     echo "[INFO] This is 'AWS' setup mode."
+elif [ "${RDBOX_HQ_BUILD_PF}" = "win" ] ; then
+    echo "passed."
+    echo "[INFO] This is 'Windows(vb)' setup mode."
 else
     echo "[ERROR] You must set 'RDBOX_HQ_BUILD_PF' value."
     echo "[ERROR] e.g. 'vb' or 'aws'"
```



# RDBOX-HQ 構築編 step1
- 構築準備を行った後は、基本的に『RDBOX-HQ 構築編 step1』に書かれた通りの手順です

- 前の処理で作成した win ディレクトリのスクリプトを使用するように設定する

```
$ cd ../conf
$ cp bashrc.rdbox-hq.example ${HOME}/.bashrc.rdbox-hq
$ sed -i -e 's/#RDBOX_HQ_BUILD_PF="example"/RDBOX_HQ_BUILD_PF="win"/' ${HOME}/.bashrc.rdbox-hq
$ sed -i -e 's/== "vb"/== "win"/' ${HOME}/.bashrc.rdbox-hq
```

- 以降は、[手順](https://github.com/rdbox-intec/rdbox/wiki/tutorials-ja#%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89)の「RDBOX-HQ 構築編 step1」からあとを実行します。
  - 【注意】修正済みの ${HOME}/.bashrc.rdbox-hq を **conf/bashrc.rdbox-hq.example で上書きしない**


```
$ cd ../build
$ ./build_env_keep_latest.sh
$ ./build_softethervpn.sh
$ ./build_vpnserver.sh
$ ./build_kube_master.sh
```

- Kubernetes master 構築直後

|![build_kube_master.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427107/a76bcb97-1ee6-8f09-a32c-20f3fdbeb872.png)|
|---|


- しばらく待ってからブラウザで Kubernetes dashboard アドレスを表示

|![k8s-dashboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427107/0e1663eb-f354-1d38-eb69-249e04eea778.png)|
|---|


- RDBOX 構築用に k8s join token を生成

```
$ ./print_kube_join_command.sh
kubeadm join 192.168.179.2:6443 --token auf4l1.tk9jtql8ctgfeej6 --discovery-token-ca-cert-hash sha256:cd80f7663b85015b70d6c817b30145c5492b1040547529b315ee30cb63e444a5
```

# RDBOX の構築
- 『RDBOX/ロボット構築編 [RDBOX用SDカードの作成](https://github.com/rdbox-intec/rdbox/wiki/setup-rdbox-2-RDBOX_prepare_sd_card-ja)』を実施
  - 手順詳細は省略しますが、前の処理で生成した k8s join token を使用します

- しばらく待って Kubernetes dashboard で RDBOX master が参加したことを確認

|![k8s-dashboard-rdbox-master.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427107/71884826-298c-1c6d-27e3-acab99c2767c.png)|
|---|



# RDBOX-HQ 構築編 step2

- 以降の処理は、Git Bash で ssh コマンドを使い、仮想マシン setup-rdbox にログインしていることを想定しています（RDBOX-HQ 構築編 step1 の続き）

```
$ ssh -i ${HOME}/.ssh/id_rsa ubuntu@${IPADRS_setuphq}
```

- 『RDBOX-HQ 構築編 step2 [各サーバの構築-step2](https://github.com/rdbox-intec/rdbox/wiki/setup-rdbox-hq-2-1-servers-step2-ja)』を実施

```
$ cd ${HOME}/git/rdbox/tutorials/setup-rdbox-hq
$ cd build
$ ./build_kube_node.sh
```

- しばらく待って Kubernetes dashboard で Kubernetes node01 が参加したことを確認

|![k8s-dashboard-k8s-node01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427107/13cb594e-bcec-fe9c-554c-3eeef90e3b49.png)|
|---|


- これで**「RDBOX-HQをWindowsのVirtualBoxでセットアップ」を完了**です
 

<!-- eof -->