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

IBM Cloud Private Community Edition 3.1をAWS上にインストールしてみたメモ。

2.1.0.3のときのメモは以下。

[AWSにIBM Cloud Private-CE 2.1.0.3をインストールする](https://qiita.com/sotoiwa/items/fe6e4466dfd0290a5a2f)

## システム要件の確認

システム要件を確認する。

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

> The minimum requirement for IBM Cloud Private is 1 master (and proxy) node, 1 management node, and 1 worker node.

とあるので、シングルノード構成は不可となったようにみえる。やればできるかもしれないが、今回は上記の通りのMaster、Management、Workerそれぞれ1台づつの構成でインストールする。必要なスペックは以下。

||Master|Management|Worker|
|---|---|---|---|
|CPU|8 Core|4 Core|1 Core|
|Memory|16 GB|16 GB|4 GB|
|Disk|200 GB|150 GB|150 GB|

これは最低限であり、ICPはリソースが足りないといろいろエラーを起こすので、リソースはなるべく余裕があったほうがよい。コンポーネントの起動に時間がかかることで、いろいろなところでタイムアウトが発生してしまうためと思われる。

最初、Masterノードのスペックをm5.xlarge（4Core/16GB）としてインストールしようとしたが、途中の`cloudctl login`のステップで失敗したので、スペックをm5.2xlarge（8Core/32GB）変更したところインストールに成功した。インストール時のMasterノードのロードアベレージは30を超えていた。

（追記）
その後シングルノード構成もやってみたところできました。m5.4xlarge（16Core/64GB）、ストレージ200GBのマシンでやりました。

```
top - 10:17:29 up 36 min,  2 users,  load average: 38.69, 37.57, 23.73
Tasks: 496 total,   1 running, 430 sleeping,   0 stopped,   0 zombie
%Cpu(s):  4.7 us, 91.9 sy,  0.0 ni,  3.3 id,  0.0 wa,  0.0 hi,  0.1 si,  0.0 st
KiB Mem : 32121120 total, 23500636 free,  4902636 used,  3717848 buff/cache
KiB Swap:        0 total,        0 free,        0 used. 26748864 avail Mem
```

サポートOSを確認する。今回はUbuntu 18.04 LTS（3.1からサポート対象に追加）を使うことにする。

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

サポートされるDockerのバージョンを確認する。Ubuntu 18.04 LTSではDocker CEの18.03.1がサポートされる。

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

## ネットワーク環境の準備

### VPCの作成

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

AWSコンソールでVPCを作成する。

|項目|値|
|---|---|
|名前タグ|icp31-vpc（任意）|
|IPv4 CIDRブロック|10.0.0.0/16|
|IPv6 CIDRブロック|なし|
|テナンシー|デフォルト|

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/a8d7bc00-b633-7546-b527-14a7e5bcefc9.png)

### サブネットの作成

作成したVPCにサブネットを作成する。

|項目|値|
|---|---|
|名前タグ|icp31-subnet（任意）|
|VPC|（前のステップで作成したVPC）|
|アベイラビリティーゾーン|指定なし|
|IPv4 CIDRブロック|10.0.0.0/24|

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/2af55cfa-57ea-ca01-e3aa-4299ad950031.png)

### インターネットゲートウェイの作成

インターネットゲートウェイを作成する。

|項目|値|
|---|---|
|Nameタグ|icp31-igw（任意）|

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/ba217aa4-8c87-87f8-519b-d9300429a734.png)

作成したインターネットゲートウェイをVPCにアタッチする。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/d2948056-e5fe-5a82-27d1-031f7a9e0703.png)

### ルートテーブルの追加

このままではまだインターネットから接続できないので、ルートテーブルを修正する。作成したVPCのメインのルートテーブルを選択し、ルートを追加して保存する。

|送信先|ターゲット|
|---|---|
|0.0.0.0/0|（前のステップで作成したインターネットゲートウェイ）|

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/fdce6f0a-bea3-0441-be5b-4670d434e436.png)

### セキュリティグループの作成

作成したVPCにセキュリティグループを2つ作成する。

1つめ（icp31-default-sg）は全てのノード向けで、セキュリティグループ内のすべての接続を許可するルールと、SSHを許可する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/e3a8deb6-70b9-abbe-7b87-4c997c198dd2.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/fddb6b6a-8d4c-23fe-9386-3aa30521b4cd.png)

