無償版 Kubernetes インストール手順 (ICP CE V3.1.0)

# はじめに
2018年9月にV3.1.0がリリースされたので，無償版(Community Edition)をシングル構成でインストールしてみます。

本記事は2018年10月17日執筆時点のものです。公式マニュアルは以下を参照ください。
>
参考: [Installing IBM® Cloud Private-CE](https://www.ibm.com/support/knowledgecenter/SSBS6K_3.1.0/installing/install_containers_CE.html)
参考: [ICP CloudNative Edition(有償ライセンス版) システム要件](https://www.ibm.com/support/knowledgecenter/SSBS6K_3.1.0/supported_system_config/system_reqs.html)


ICPの概要について興味のある方は，以下も合わせて参照ください。
>2017年12月投稿記事: [IBM Cloud Private: Kubernetesをオンプレミス(IaaS)に導入してみる](https://qiita.com/capsmalt/items/d15055ab3cb423d2d7ae)

# 事前に準備するもの
- Kubernetesクラスターを構成するインスタンス (VM1つ) を用意
    - OS: Ubuntu Server 16.04 LTS
    - vCPU: 16core
    - Memory: 32GB
    - Disk: 100GB HDD

※今回は開発用途無償版を使用します

# いまからやること
ざっくりやることを列挙すると以下です。

- 1) 必要となるコンポーネントを取得・インストール
    - Docker CE
    - Python
    - socat
    - ICP CE (インストール用のDockerイメージ)
- 2) 環境セットアップ
    - ssh用key-pair
    - $ICP_HOME/cluster/hosts
    - $ICP_HOME/cluster/config.yaml
    - /etc/hosts
- 3) ICP Kubernetes クラスターを構築
    - docker run xxx

# [本編]ICP CE インストール手順
## 1) 必要となるコンポーネントを取得・インストール
### Docker CE (V 18.03.1)
```
# 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 -
# add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu (lsb_release -cs) stable"
# apt-get update
# apt-cache madison docker-ce
# apt-get install docker-ce=18.03.1~ce-0~ubuntu
# docker version
```

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

### Python (V 2.7.12)
```
# apt install python-minimal
# python --version
```

### socat (V 1.7.3.1)
```
# apt install socat
```

### ICP インストールイメージを取得 (V 3.1.0)
ICP(K8s)を構築するためのインストールイメージ(約800MB)をDockerHubから取得します。

```
# docker pull ibmcom/icp-inception:3.1.0
# docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
ibmcom/icp-inception   3.1.0               cb1028c2975c        5 days ago          746MB
```

## 2) 環境のセットアップ
### ICP用の構成ファイルを抽出
以下3つの手順を実行します。

- ICPクラスターを構成・管理するための任意ディレクトリを作成
- ICPクラスター作成用の構成ファイル群を抽出
- 構成ファイル群を確認

```
ICPクラスターを構成・管理するための任意ディレクトリを作成
# mkdir /opt/icp310ce
# cd /opt/icp310ce

ICPクラスター作成用の構成ファイル群を抽出
# docker run -e LICENSE=accept -v "$(pwd)":/data ibmcom/icp-inception:3.1.0 cp -r cluster /data

構成ファイル群を確認
# cd /opt/icp310ce/cluster
# ls
config.yaml  hosts  misc  ssh_key
```

### Ansibleのssh用にkey-pairを作成，配備
ICPを自動構築するためのAnsible用のPlaybookがあります。今回はAnsible用にkey-pairを用意しますが，key-pairの代わりにパスワードを使用させることも可能です。

```
# ssh-keygen -b 4096 -f ~/.ssh/id_rsa -N ""
# cat ~/.ssh/id_rsa.pub | tee -a ~/.ssh/authorized_keys
# cp ~/.ssh/id_rsa /opt/icp310ce/cluster/ssh_key
```

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

### ICPを構成するNode(Private IPアドレス)を指定
ICP Kubernetesクラスターを構成するNode群で疎通できる `Private IP (今回は 10.132.75.86)`を指定します。
シングル構成なので，master/worker/proxyの役割を1VMで担う構成をとります。


```
# vi /opt/icp310ce/cluster/hosts
```

