IBM Cloud Private (ICP) のローカル環境をラクに構築する

# はじめに

Vagrant と VirtualBox を利用した IBM Cloud Private ローカル環境構築を紹介します。`vagrant up` 一発で VirualBox 上の Ubuntu 16.04 と LXC コンテナを3つ作成し、ICP をインストールします。同様のインストールを Docker コンテナ + ゼロからインストールするよりもメモリ使用量を抑えられますし、手順的にラクです。
すでに別のインストール記事も公開されていますので、そちらも参照ください。
> **PCにICP 3.1.2 をたった3行でインストールする**
> https://qiita.com/yurak/items/d56575635bca0061155d

# 導入手順

以下のドキュメントに従って導入します。
https://github.com/IBM/deploy-ibm-cloud-private/blob/master/docs/deploy-vagrant.md

## 環境
- macOS 10.14.4 (Mojave)
- VirtualBox 5.2.26
- Vagrant 2.2.3

## 手順
VirtualBox をインストールします。
https://www.virtualbox.org/wiki/Downloads

Vagrant をインストールします。
https://www.vagrantup.com/downloads.html

GitHub からリポジトリをクローンします。

```shell
git clone https://github.com/IBM/deploy-ibm-cloud-private.git
cd deploy-ibm-cloud-private
```

必要に応じて Vagrantfile を編集します。
デフォルトではメモリーに 8GB を割り当てています。環境に応じて増減してください。また `admin` のパスワードもここで指定しています。

```:Vagrantfile
# should be sufficent on laptops with 16GiB of RAM (but you won't want to run any apps
# while this vm is running)
memory = '8192'

# Default admin password - ICP 3.1.2 now requires 32 characters by default
default_admin_password = "S3cure-icp-admin-passw0rd-default"
```
`vagrant up` で環境構築を開始します。途中、ラインセンスの確認やホスト環境の管理者パスワードを求められます。

```shell-session
~ $ vagrant up
################################################################################
# You must accept the terms of the Software License under which we are         #
# providing the IBM Cloud Private community edition software.                  #
#                                                                              #
# See license terms here: https://hub.docker.com/r/ibmcom/icp-inception/       #
################################################################################
Do You Accept the Terms of the Software License? [Y|n]
Y
License Terms Accepted!
    :
```
約10分後、Ubuntu 16.04 のインストールと起動、LXC コンテナの作成と起動が完了すると以下のメッセージが表示され、IBM Cloud Private Community Edition のインストールが始まります。

```shell-session
==> icp: Running provisioner: shell...
    icp: Running: script: wait_for_worker_nodes_to_boot
    icp: 
    icp: Preparing nodes for IBM Cloud Private community edition cluster installation.
    icp: This process will take approximately 10-20 minutes depending on network speeds.
    icp: Take a break and go grab a cup of coffee, we'll keep working on this while you're away ;-)
    icp: .
```