2つめ（icp31-master-sg）はMasterノード向けのセキュリティーグループを作成して以下へのアクセスを許可する。kube-apiserverとプライベートレジストリについては、kubectlやdockerコマンドを外部から直接実行しない場合は許可しなくてもよい。

- 8001（kube-apiserver）
- 8500（プライベートレジストリ）
- 8443（ICPダッシュボード）
- 80（HTTP）
- 443（HTTPS）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/67ba5404-ccbc-01fb-b858-e6cc97739d99.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/967bd967-e9cc-485e-7f71-1a2e89175d59.png)

## 仮想マシンの準備

### 仮想マシン作成の流れ

仮想マシンインスタンスを作成する。Dockerのインストールなど各ノードで共通なので、

- WorkerノードのインスタンスをDockerインストールなどを実施
- WorkerノードのインスタンスからAMIを作成
- 作成したAMIからMasterノードとManagementノードのインスタンスを作成

という流れで実施する。

### EC2インスタンスの作成

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/968293a1-6c5d-16a1-d86e-59150b50c1f1.png)

インスタンスタイプは後で変更するので今はt2.microとする。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/adbb453b-32e4-6416-d689-0e015fa1dfda.png)

事前に作成したVPCを指定する。グローバルIPの自動割り当てを有効にする。

|項目|値|
|---|---|
|ネットワーク|（事前に作成したVPC）|
|サブネット|（事前に作成したサブネット）|
|自動割り当てパブリックIP|有効化|

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/e269120a-d7c0-1cea-9a93-db3c4d6ee2ba.png)

ストレージはWorkerノードの要件にあわせて150GBで作成。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/cb48d828-400a-e862-9b81-4be5c0f5db67.png)

Nameタグを追加しておく。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/f385f95b-8dda-2f6a-1989-9a716aff74aa.png)

icp-default-sgのセキュリティーグループを指定する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/5b0c4e3b-b8b1-6380-86f8-1361862be6b3.png)

設定を確認して、インスタンスを作成する。

### ICPインストールの事前準備

仮想マシンにログインし、以下の手順に従ってホストOSの事前準備を行う。

[Preparing your cluster for installation](https://www.ibm.com/support/knowledgecenter/en/SSBS6K_3.1.0/installing/prep.html)

#### OS更新

とりあえずパッケージを更新する。

```
sudo apt update
sudo apt upgrade
sudo apt dist-upgrade
sudo apt autoremove
```

#### hostname変更

ホスト名を変更する。

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

```
sudo hostname icp31-worker1
```

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

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

```:/etc/hostname
icp31-worker1
```

再起動してもう一度ログインする。

```
sudo shutdown -r now
```

#### IPv6の無効化

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

```
sudo vi /etc/sysctl.conf
```

```:/etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
```

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

```
sudo sysctl -p
```

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

```
sudo vi /etc/hosts
```

```:/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
```

#### Python

Pythonをインストールする。Python2(2.6 or 2.7)またはPython3(3.5 or higher)がサポートされている。

今回はPython2がインストールされていないため`/usr/bin/python`コマンドは存在しないが、Python3がインストール済みで`/usr/bin/python3`コマンドは存在するという状態だった。Python2をインストールしてもよいが、シンボリックリンクを作成することで対応する。

```
sudo ln -s /usr/bin/python3 /usr/bin/python
```

（確認）

```shell-session
ubuntu@icp31-worker1:~$ python --version
Python 3.6.6
ubuntu@icp31-worker1:~$
```

#### socat

socatをインストールする。

```
sudo apt install socat
```

#### Docker CEのインストール

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

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

前提となるソフトウェアを導入。

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

Docker CEをインストールするためのリポジトリをセットアップする。

```
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
```

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

```
ubuntu@icp31-worker1:~$ apt-cache madison docker-ce
 docker-ce | 18.06.1~ce~3-0~ubuntu | https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 18.06.0~ce~3-0~ubuntu | https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 18.03.1~ce~3-0~ubuntu | https://download.docker.com/linux/ubuntu bionic/stable amd64 Packages
ubuntu@icp31-worker1:~$
```

サポートされているバージョン`18.03.1~ce~3-0~ubuntu`を指定してDocker CEをインストールする。

```
sudo apt-get install docker-ce=18.03.1~ce~3-0~ubuntu
```

Docker CEのバージョンをホールドする。

```
sudo apt-mark hold docker-ce
```

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

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

Logging Driverがjson-fileであることを確認する。`Logging Driver: json-file`が表示されればOK。

```shell-session
ubuntu@icp31-worker1:~$ sudo docker info|grep "Logging Driver"
WARNING: No swap limit support
Logging Driver: json-file
ubuntu@icp31-worker1:~$
```

SELinuxがDockerに対して有効になっていないことを確認する。`["name=seccomp,profile=default","name=selinux"]`が表示されたらSELinuxが有効、`["name=apparmor","name=seccomp,profile=default"]`が表示されれば無効。

```shell-session
ubuntu@icp31-worker1:~$ sudo docker info  --format '{{json .SecurityOptions}}'
["name=apparmor","name=seccomp,profile=default"]
ubuntu@icp31-worker1:~$
```

### 仮想マシンの複製

ここまででWorkerノードの準備が（ほぼ）完了したので、仮想マシンをシャットダウンする。

```
sudo shutdown -h now
```

AWSコンソールで、この仮想マシンからAMIを作成する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/5fbead89-eb80-7cf4-304c-9ab79a636a26.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/e54289d0-b102-d6f6-856f-5bb58c999f6b.png)

