IBM Cloud Private CE 2.1.0.1 (Kubernetes)を自宅のサーバー１台にインストールしてみた


Kubernetes,Helm,Container Repository,Prometheus,Grafana,ElasticSearchなどなど、Kubernetesクラスタを構成するソフトウェアをターンキーでインストールできる IBM Cloud Private Community Edition (以下 ICP-CEとする) の最新版 2.1.0.1 を自宅のサーバーにインストールしてみたので記事にします。


## 自宅サーバーのスペック
普通の何処にでもあるタワー型のパソコンです。

* CPU: AMD A10-7800 4 Cores
* RAN: 16GB
* Storage: SATA 700GB
* GPU: GeForce GTX 750ti
* NIC: 1Gbps
* OS: Ubuntu Server 16.04.3 LTS (64bit)


上記は、[IBM Cloud Knowledge Center / System requirements](https://www.ibm.com/support/knowledgecenter/SSBS6K_2.1.0/supported_system_config/system_reqs.html) の ICP-CEのシステム要件をクリアしていなくても進めてしまいます。 

Ubuntu 16.04 のダウンロードとインストールをおこなう場合は、https://www.ubuntu.com/download/server からメディアのISOファイルを入手できます。


## インストールのパス

[IBM Cloud Knowledge Center / IBM Cloud Private 2.1.0 / Installing](https://www.ibm.com/support/knowledgecenter/ja/SSBS6K_2.1.0/installing/installing.html)の導入手順に沿ってICP-CE v2.1.0.1 を導入して稼働を試みましたが、残念ながら、動作しませんでした。 導入は最後まで進むのですが、ICP-CEのポータルが起動しないという問題で、断念しました。

ICP-CE v2.1.0 を導入した後に、[IBM Cloud Knowledge Center / IBM Cloud Private 2.1.0 / Upgrading from IBM® Cloud Private-CE Version 2.1.0 to 2.1.0.1](https://www.ibm.com/support/knowledgecenter/ja/SSBS6K_2.1.0/installing/upgrade_ce.html)に従って、v2.1.0からv2.1.0.1にアップグレードする事で動作させる事が出来ました。

最初からv2.1.0.1を導入してうまくて行かない事に対しては、調べきれてないので、下記を利用して継続して調べて行きますが、今回は問題を避ける形で、先へ進めて行きます。

### サポートの情報元

* [IBM Cloud Support](http://ibm.biz/icpsupport)
* [IBM Knowledge Center / IBM Cloud Private](https://www.ibm.com/support/knowledgecenter/ja/SSBS6K_2.1.0/kc_welcome_containers.html)
* [stack overflow / IBM Cloud Private](https://stackoverflow.com/search?q=ibm+cloud+private)
* Slack ibm-cloud-tech.slack.com
* [IBM developerWorks / Communities / IBM Cloud Private](https://www.ibm.com/developerworks/community/groups/service/html/communityoverview?communityUuid=fe25b4ef-ea6a-4d86-a629-6f87ccf4649e)




## v2.1.0 インストール

[ICP-CEのドキュメント](https://www.ibm.com/support/knowledgecenter/SSBS6K_2.1.0/installing/installing.html)は、既に2.1.0.1用になっているので、以下のQiitaの記事を利用して、インストールとアップグレードを実施しました。

* [Qiita IBM Cloud Private: Kubernetesをオンプレミス(IaaS)に導入してみる](https://qiita.com/capsmalt/items/d15055ab3cb423d2d7ae)
* [Qiita V2.1.0からV2.1.0.1にマイグレーションしてみた (Kubernetes / IBM Cloud Private)](https://qiita.com/capsmalt/items/b5ed3204f484b479cf39)


## インストールのポイント

[ICP-CEのイントール・マニュアル](https://www.ibm.com/support/knowledgecenter/SSBS6K_2.1.0/installing/install_containers_CE.html)では、`docker pull ibmcom/icp-inception:2.1.0.1` と記述があるので、ICP-CEはコンテナで動作すると誤解されがちですが、このコンテナは、コンテナホストのLinuxサーバーに、Kubernetesが動作する様に自動設定変更するAnsibleを実行するためのコンテナになっています。 そこで、このインストール用のコンテナからsshでリモートでシェルが実行できる必要があります。また、hosts に書いてある自ホスト名が、127.0.0.1 の行にホスト名を書いてあると、コンテナ自身を指してしまうので、動作しません。

そこで、事前準備として、コンテナからsshの証明書による認証でコンテナのホストにシェルが実行できる様にします。 そして、ホスト名のエントリをループバックアドレスから、外部からアクセスできるNICのアドレスへ変更します。

### rootでログイン鍵の生成

~~~
takara@rei:~$ sudo -s
[sudo] password for takara: 
root@rei:~# su -
root@rei:~# cd
root@rei:~# pwd
/root
root@rei:~# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
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:N+jSmJSiRyiSVrQDG7124qP+lVGCuP47cpUgGGY8Qig root@rei
The key's randomart image is:
+---[RSA 2048]----+
|++..             |
|E=*.o            |
|*+.=.. .         |
|.oo*..o. .       |
|+o= *.+ S o      |
|+. = =o= . .     |
| .o +o+ o        |
| o.+.  .         |
|..++o            |
+----[SHA256]-----+
~~~

### 自分自身の鍵をauthorized_keysへ追加
以下の手順で鍵を準備します。

~~~
root@rei:~/.ssh# cp id_rsa.pub authorized_keys
root@rei:~/.ssh# chmod 0400 authorized_keys 
root@rei:~/.ssh# ls -al
total 36
-rw-r--r-- 1 root root 11771 Feb 18 14:19 :
drwx------ 2 root root  4096 Feb 18 14:20 .
drwx------ 3 root root  4096 Feb 18 14:19 ..
-r-------- 1 root root   390 Feb 18 14:20 authorized_keys
-rw------- 1 root root  1679 Feb 18 14:17 id_rsa
-rw-r--r-- 1 root root   390 Feb 18 14:17 id_rsa.pub
-rw-r--r-- 1 root root   222 Feb 18 14:16 known_hosts
~~~

### テスト
rootユーザーで自身のホストへログインできる事を確認します。 下記の様に`ssh localhost`でログインできればOKです。

~~~
takara@rei:~$ sudo -s
root@rei:~# ssh localhost
Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-87-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

0 packages can be updated.
0 updates are security updates.


*** System restart required ***
Last login: Sun Feb 18 14:22:56 2018 from ::1
~~~


### hostsの変更
次に、hostsファイルで、自分のホスト名のIPアドレスを変更します。

~~~file:/etc/hosts
127.0.0.1	localhost
#127.0.1.1	rei
192.168.1.100	rei
~~~

### Pythonのインストール
開発環境を作るわけではないので、pyenvを利用しないで、apt-getでpythonをインストールします。

~~~
apt-get install python python-pip -y
...
root@rei:~# python --version
Python 2.7.12
~~~


### カーネル・パラメータの変更
`vm.max_map_count`と`net.ipv4.ip_local_port_range`のパラメータを指定します。

~~~
root@rei:~# sysctl vm.max_map_count
vm.max_map_count = 65530
root@rei:~# sysctl -w vm.max_map_count=262144
vm.max_map_count = 262144
root@rei:~# echo "vm.max_map_count=262144" | tee -a /etc/sysctl.conf
vm.max_map_count=262144

root@rei:~# sysctl net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 32768	60999
root@rei:~# echo 'net.ipv4.ip_local_port_range="10240 60999"' | tee -a /etc/sysctl.conf
net.ipv4.ip_local_port_range="10240 60999"
~~~


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

[Dockerのインストールガイド](https://docs.docker.com/install/)と[Ubuntuの情報](https://store.docker.com/editions/community/docker-ce-server-ubuntu) を参考にしながら、インストールします。

Ubuntuにバンドル(同梱)されるDockerを削除して、Docher社のリポジトリを追加して、そこからインストールします。

~~~
apt-get remove docker docker-engine docker.io

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

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

apt-key fingerprint 0EBFCD88
pub   4096R/0EBFCD88 2017-02-22
      Key fingerprint = 9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid                  Docker Release (CE deb) <docker@docker.com>
sub   4096R/F273FCD8 2017-02-22


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

apt-get update
apt-get install docker-ce
apt-cache madison docker-ce
usermod -aG docker takara
~~~


上記の操作で、docker-ceがインストールされるはずです。

~~~
root@rei:~# docker --version
Docker version 17.12.0-ce, build c97c6d6
~~~


以上でICP-CEをインストールするための準備は完了です。


## ICP v2.1.0のインストール

二つのバージョンを順次動作させるので、下記の２つのディレクトリを作成しておきます。

~~~
mkdir /opt/ibm-cloud-private-ce-2.1.0
mkdir /opt/ibm-cloud-private-ce-2.1.0.1
~~~

[DockerHubのICP-CEのページ](https://hub.docker.com/r/ibmcom/icp-inception/tags/)を参照すると、2.1.0と2.1.0.1の両方が存在している事が解ります。 そこで、2.1.0をプルします。

~~~
docker pull ibmcom/icp-inception:2.1.0
~~~


## v2.1.0 の必要ファイルを準備

v2.1.0のディレクトリに移動して、コンテナのclusterディレクトリをコピーします。

~~~
cd /opt/ibm-cloud-private-ce-2.1.0

docker run -e LICENSE=accept -v "$(pwd)":/data ibmcom/icp-inception:2.1.0 cp -r cluster /data
~~~


これにより、`/opt/ibm-cloud-private-ce-2.1.0`に cluster というディレクトリができるので、その中の`hosts`と`ssh_key`を変更します。 下記のhostsファイル中、192.168.1.100 は、インストール用コンテナが設定変更のために、Ansibleでアクセスするアドレスです。必ずIPアドレスである必要があります。 １台に全部インストールするので、全て同じアドレスです。 IPアドレスの後の呪文は2.1.0だけに必要な様です。

### hostsの設定

~~~cluster/hosts
[master]
192.168.1.100 kubelet_extra_args='["--eviction-hard=memory.available<100Mi,nodefs.available<2Gi,nodefs.inodesFree<5%", "--image-gc-high-threshold=100%", "--image-gc-low-threshold=100%"]'

[worker]
192.168.1.100

[proxy]
192.168.1.100 kubelet_extra_args='["--eviction-hard=memory.available<100Mi,nodefs.available<2Gi,nodefs.inodesFree<5%", "--image-gc-high-threshold=100%", "--image-gc-low-threshold=100%"]'

#[management]
#4.4.4.4
~~~


### ssh_keyの設定

このファイルは、コンテナからNICのIPアドレスを通じてAnsibleで設定を実行するためのものです。 rootの下のid_rsaを上書きコピーします。

~~~
root@rei:/opt/ibm-cloud-private-ce-2.1.0.1/cluster# cp /root/.ssh/id_rsa ssh_key 
~~~


### その他
config.yamlは、特に変更しなくても動作するので、デフォルトのままで変更しません。
このファイルの詳細な説明は、[Customizing the cluster with the config.yaml file](https://www.ibm.com/support/knowledgecenter/SSBS6K_2.1.0/installing/config_yaml.html)にあります。


## 設定変更コンテナの実行

次のコマンドで、コンテナのホストをKubernetesのサーバーに改造してしまいます。

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


自宅のサーバーのスペックで、約23分かかりました。 もしも、途中でタイムアウトなどで処理が失敗した場合でも、Ansibleなので冪等性が保証されるので、再度実行する事で、失敗部分を直してくれます。

上記の処理が終了して、１０分後くらいに、ポータルは立ち上が立ち上がってきます。 ディスクへの書き込みが多いため、SSDを利用すると、立ち上がりが早いと思います。


## 動作確認

私の自宅サーバーのIPアドレスで、`https://192.168.1.100:8443` に、ユーザーID admin、パスワード admin でログインしてポータルの内容を確認できます。


## 2.1.0 -> 2.1.0.1 へのアップグレード

このまま、ICP-CEが動作したまま、アップグレードを進めていきます。 今度は、2.1.0.1のバージョンのディレクトリで作業していきます。
アップグレードの作業は、[Upgrading from IBM® Cloud Private-CE Version 2.1.0 to 2.1.0.1](https://www.ibm.com/support/knowledgecenter/ja/SSBS6K_2.1.0/installing/upgrade_ce.html)に従って進めます。


### 設定ファイルのコピー

バージョン番号を間違えると、動作しなくなるので、注意しながらコンテナ内からコピーを実施します。

~~~
docker pull ibmcom/icp-inception:2.1.0.1
cd /opt/ibm-cloud-private-ce-2.1.0.1
docker run -e LICENSE=accept -v "$(pwd)":/data ibmcom/icp-inception:2.1.0.1 cp -r cluster /data
~~~

2.1.0の証明書などを2.1.0.1へコピーします。

~~~
cd /opt
cp -r ibm-cloud-private-2.1.0/cluster/cfc-certs ibm-cloud-private-2.1.0.1/cluster
cp -r ibm-cloud-private-2.1.0/cluster/cfc-keys ibm-cloud-private-2.1.0.1>/cluster
cp -r ibm-cloud-private-2.1.0/cluster/cfc-components ibm-cloud-private-2.1.0.1/cluster
cp ibm-cloud-private-2.1.0/cluster/hosts ibm-cloud-private-2.1.0.1/cluster
cp ibm-cloud-private-2.1.0/cluster/ssh_key ibm-cloud-private-2.1.0.1/cluster
~~~


### hostsファイルの編集

今度はIPアドレスだけのスッキリしたファイルに編集します。

~~~cluster/hosts
[master]
192.168.1.100

[worker]
192.168.1.100

[proxy]
192.168.1.100

#[management]
#4.4.4.4
~~~


### ssh_keyの設定

前回と同じでコピーします。

~~~
root@rei:/opt/ibm-cloud-private-ce-2.1.0.1/cluster# cp /root/.ssh/id_rsa ssh_key 
~~~


### config.yamlの設定

[Upgrading from IBM® Cloud Private-CE Version 2.1.0 to 2.1.0.1](https://www.ibm.com/support/knowledgecenter/ja/SSBS6K_2.1.0/installing/upgrade_ce.html)に従うと、以下２点を有効にまたは追加します。

~~~file:config.yaml
backup_version: 2.1.0
glusterfs: false
~~~


## アップグレードの実行

その時点で、実行している v2.1.0を停止させる必要はありません。 そのまま、upgradeを走らせて、アップグレードを進めます。途中、ポータルが使えなくなりますが、アップグレードが完了して暫くすると、ポータルにアクセスできる様になります。　アップグレードは次の３ステップです。


### ステップ1 クラスタのアップグレード準備

~~~
docker run -e LICENSE=accept --net=host --rm -t -v "$(pwd)":/installer/cluster \
ibmcom/icp-inception:2.1.0.1 upgrade-prepare
~~~

### ステップ2 Kubernetesのアップグレード

~~~
docker run -e LICENSE=accept --net=host --rm -t -v "$(pwd)":/installer/cluster \
ibmcom/icp-inception:2.1.0.1 upgrade-k8s
~~~

### ステップ3 管理サービスのアップグレード
このステップに17分ほどかかりました。

~~~
docker run -e LICENSE=accept --net=host --rm -t -v "$(pwd)":/installer/cluster \
ibmcom/icp-inception:2.1.0.1 upgrade-mgtsvc
~~~

アップグレード完了して、5分程度すると、https://192.168.1.100:8443/ に admin/admin でログインできる様になります。


## サーバーの起動と停止

サーバーをシャットダウンする際は、以下のコマンドで終了処理を開始します。

~~~
init 0
~~~


起動は、電源をONする事で、約２０分程度でポータルにログインできる様になります。


## ICP-CEのポータルページの内容

ダッシュボードで総括的な状態を把握できます。

![スクリーンショット 2018-02-19 17.18.40.png](https://qiita-image-store.s3.amazonaws.com/0/42829/52a3b50a-01d1-ae7a-3790-f186f2a50d36.png "スクリーンショット 2018-02-19 17.18.40.png")



kubectlを叩かなくても、ブラウザ画面としてkubectl get deploy の内容を参照できます。 kubectlを使ってない人がデザインしたのか、より詳細では一覧性が悪いので、kubectlも併用が良い様な感じがします。

![スクリーンショット 2018-02-19 17.20.14.png](https://qiita-image-store.s3.amazonaws.com/0/42829/e80aa3a3-4077-a6cf-26d4-7a47cff68598.png "スクリーンショット 2018-02-19 17.20.14.png")


Grafanaの画面です。デフォルトで幾つかのビューが用意されています。

![スクリーンショット 2018-02-19 17.19.24.png](https://qiita-image-store.s3.amazonaws.com/0/42829/da6cf226-95cc-9d2c-de65-a4f29b96a0f6.png "スクリーンショット 2018-02-19 17.19.24.png")


次は、HELMで利用できるカタログです。 Jupyter Noteを利用したいだけなら、これで十分という感じもするくらい、使えそうなものが色々揃っています。

![スクリーンショット 2018-02-19 17.21.27.png](https://qiita-image-store.s3.amazonaws.com/0/42829/17fbf64b-cc43-7ad9-56a7-eac6ae881057.png "スクリーンショット 2018-02-19 17.21.27.png")



# さいごに

ポータルの機能、bluemix(bx)コマンド、kubectlコマンドで操作する方法について、続編を書きたいと思います。