上のメッセージでは10〜20分後ですが、私の環境では裏で別の仕事をしていたためか 約1時間かかって、導入が完了し、[IBM の最初期のロゴ](https://www.ibm.com/ibm/history/ibm100/us/en/icons/makingibm/impacts/)とログイン情報が表示されました。なおパスワードは`Vagrantfile`

```shell-session
    icp: Running: script: happy_dance
    icp: 
    icp:                                 O MMM .MM  MM7
    icp:                          ..M MMMM MMM DMMM MMM.MMMMO.
    icp:                        M.MM MMMM..MMM MMMM.MMM.NMMMMMM.
    icp:                      MM MM+MMM:. ,MM: MMMM MMM  MMMMMM
    icp:                     MM=.MM MMM   MMM. MMMM?MMM  MMM ..~ :MMM.
    icp:                 MM..MM.MM,OMMI   MMM .MMMMMMMM  MMM    MMMMMMM
    icp:               MMMM MM.NMM ~MMM   MMM..MMMMMMMM  MMM.  OMMMMMMMM
    icp:            ..MM.MMNMM.MM?  MMM  .MMM..MMMMMMMM  MMM   ~MM+  ,MM
    icp:           .MMM.MM:MM.?MM. .MMM  IMMM :MMMMMMMM  MMM   .MMM.  .
    icp:          .MMMMMMMMMM.MMM  .MMM~.MMMD MMMIMMMMM  MMMMMM. MMM   .,MMMM.
    icp:          NMMMMMM.MM: MM.    MMM.MMM, MMM.MMMMM  MMMMMM: =MMM   MMMMMM
    icp:       ..=MM,MMM.MMM MMM.   .MMM.MMM  MMM.8MMMM  MMM.  ,  .MMM .MMM  :
    icp:      MM MMM.MMM.MMM MMM     MMM MMM. MMM  MMMM  MMM.      MMMM.MMMM8.
    icp:    M . MMM.MMMZ7MM  MM.    .MMM MMM  MMM. MMMM  MMM.      .MMMM. MMMMMM   .
    icp:   M M.:MMMMMMM MMM.=MM      MMM.MMM  MMM  MMMM  MMM         MMM   .,MMMM MM
    icp:   M, M.7MMMMM..MMMMMMM.M   ~MMM.MMM .MMM. MMMM  MMM        .MMM ?   .MMM.M.M.
    icp:    MM. N       MMMMMM MMM=MMMM  MMM. MMM  MMMM  MMM. .DMM, MMMM MMMMMMMM  M M
    icp:    MMMM.  MM.   MMMM..MMMMMMM   MMM. MMM  MMMM :MMMMMZMMMMMMMMM  MMMMM  .M.$M
    icp:    MM.MMMMM.. MMM   .  ,MMM8    MMM .MMM  .MMM DMMMMM,  MMMMM      ..MM.. MM
    icp:    MM MM.MMMMMMM:   ~MMMM?       ... :IZ   MM,.NNO?,..         ZMM7.. MMMMMM
    icp:    MM MM MM MMMMMMMMMMMM=     .=MMMMMMMMMMMMNNMMMMMMMMMMMO...  .8MMMMMMMMMMM
    icp:    MM MM .M.M:  .MZMMMMMMMMMMMMMMMMMZ: .  . ......:INMMMMMMMMMMMMMMMMM :MMMM
    icp:    MM MM..M.MM,7MM :  MM  .MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM.MMM  MM :MMMM
    icp:    MM MM M..MM,7MM :MMMM MM.MM  MM =MMM.MM:  ...M .MM.. .MM.:M MMM. MM :MMMM
    icp:    NMMMM M..MM,7MM  .:MM MM MM ..M =MM   MMMM MMM .M MMM MM. M MM8~ MM :M MM
    icp:     $MMMMMM.MM,7MM :MMMM .  MM Z.M =MM M MMMM MMM .M MMM =M..  MM +.MM  .NM8
    icp:       .MMMMMMM+7MM ~MMMM M: MM ZM .=MM M =MMM MMM .M.MMM.MM.M. MM.MMIMMMMMM
    icp:      MM  . MMMMMMMMMN.MM MM.MM ZM, =M .   MMM MMM .M .MI MM.MM M?MMMMMMMM
    icp:      MMM    ..  8MMMMMMMMMMMMMDOMM.~M.MMM.MMM.MMM..MM, 7MMMMMMMMMMMMM.
    icp:      MMMM  MMM  :   ..,MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM$   .
    icp:      .MMMMMMMM  MM$       .  .. ..:$MMMMMMMMMMMMMMMN=..     .    MMMMMMM.
    icp:       MMMMMMMM  MMM     MMMM  MMM. .,..   .   . .  IMM  MMMMMM  MMM7. I.
    icp:        MMMMOMM.~MMM.   MMMMM7.MMZ  ,MM: .MMM .MMM  MMM .MMMMMM $MM,
    icp:        DM M MM MMMM   MMM  8  MM,  OMM   MMM .MMM. MMM ?MM      MMMM.
    icp:        .MMZ MM.MM=MN  MMM     MM   MMM  .MMM  MMMM MMM MMM       MMMM
    icp:          ,  MM MM MM  MM+     MM.  MMM.  MMM  MMMM:MMM MMMMMM    MMMM
    icp:           ..MM MM MM. MMI    .MM=  MMM   MMM .MMMMMMM..MMMMMM    MMM
    icp:             MMM7MMMMM MMM     MMMMMMMM. .MMM $MMMMMMM  MMM    .MMMM.
    icp:              $M.MMMMM MMM     MMMMMMMM. .MMM.MMMMMMMM.=MM~     MMM
    icp:               . MMMMMM MM    .MMM. MMM. ZMM: MMMMMMMM MMM. IMM..
    icp:                  M :MM MM:    MMM. MMM  MMM  MMMMMMM  MMMMMMMM
    icp:                     MMM7MM. . MMM  MMM. MMM  MMMDMMM  MMMMMM+
    icp:                      MM.MMMMMMMMM  MMM..MMM ?MM=~MMM.~MMMM
    icp:                        . MMMM OMM. MMM .MMM MMM .MM= MM
    icp:                          . M   MMI MMM  MM  MMM..MM
    icp:                               ..NM =MM .MM .MD..  .
    icp: 
    icp: 
    icp: ###############################################################################
    icp: #          IBM Cloud Private community edition installation complete!         #
    icp: #                  The web console is now available at:                       #
    icp: #                                                                             #
    icp: #                          https://192.168.27.100:8443                        #
    icp: #        username/password is admin/S3cure-icp-admin-passw0rd-default         #
    icp: #                                                                             #
    icp: #                          Documentation available at:                        #
    icp: #               https://www.ibm.com/support/knowledgecenter/SSBS6K            #
    icp: #                                                                             #
    icp: #                 Request access to the ICP-ce Public Slack!:                 #
    icp: #                            http://ibm.biz/BdsHmN                            #
    icp: ###############################################################################
```
インストール完了後は `/etc/hosts` に以下の行を追記します。

``` :/etc/hosts
192.168.27.100	mycluster.icp
```

ブラウザからダッシュボードの URL `https://192.168.27.100:8443` を指定し、上の admin とパスワードでログインします。
<img width="1233" alt="icp-login1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409188/65b6b342-c37d-5f47-0b9f-8950c11dcc43.png">

ログインできない場合は下のトラブルシューティングも参照ください。

# ICP 環境の停止、再開、削除
ICP 環境を停止、再開、アンインストールするには、インストールに使用したディレクトリで`vagrant` コマンドを実行します。

停止: `vagrant halt`
再開: `vagrant up`
削除: `vagrant destroy`
master ノードへのログイン: `vagrant ssh`

# ICP クライアント環境の構築
構築した ICP に対して `kubectl` や `helm` コマンドを利用するには、個々にインストールする必要があります。以下の手順に従ってインストールしてください。

- ICP ダッシュボード > 左上のハンバーガーメニュー > コマンド・ライン・ツール > Cloud Private CLI

環境によっては既存の Kubernetes 環境等と衝突する場合もあります。これを避けるため、ICP 関連の CLI をまとめた Dockerfile を作成しました。参考にしてください。

> **IBM Cloud Private (ICP) 用の各種 CLI を含む Dockerfile を作成しました**
> https://qiita.com/nzenge/items/5cae9fbcba8076bd4d77

なお Docker の証明書を取得する際には root アカウントが必要ですが、ユーザー `vagrant`、パスワード `vagrant` を使用します。

```shell-session:実行例
~/ $ scp vagrant@mycluster.icp:/etc/docker/certs.d/mycluster.icp\:8500/ca.crt ~/.docker/certs.d/mycluster.icp\:8500/ca.crt
vagrant@mycluster.icp's password:   ## vagrant と入力
ca.crt                                                            100% 6433     2.0MB/s   00:00    
~/ $ 
```


# トラブルシューティング

## Q. ダッシュボードにログインしようとするとエラー「404 Not Found」、メニューを選択すると「504 Gateway Time-out」エラーが返る。
A. おそらく ICP がまだ起動中です。しばらく待ってから再度試してみてください。頻発するようであれば Vagrnatfile 内のメモリーを増やしてください。

## Q. カタログを開いても何も表示されない
A. 画面上部の「カタログ」をクリックしても何も表示されない場合があります。その際は ICP ダッシュボード > 左上のハンバーガーメニュー > 管理 > Helm リポジトリーを選択し、「リポジトリーの同期」をクリックしてください。

## Q. (解決済み) LXC コンテナの作成でエラー「x509: certificate signed by unknown authority」が出力される

最初にこの `Vagrantfile` を試した際はコンテナの作成で[エラーが発生](https://github.com/IBM/deploy-ibm-cloud-private/issues/193)し、ICP のインストールを開始できませんでした。調べると以下の記事で`openssl`が欠けていることがわかり、[プルリクにつなげる](https://github.com/IBM/deploy-ibm-cloud-private/pull/198)ことができました(反映済み)。ありがとうございました。
> **失敗: Alpine 3.5.1上でLXD 2.8を使おうと試行錯誤した**
> https://qiita.com/tukiyo3/items/2833e6c5cdf1b8ae9eeb