作成したAMIからManagementノードのインスタンスを作成する。

- インスタンスタイプの選択
  - 4Core/16GBの要件にあうようにm5.xlarge（4Core/16GB）を選択
- インスタンス詳細の設定
  - 事前に作成したVPCを指定
  - 事前に作成したサブネットを指定
  - 自動割り当てパブリックIPを有効化
- ストレージの追加
  - 要件にあうように150GBの汎用SSDをルートに割り当て
- タグの追加
  - Name=icp31-managementを追加
- セキュリティグループの設定
  - icp31-default-sdを選択

作成したAMIからMasterノードのインスタンスを作成する。

- インスタンスタイプの選択
  - 8Core/16GBの要件にあうようにm5.2xlarge（8Core/32GB）を選択
- インスタンス詳細の設定
  - 事前に作成したVPCを指定
  - 事前に作成したサブネットを指定
  - 自動割り当てパブリックIPを有効化
- ストレージの追加
  - 要件にあうように200GBの汎用SSDをルートに割り当て
- タグの追加
  - Name=icp31-masterを追加
- セキュリティグループの設定
  - icp31-default-sdとicp31-master-sgを両方選択

### Elastic IPの割り当て

外部からMaster（兼Proxy）ノードへのアクセスに使用するため、Elastic IPを割り当て、Masterノードに関連付けておく。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/625f378e-df6a-ee1e-da74-ff9273d9aacc.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/c981d284-55c3-b231-ec22-4a74f654c23b.png)

### Workerマシンのスペック変更

Workerノードのスペックを1Core/4GBの要件にあうようにt2.medium（2Core/4GB）に変更する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/0dc2e4cb-bfe2-276d-507e-8d43baffb2fe.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/9cb7034c-fd5e-7a8f-ae61-b61d69341a3e.png)

変更したらWorkerノードの仮想マシンを起動する。

### hostname変更

Masterノードにログインし、hostnameを変更する。

```
sudo hostname icp31-master
```

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

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

```:/etc/hostname
icp31-master
```

Managementノードにログインし、hostnameを変更する。

```
sudo hostname icp31-management
```

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

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

```:/etc/hostname
icp31-management
```

### /etc/hostsの修正

各ノードで、/etc/hostsを修正して名前解決できるようにする。なお、プライベートIPはDHCPでアサインされるが、勝手に変わったりはしない。

[Amazon EC2 インスタンスの IP アドレッシング](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-instance-addressing.html)

> VPC で起動されたインスタンスの場合、インスタンスが停止後に再開されたときはプライベート IPv4 アドレスとネットワークインターフェイスの関連付けが維持され、インスタンスが終了されたときは解放されます。

```
sudo vi /etc/hosts
```

```:/etc/hosts
127.0.0.1 localhost
10.0.0.127 icp31-master
10.0.0.215 icp31-management
10.0.0.144 icp31-worker1

# 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
```

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

以下の手順に従ってインストールする。今回はMasterノードがBootノードを兼ねているので、Masterノードで作業する。

### sshのセットアップ

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

インストーラーを実行するとAnsibleで各ノードに対してsshでログインするので、sshできるようにをセットアップする。

