AWSにIBM Cloud Private-CE 2.1.0.3をインストールする

AWSにシングルノードのICP-CE 2.1.0.3をインストールしてみた作業メモ。

# 仮想マシンの準備

今回はデフォルトのVPCにEC2インスタンスを作成する。VPCを作成する場合は以下リンク先などを参照。

（参考）
[0から始めるAWS入門①：VPC編](https://qiita.com/hiroshik1985/items/9de2dd02c9c2f6911f3b)

## システム要件

ハードウェア要件を確認する。2.4GHzのCPUが8コア、32GB RAM、200GB HDDが必要。

[Hardware requirements and recommendations](https://www.ibm.com/support/knowledgecenter/SSBS6K_2.1.0.3/supported_system_config/hardware_reqs.html)

OSの要件を確認する。Ubuntu 16.04 LTSを使うことにする。

[Supported operating systems and platforms](https://www.ibm.com/support/knowledgecenter/en/SSBS6K_2.1.0.3/supported_system_config/supported_os.html)

サポートされるDockerのバージョンを確認する。UbuntuではDocker CEの1.12〜17.12.1がサポートされる。

[Supported Docker versions](https://www.ibm.com/support/knowledgecenter/en/SSBS6K_2.1.0.3/supported_system_config/supported_docker.html)

## 仮想マシンインスタンスの作成

Ubuntuのインスタンスを作成する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/0ccde15d-12f6-91d5-6f10-6901341b5a64.png)

ハードウェア要件を満たすためには、インスタンスタイプは

- t2.2xlarge
- m4.2xlarge
- m5.2xlarge

あたりが候補になりそう。m5.2xlargeを使うことにする。1時間あたり0.5ドルくらい。使わないときは停止することを忘れずに。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/9d0d306c-aa41-0b93-2db3-63b2e7cea490.png)

ストレージは200GBを割り当てておく。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/76132960-84bf-d1a2-082f-6f6a7411ff6d.png)

## Elastic IPの割り当て

仮想マシンを停止するとPublic IPアドレスが変わってしまうので、Elastic IPを1つ割り当て、インスタンスに関連づけておく。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/9e1febee-c950-d2ff-6ea3-00a90fb1e31d.png)

## セキュリティーグループの設定

セキュリティーグループを変更して外部からアクセスできるようにする。

- 22（SSH）
- 同じセキュリティーグループからの全てのトラフィックを許可
- 9443（？）
- 8500（プライベートレジストリ）
- 8443（ICPダッシュボード）
- 8001（APIサーバー）
- 80（HTTP）
- 443（HTTPS）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/132f15f6-cc77-afa8-02cf-bbdb06323082.png)

上記ポートにアクセスできるIPは適宜制限することが望ましい。

## 仮想マシンにログイン

SSHで仮想マシンにログインする。

```
$ ssh -i <秘密鍵> ubuntu@<Public DNS名>
```

# ICPのインストール

## OS更新

とりあえずパッケージを更新して再起動して、もう一度ログインする。

```
$ sudo apt update
$ sudo apt upgrade
$ sudo apt dist-upgrade
$ sudo apt autoremove
$ sudo shutdown -r now
```

## hostname変更

ホスト名を変更する。

（参考）
https://aws.amazon.com/jp/premiumsupport/knowledge-center/linux-static-hostname/

```
$ sudo hostname myicp01
```

再起動後も反映されるようにする。

```
$ sudo vi /etc/hostname
```

```:/etc/hostname
myicp01
```

## IPv6の無効化

（ここの手順は不要かも）