```text:/opt/icp310ce/cluster/hosts
[master]
10.132.75.86

[worker]
10.132.75.86

[proxy]
10.132.75.86

#[management]
#4.4.4.4

#[va]
#5.5.5.5
```

※management/vaノードは使用しないのでコメントアウトのまま

### ICPのAdmin Console (ダッシュボード) 用の Public IP を指定
Admin Consoleに外部からアクセスするための `Public IP (今回は 169.56.42.72)` を指定します。


```
# vi /opt/icp310ce/cluster/config.yaml
```

```text:/opt/icp310ce/cluster/config.yaml
以下の２つの項目を見つけて，コメントアウトを外して，IPアドレスを指定する

before:

# cluster_lb_address: none
# proxy_lb_address: none

after:

cluster_lb_address: 169.56.42.72
proxy_lb_address: 169.56.42.72
```

### /etc/hostsの編集
```
# vi /etc/hosts
```

- ループバックアドレスをコメントアウト
- IPアドレス，ホスト名を1行追加

```text:/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
# 127.0.1.1     k8s-icp-ce310.capsmalt.com      k8s-icp-ce310
10.132.75.86    k8s-icp-ce310
```

## 3) ICP Kubernetesクラスターを構築
最後に `docker run` でICP Kubernetesクラスターを構築します。
クラスター完成には15〜30分ほど要します。

```
# cd /opt/icp310ce/cluster
# docker run --net=host -t -e LICENSE=accept -v "$(pwd)":/installer/cluster ibmcom/icp-inception:3.1.0 install -vvv | tee install.log
```

以下のような出力が確認できればOKです。

```
..
PLAY RECAP *********************************************************************
10.132.75.86               : ok=174  changed=97   unreachable=0    failed=0
localhost                  : ok=265  changed=161  unreachable=0    failed=0


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

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

Playbook run took 0 days, 0 hours, 31 minutes, 46 seconds
```

問題があった場合は， 以下を確認ください
- `/opt/icp310ce/cluster/install.log`
- 既知の問題と対策はこちら ==> [Troubleshooting and support](https://www.ibm.com/support/knowledgecenter/SSBS6K_3.1.0/troubleshoot/troubleshoot.html)

# ICP Admin Console (GUI) へのアクセス
ブラウザで， `https://xxx.xxx.xxx.xxx:8443` にアクセスしてください。
ログインユーザー名/パスワードは，`admin/admin`です。
xxx部は，Admin Console (ダッシュボード) 用に指定した Public IPです。

これらの設定箇所は，`/opt/icp310ce/cluster/config.yaml`にあります。

```text:/opt/icp310ce/cluster/config.yaml
・・
default_admin_user: admin # <== ログインユーザー名
default_admin_password: admin # <== ログインパスワード
・・
cluster_lb_address: 169.56.42.72 # <== Admin Console の IPアドレス
・・
```

アクセス例:
`https://169.56.42.72:8443` 

![image.png](https://qiita-image-store.s3.amazonaws.com/0/69447/b4763cfe-5cf7-f721-f21e-e4527d74aba0.png)

※例外追加を必要とする旨の画面が出たら，下図のように「エラー内容 > 例外を追加... > セキュリティ例外を承認」 のように進めてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/69447/9937488f-aed5-7e64-9a31-5361ecdb37c1.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/69447/e4177ab1-cdcc-513e-b796-a98768a7001f.png)



# まとめ
今回は2018年9月にリリースされた ICP V3.1.0の無償版(Community Edition, CE)をシングル構成でインストールしてみました。

一部は無償版(CE)では試すことができませんが，Kubernetesを利用する上で必要になる機能群がビルトインされていたり，HelmChartで容易に導入できるようになっています。

ぜひ試してみてください。

- すぐに利用できる機能一覧(一部抜粋)
 - モニタリング機能 (Prometheus，Grafana，AlertManager)
 - ロギング機能 (Elastic Stack)
 - CI/CD機能 (JenkinsベースのCI/CDおよび開発ツール)
 - HelmChart カタログ機能
 - 脆弱性スキャン機能 ※CEでは使用不可
 - K8sクラスターの自動構築，拡張機能 
 - (New) 複数K8sクラスター管理機能 ※CEでは使用不可
 - (New) Istio V1.0 組込み ※Tech Preview