今回はインストーラーをubuntuユーザーで（sudoで）実行し、そこから各ノードにはubuntuユーザーでsshログインしてrootにスイッチさせるものとする。

ubuntuユーザーで鍵を生成する。

```shell-session
ubuntu@icp31-master:~$ ssh-keygen -b 4096 -f ~/.ssh/id_rsa -N ""
Generating public/private rsa key pair.
Your identification has been saved in /home/ubuntu/.ssh/id_rsa.
Your public key has been saved in /home/ubuntu/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:aDV7AVSsMbZMTfesYNk3dOWYVMmeokiGt9kL3rKS2RY ubuntu@icp31-master
The key's randomart image is:
+---[RSA 4096]----+
|       .o=o . +.*|
|        =.o+ = B |
|       ++== . O o|
|       ++B o + + |
|      o S * o .  |
|     .   E o     |
|        = + .    |
|       + = o     |
|        o.o      |
+----[SHA256]-----+
ubuntu@icp31-master:~$
```

自ノードにubuntuユーザーからubuntuユーザーでsshできように公開鍵を登録する。

```shell-session
ubuntu@icp31-master:~$ cat ~/.ssh/id_rsa.pub | tee -a ~/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCiqWLvpkkjX8PgjHRt4c27A5mKjIvETyt/QXPvAHduaUuK17FYLrBfeaB/Km0K516EaDsJx0owBTu6sCm8pX/hV0xghLY2NhGM8etc92dcpN+AJLhsQc5Zg5jMMwLT3GpgavnoHXcpKb7bdqimt+IgTq2czrrVZEHXVxQ13dccMbAAJ92om3ueHiD+kFy+PVd+gCNBYGdCR7Ia5FTt6uzprN1RYKRejkMK0O+EwepG8n1BeFDjy8kHDL+6xaslxtq238mlSG1/u583Lr1EycbPp53SEJg1kQjw5VOxAWsikUXXj/bAClMdoaAJcUZ/eT/LibSClAoFjdFHBvAwhzXchrYLnSoV1ar594oy9ckFKS6pUszqMWfvHEb+hNDSCwKGaQT8Kt4r5YTVHtAjtJWuoXF296veo70S5xc5GM0EQKiRa+gbWWlLAYhLzZdZ/FQ0P9e3dMDYAVcbcHq6/UXrNLMVwXQ4DXGnGXNV7PDdkjfTqQBsLihmz36q70frWEfFx5vVgvUrjohc7zxq4MmJSuCfJ9huQHPVeVsQ4tK5ILXYDxvnLUNQuHSoKO4A8K+NFClT6VmbDvJYDVCk3vGqhIrH43Xs9Iskn0Nhpth8ldC8aJqsccLoKsRwXa9iB+IuGEF4heqzq6QGm/zn+TUOv2629vkSWZuPPl37DQ/aGQ== ubuntu@icp31-master
ubuntu@icp31-master:~$
```

公開鍵をManagementノードとWorkerノードにも配置する。各ノードにパスワードでsshログインできるようになっていないので、ssh-copy-idでは鍵を渡せない。上記出力をコピペして渡す。

ManagementノードとWorkerノードで以下コマンドを実施する。

```
echo "<上記の出力された公開鍵>" >> ~/.ssh/authorized_keys
```

Masterノードのubuntuユーザーから各ノードにubuntuユーザーでsshログインできることを確認。

```shell-session
ubuntu@icp31-master:~$ ssh ubuntu@icp31-master whoami
ubuntu
ubuntu@icp31-master:~$ ssh ubuntu@icp31-management whoami
ubuntu
ubuntu@icp31-master:~$ ssh ubuntu@icp31-worker1 whoami
ubuntu
ubuntu@icp31-master:~$
```

### インストール準備

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

インストーラーイメージをPullする。

（コマンド）

```
sudo docker pull ibmcom/icp-inception:3.1.0
```

（実行例）