[ICPはIPv6に未対応](https://www.ibm.com/support/knowledgecenter/en/SSBS6K_2.1.0.3/getting_started/known_issues.html#ipv6)なため、`/etc/sysctl.conf`に以下を追加する。

```
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
```

以下コマンドで反映する。

```
$ sudo sysctl -p
```

`/etc/hosts`でIPv6の記載はコメントアウトする。

```:/etc/hosts
127.0.0.1 localhost

# The following lines are desirable for IPv6 capable hosts
#::1 ip6-localhost ip6-loopback
#fe00::0 ip6-localnet
#ff00::0 ip6-mcastprefix
#ff02::1 ip6-allnodes
#ff02::2 ip6-allrouters
#ff02::3 ip6-allhosts
```

## インストールの準備

以下の手順に従ってインストールの準備をする。

[Configuring your cluster](https://www.ibm.com/support/knowledgecenter/SSBS6K_2.1.0.3/installing/prep_cluster.html)

### hosts設定

`/etc/hosts`にプライベートIPとホスト名を書く。

```:/etc/hosts
127.0.0.1 localhost
172.30.1.224 myicp01

# The following lines are desirable for IPv6 capable hosts
#::1 ip6-localhost ip6-loopback
#fe00::0 ip6-localnet
#ff00::0 ip6-mcastprefix
#ff02::1 ip6-allnodes
#ff02::2 ip6-allrouters
#ff02::3 ip6-allhosts
```

### python

pythonをインストールする。2.6〜2.9のバージョンである必要がある。

```
$ sudo apt-get install python
```

```shell-session
$ python --version
Python 2.7.12
$
```

### カーネルパラメータ

カーネルパラメータを設定する。

```
$ sudo sysctl -w vm.max_map_count=262144
vm.max_map_count = 262144
$ echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf
vm.max_map_count=262144
$ sudo sysctl -w net.ipv4.ip_local_port_range="10240 60999"
net.ipv4.ip_local_port_range = 10240 60999
$ echo 'net.ipv4.ip_local_port_range="10240 60999"' | sudo tee -a /etc/sysctl.conf
net.ipv4.ip_local_port_range="10240 60999"
$
```

## Docker CEのインストール

以下の手順にしたがってDokcer CEをインストールする。

[Get Docker CE for Ubuntu](https://docs.docker.com/install/linux/docker-ce/ubuntu/)

aptがHTTPSを使うために必要なパッケージをインストールする。既にインストールされていたので何もインストールされなかった。

```
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common
```

GPGキーを追加する。

```
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
```

リポジトリーを追加する。

```
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
```

パッケージリストを更新する。

```
$ sudo apt-get update
```

インストール可能なDockerのバージョンを確認する。

```shell-session
$ apt-cache madison docker-ce
 docker-ce | 18.03.1~ce-0~ubuntu | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
 docker-ce | 18.03.0~ce-0~ubuntu | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
 docker-ce | 17.12.1~ce-0~ubuntu | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
 docker-ce | 17.12.0~ce-0~ubuntu | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
 docker-ce | 17.09.1~ce-0~ubuntu | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
 docker-ce | 17.09.0~ce-0~ubuntu | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
 docker-ce | 17.06.2~ce-0~ubuntu | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
 docker-ce | 17.06.1~ce-0~ubuntu | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
 docker-ce | 17.06.0~ce-0~ubuntu | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
 docker-ce | 17.03.2~ce-0~ubuntu-xenial | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
 docker-ce | 17.03.1~ce-0~ubuntu-xenial | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
 docker-ce | 17.03.0~ce-0~ubuntu-xenial | https://download.docker.com/linux/ubuntu xenial/stable amd64 Packages
$
```

バージョン17.12.1を指定してインストールする。

```
$ sudo apt-get install docker-ce=17.12.1~ce-0~ubuntu
```

## Dockerの設定の確認

以下の手順に従ってDockerの設定を確認する。

[Setting up Docker for IBM® Cloud Private](https://www.ibm.com/support/knowledgecenter/en/SSBS6K_2.1.0.3/installing/install_docker.html)

```shell-session
$ sudo docker info|grep "Logging Driver"
Logging Driver: json-file
WARNING: No swap limit support
$ sudo docker info  --format '{{json .SecurityOptions}}'
["name=apparmor","name=seccomp,profile=default"]
$
```

## SSH鍵の用意

以下の手順に従ってSSH鍵を用意する。

[Sharing SSH keys among cluster nodes](https://www.ibm.com/support/knowledgecenter/en/SSBS6K_2.1.0.3/installing/ssh_keys.html)

ここからはrootユーザーで作業する。鍵ペアを作成する。

```
ubuntu@myicp01:~$ sudo -i
root@myicp01:~# ssh-keygen -b 4096 -f ~/.ssh/id_rsa -N ""
Generating public/private rsa key pair.
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:EuIp9VaD71GewodngPx1DVR1cq+d1YScwqLWUDzRs7g root@myicp01
The key's randomart image is:
+---[RSA 4096]----+
|         oo=ooo+=|
|     . o. + =o+++|
|    o = ++o+.+. +|
|   o + *oBoo.  oo|
|  . o +.S *.  ...|
|   . . o *E      |
|        .        |
|                 |
|                 |
+----[SHA256]-----+
root@myicp01:~#
```

作成した鍵ペアの公開鍵をauthorized_keysに追加。

```
root@myicp01:~# cat ~/.ssh/id_rsa.pub | sudo tee -a ~/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC/fRVwMoDXvBPXayHGqnpgp/wgylE2ajw1prvwMtXZR+MkKp8/5BGIQRkbkFUQVRVWJu99255mEsZsr9DkkvOK0A2FlCNcWvmi36AKMh/dEyi0aaBiP7Q1Djr9NIYfzP+bRD14Ch3tgAnvLR1PL1o2MPqAP80a3oEAI2O8Tngzu9F/n+U2Any58kDNxjyS/HchZ8xysPwltAtVjM2XTR3xv6IbGncnyJ9sNU20ey/t0Ir5D/eEdCW8afBlR+75eO7S8Ted+AvnNyQTB0+6pK0fSguF9DVkRNUzskecMY9ERkVkEIaQz1jJutcrHdC6mPKZygtSPh+EGSMtsJEiocKV9c3Em5GGvjc/KNIBntqEuXnlQkRlEg+KZgSpfG/XBVQNjo6z0GZvKQcvtWmIG8dSsRVhEA6c3j4orE5B06SLPyl+ZjdrvF4BiUzIYxX9aKPq8NlF8w2jpWaGzm9110w3Trq1axcunXrNZ6lvpVJ8ecW+2Twqdl6quBr/3UtkpOj4G9Wpo2t00tA6nDWwIOXQLw2ykF+RxvjFD0pNRZNNf/pbgX1vO4Tk1/WDLmqY1w2zQ1T4J4UDUKoGjJV7sY3ynA81YXoGbAWSPL+PnfdXcv2QLG5d8Ytiq5C8U5jkNspMacx4Jv9IEJwMGdAgc6yTeQlusVmn2JcfO6MFpUkpZQ== root@myicp01
root@myicp01:~#
```

## ICP-CEのインストール

[Installing IBM® Cloud Private-CE](https://www.ibm.com/support/knowledgecenter/en/SSBS6K_2.1.0.3/installing/install_containers_CE.html)

イメージをPullする。

```shell-session
root@myicp01:~# docker pull ibmcom/icp-inception:2.1.0.3
2.1.0.3: Pulling from ibmcom/icp-inception
605ce1bd3f31: Pull complete
507f244c4e1e: Pull complete
fc0d271abee8: Pull complete
8b23035b2408: Pull complete
000becf28498: Pull complete
51a505055ed0: Pull complete
eeac8b40b648: Pull complete
9257589649f9: Pull complete
57f69f251b87: Pull complete
b096af58451b: Pull complete
6469dffb1f1a: Pull complete
f887f375638f: Pull complete
ddb479dd83ff: Pull complete
d1e7cfd8e84c: Pull complete
3e60d99f31dc: Pull complete
6b902b94eae4: Pull complete
92ed637fa0c7: Pull complete
f8c98676d227: Pull complete
6a6e3d12c00d: Pull complete
f45d18f4da09: Pull complete
0cdf1b156f7a: Pull complete
7d93d9656bec: Pull complete
0e621a7f8ba3: Pull complete
4dc8ed5c7dc1: Pull complete
a897fe19c795: Pull complete
28a013f6fb84: Pull complete
9b54fec58347: Pull complete
4562f699b8e0: Pull complete
cf758d8c0c8f: Pull complete
9cb5171aaaf7: Pull complete
1819858aae84: Pull complete
7760333d7f17: Pull complete
2d38d82b6a1a: Pull complete
2409e1ab0c7f: Pull complete
c7867291111e: Pull complete
dbd46ec491d2: Pull complete
0d64eaf62bb7: Pull complete
ac6fbdf97ab0: Pull complete
ffa1c8223bdb: Pull complete
4beb6e290173: Pull complete
3d9f59693d5a: Pull complete
4cde2000d977: Pull complete
219907c91cd1: Pull complete
7c38bb6d16a0: Pull complete
Digest: sha256:b20e408164e020a8419cc54b37ee9c390722658ad44f4534ad3e71311e01868b
Status: Downloaded newer image for ibmcom/icp-inception:2.1.0.3
root@myicp01:~#
```

ディレクトリーを作成して移動。

```
root@myicp01:~# mkdir /opt/ibm-cloud-private-ce-2.1.0.3
root@myicp01:~# cd /opt/ibm-cloud-private-ce-2.1.0.3
root@myicp01:/opt/ibm-cloud-private-ce-2.1.0.3#
root@myicp01:/opt/ibm-cloud-private-ce-2.1.0.3#
```

以下のコマンドで構成ファイルを抽出する。

```
# docker run -e LICENSE=accept \
  -v "$(pwd)":/data ibmcom/icp-inception:2.1.0.3 cp -r cluster /data
```

```
root@myicp01:/opt/ibm-cloud-private-ce-2.1.0.3# docker run -e LICENSE=accept \
> -v "$(pwd)":/data ibmcom/icp-inception:2.1.0.3 cp -r cluster /data
root@myicp01:/opt/ibm-cloud-private-ce-2.1.0.3#
```

先ほど作成した鍵を`cluster/ssh_key`に上書きコピーする。

```
root@myicp01:/opt/ibm-cloud-private-ce-2.1.0.3# cp ~/.ssh/id_rsa ./cluster/ssh_key
root@myicp01:/opt/ibm-cloud-private-ce-2.1.0.3#
```

`cluster/hosts`を編集する。プライベートIPを記載する。

```
[master]
172.30.1.224

[worker]
172.30.1.224

[proxy]
172.30.1.224

#[management]
#4.4.4.4

#[va]
#5.5.5.5
```

`cluster/config.yaml`を編集し、外部からアクセスできるようにElastic IPを指定する。Kibanaのインストールも有効にしておく。

```
cluster_lb_address: 18.179.83.130
proxy_lb_address: 18.179.83.130
kibana_install: true
```

clusterディレクトリーに移動し、以下のコマンドでインストールを実行する。そこそこの時間がかかり、その途中でネットワークが切れたら困るので、screenコマンドを起動してからやるとよい。

```
# docker run --net=host -t -e LICENSE=accept \
  -v "$(pwd)":/installer/cluster ibmcom/icp-inception:2.1.0.3 install
```

```shell-session
root@myicp01:/opt/ibm-cloud-private-ce-2.1.0.3# cd cluster
root@myicp01:/opt/ibm-cloud-private-ce-2.1.0.3/cluster# docker run --net=host -t -e LICENSE=accept \
> -v "$(pwd)":/installer/cluster ibmcom/icp-inception:2.1.0.3 install

PLAY [Checking Python interpreter] ********************************************************************************************************************

TASK [Checking Python interpreter] ********************************************************************************************************************
changed: [172.30.1.224]

PLAY [Checking prerequisites] *************************************************************************************************************************

TASK [Gathering Facts] ********************************************************************************************************************************
ok: [172.30.1.224]

TASK [docker-engine-check : Getting Docker engine version] ********************************************************************************************
changed: [172.30.1.224]

・・・
（省略）
・・・

PLAY [Performing post deployment actions] *************************************************************************************************************

TASK [shell] ******************************************************************************************************************************************
changed: [localhost]

PLAY RECAP ********************************************************************************************************************************************
172.30.1.224               : ok=162  changed=80   unreachable=0    failed=0
localhost                  : ok=69   changed=47   unreachable=0    failed=0


POST DEPLOY MESSAGE ***********************************************************************************************************************************

The Dashboard URL: https://18.179.83.130:8443, default username/password is admin/admin

Playbook run took 0 days, 0 hours, 19 minutes, 52 seconds

root@myicp01:/opt/ibm-cloud-private-ce-2.1.0.3/cluster#
```

インストールが成功したら、ICPダッシュボードのURLが表示されるので、ブラウザでアクセスする。エラーになった場合、まだ完全に起動していない可能性もあるので気長に待つこと。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/3d6cf15c-bb2a-d76b-c453-b87e38b718e2.png)


## 補足

インストールの途中で失敗したら、一度アンインストールして、おかしいところを直して再トライする。インストールコマンドに`-vvv`オプションをつけると有益な情報が表示される、かもしれない。アンインストールのコマンドは以下。

```
# docker run -e LICENSE=accept --net=host \
  -t -v "$(pwd)":/installer/cluster \
  ibmcom/icp-inception:2.1.0.3 uninstall
```

```
# service docker restart
```

[Uninstalling IBM® Cloud Private-CE](https://www.ibm.com/support/knowledgecenter/SSBS6K_2.1.0.3/installing/uninstall_ce.html)

## 参考リンク

[Installing IBM® Cloud Private-CE](https://www.ibm.com/support/knowledgecenter/en/SSBS6K_2.1.0.3/installing/install_containers_CE.html)

[IBM Cloud Private: Kubernetesをオンプレミス(IaaS)に導入してみる](https://qiita.com/capsmalt/items/d15055ab3cb423d2d7ae)

[Run IBM Cloud Private on Amazon Web Services (AWS) cloud platform](https://medium.com/ibm-cloud/run-ibm-cloud-private-on-amazon-web-services-aws-cloud-platform-c2cec1020ba8)

[Installing IBM Cloud private (ICP) in an AWS EC2 Environment](https://github.com/ibm-cloud-architecture/refarch-privatecloud/blob/master/Installing_ICp_on_aws.md)