```shell-session
ubuntu@icp31-master:~$ sudo docker pull ibmcom/icp-inception:3.1.0
3.1.0: Pulling from ibmcom/icp-inception
a073c86ecf9e: Pull complete
cbc604ae1944: Pull complete
650be687acc7: Pull complete
a687004334e9: Pull complete
7664ea9d19f3: Pull complete
97c4037e775d: Pull complete
5fb11bea9f19: Pull complete
19aea527057b: Pull complete
060ae3284742: Pull complete
8db2b6e28cb8: Pull complete
92a37b9fe585: Pull complete
dfb007dce8a8: Pull complete
0573abd4b204: Pull complete
875ebddb61da: Pull complete
a1a7fd214344: Pull complete
391862def9ea: Pull complete
66ae4853d35e: Pull complete
Digest: sha256:3d390836726e88944487deaae748bb128a80ba5fd7c4a46f688e90b92d2d43f7
Status: Downloaded newer image for ibmcom/icp-inception:3.1.0
ubuntu@icp31-master:~$
```

インストール先ディレクトリーを作成。

```shell-session
ubuntu@icp31-master:~$ sudo mkdir /opt/ibm-cloud-private-ce-3.1.0
ubuntu@icp31-master:/$ cd /opt/ibm-cloud-private-ce-3.1.0
ubuntu@icp31-master:/opt/ibm-cloud-private-ce-3.1.0$
```

インストーラーのDockerイメージから構成ファイルをコピーして抽出。

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

Ansibleが使用するホスト定義ファイルを修正する。

```shell-session
ubuntu@icp31-master:/opt/ibm-cloud-private-ce-3.1.0$ sudo vi ./cluster/hosts
ubuntu@icp31-master:/opt/ibm-cloud-private-ce-3.1.0$ cat ./cluster/hosts
[master]
10.0.0.127

[worker]
10.0.0.144

[proxy]
10.0.0.127

[management]
10.0.0.215

#[va]
#5.5.5.5
ubuntu@icp31-master:/opt/ibm-cloud-private-ce-3.1.0$
```

Ansibleが使用するssh鍵（ubuntuユーザーの秘密鍵）をコピーする。

```shell-session
ubuntu@icp31-master:/opt/ibm-cloud-private-ce-3.1.0$ sudo cp ~/.ssh/id_rsa ./cluster/ssh_key
ubuntu@icp31-master:/opt/ibm-cloud-private-ce-3.1.0$
```

### config.yamlの修正

config.yamlを修正してクラスター定義をカスタマイズする。

```
ubuntu@icp31-single:/opt/ibm-cloud-private-ce-3.1.0$ sudo cp cluster/config.yaml cluster/config.yaml.org
ubuntu@icp31-single:/opt/ibm-cloud-private-ce-3.1.0$ sudo vi cluster/config.yaml
```

`docker.io/ibmcom/*`のイメージを許可するため、下記の定義を追加する。

```
image-security-enforcement:
  clusterImagePolicy:
    - name: "docker.io/ibmcom/*"
      policy:
```

その他以下を参照してカスタマイズを行う。

[Customizing the cluster with the config.yaml file](https://www.ibm.com/support/knowledgecenter/SSBS6K_3.1.0/installing/config_yaml.html)

外部からのコンテナアプリへのアクセスなど、Proxyノード（今回はMasterノードが兼ねる）へのアクセスをElastic IPに対して行うため、`proxy_lb_address`を設定する。

```
proxy_lb_address: <Elastic IPで取得したアドレス>
```

似たようなパラメータで、`cluster_lb_address`はICPダッシュボードやプライベートレジストリやkube-apiserverなど、Masterノードで稼働するコンポーネントへのアクセスに使用するアドレスを定義する。このアドレスが`mycluster.icp`（デフォルト値）から解決される。

こちらにElastic IPを使用するかはやや悩むところで、特にkube-apiserverへの通信がこのアドレスを使用するため、Elastic IPを設定するとクラスター内部の通信までもがわざわざElastic IPを使用することになる。

`cluster_lb_address`を明示的に設定しないで、プライベートアドレスを使用してインストールことも可能だが、その場合は外部のPC等から直接Masterノードのコンポーネントにアクセスするのにひと工夫必要になる。具体的には外部のPC等で`mycluster.icp`をElastic IPに解決してあげることでアクセスできる。

今回は`cluster_lb_address`は設定せず、`mycluster.icp`にはプライベートアドレスを使用させることにする。

Ansibleはubuntuユーザーでsshログインするため、以下を設定する。sudoにパスワードは不要なため`ansible_become_password`は設定しない。

```
ansible_user: ubuntu
ansible_become: true
# ansible_become_password: <password>
```

その他、今回は以下を設定した。

監査ログ出力を有効にする。

```
auditlog_enabled: true
```

DNSサーバーにループバックIPが設定されており、バリデーションエラーになったのでその対応を行う。

[DNS server validation fails](https://www.ibm.com/support/knowledgecenter/SSBS6K_3.1.0/troubleshoot/install_fails_dns.html)

```
loopback_dns: true
```

### インストールの実行

インストールは数十分の時間がかかり、その間にsshセッションが切れると困るので、screenやtmuxを使用した方がよい。

（コマンド）

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

（実行例）

```shell-session
ubuntu@icp31-master:/opt/ibm-cloud-private-ce-3.1.0$ cd ./cluster/
ubuntu@icp31-master:/opt/ibm-cloud-private-ce-3.1.0/cluster$ sudo docker run --net=host -t -e LICENSE=accept \
>   -v "$(pwd)":/installer/cluster ibmcom/icp-inception:3.1.0 install

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

TASK [Checking Python interpreter] ******************************************************************************************************
changed: [10.0.0.127]
changed: [10.0.0.215]
changed: [10.0.0.144]

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

TASK [Gathering Facts] ******************************************************************************************************************
ok: [10.0.0.127]
ok: [10.0.0.215]
ok: [10.0.0.144]

（省略）

PLAY RECAP ******************************************************************************************************************************
10.0.0.127                 : ok=167  changed=92   unreachable=0    failed=0
10.0.0.144                 : ok=109  changed=53   unreachable=0    failed=0
10.0.0.215                 : ok=120  changed=64   unreachable=0    failed=0
localhost                  : ok=265  changed=161  unreachable=0    failed=0


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

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

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

ubuntu@icp31-master:/opt/ibm-cloud-private-ce-3.1.0/cluster$
```

#### インストールに失敗したら

インストールの途中で失敗したら、一度アンインストールして、おかしいところを直して再トライする。アンインストールのコマンドは以下。

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

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

```
sudo service docker restart
```

トラブルシューティングの文書も参照。何が原因かわからない場合、インストールコマンドに`-vvv`オプションをつけると有益な情報が表示される、かもしれない。

[Installation and upgrade](https://www.ibm.com/support/knowledgecenter/SSBS6K_3.1.0/troubleshoot/install.html)

### kube-dnsの変更

[DNS server validation fails](https://www.ibm.com/support/knowledgecenter/SSBS6K_3.1.0/troubleshoot/install_fails_dns.html)

の対応の続きを実施する。

3.1ではインストーラーがCLIをインストールしてくれている。Masterノードでkubectlを構成する。

```
ubuntu@icp31-master:~$ cloudctl login -a https://mycluster.icp:8443 --skip-ssl-validation

Username> admin

Password>
Authenticating...
OK

Select an account:
1. mycluster Account (id-mycluster-account)
Enter a number> 1
Targeted account mycluster Account (id-mycluster-account)

Select a namespace:
1. cert-manager
2. default
3. istio-system
4. kube-public
5. kube-system
6. platform
7. services
Enter a number> 5
Targeted namespace kube-system

Configuring kubectl ...
Property "clusters.mycluster" unset.
Property "users.mycluster-user" unset.
Property "contexts.mycluster-context" unset.
Cluster "mycluster" set.
User "mycluster-user" set.
Context "mycluster-context" created.
Switched to context "mycluster-context".
OK

Configuring helm: /home/ubuntu/.helm
OK
ubuntu@icp31-master:~$
```

```
kubectl edit daemonset kube-dns -n kube-system
```

KnowledgeCenterで編集すべきとされているdnsmasqのコンテナがそもそも定義されていないため、どのような対応をしたらよいか不明。このままだとPodが外部のドメイン名を解決できないかもしれない。要調査。ホストOS側の設定を変えた方がよいかもしれない。

### ダッシュボードへのアクセス

ダッシュボードのURLはMasterノードのプライベートアドレスになっており、外部からはアクセスできない。MasterノードにアタッチしているElastic IPアドレスをURLに指定してアクセスしても、つながりはするのだが、リダイレクト処理でエラーになってしまう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/78c10138-14ae-948f-9925-c6e9c9b74443.png)

この問題を回避するため、クライアントPCの`/etc/hosts`に以下を追記する。

```
<Elastic IP> mycluster.icp
```

その上で以下のURLにアクセスするとアクセスできる。

https://mycluster.icp:8443/

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86449/0c53a270-3b9a-1999-4361-1760e6326f3e.png)

以上でインストールは完了。