IBM Cloud Private: Kubernetesをオンプレミス(IaaS)に導入してみる

**※注意(2018/10/17)
ICP CE V3.1.0 導入手順は [無償版 Kubernetes インストール手順 (ICP CE V3.1.0)](https://qiita.com/capsmalt/items/fe83a08a619ae9b296d0)を参照ください。**

# はじめに
クラウドネイティブの世界をオンプレで実現する次世代基盤 **IBM Cloud Private** を導入してみたいと思います。

自身のメモ書きレベルですが，せっかくなのでチャレンジしたい方のお役に立てれば幸いです。
今回使用するのは，CE版(Community Edition)です。※開発用途は無償利用可


~~※注意(2018/2/2)
本投稿は，V2.1.0を使用しておりますが，最新バージョンはV2.1.0.1となります。
適宜，公式リンク [IBM Cloud Private-CE インストール](https://www.ibm.com/support/knowledgecenter/SSBS6K_2.1.0/installing/install_containers_CE.html) も参照ください。~~


# クラウドネイティブ戦争の幕開け
[CNCF](https://www.cncf.io/) (Cloud Native Computing Foundation) という団体をご存知でしょうか。
この団体は，2015年にGoogleやIBM，RedHat らで設立した団体であり，[Kubernetes](https://kubernetes.io/) をはじめとする様々なプロジェクトを管理・推進しています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/69447/aa769d28-7cd0-fb58-5f9b-3be575b6651f.png)
参考: [CNCF Currently Hosted Projects](https://www.cncf.io/projects/)


># What is cloud native?
>## Cloud native computing uses an open source software stack to be:
>    - Containerized. Each part (applications, processes, etc) is packaged in its own container. This facilitates reproducibility, transparency, and resource isolation.
>    - Dynamically orchestrated. Containers are actively scheduled and managed to optimize resource utilization.
>    - Microservices oriented. Applications are segmented into microservices. This significantly increases the overall agility and maintainability of applications.

参考: [CFCF FAQ](https://www.cncf.io/about/faq/)

クラウドネイティブ・コンピューティングは，**コンテナベースで 動的にスケールでき，マイクロサービス指向であること** のように解釈できます。CNCFは，コンテナオーケストレーションや，ロギング，モニタリング，分散トレース，サービスメッシュ，ネットワーキングなど様々なカテゴリで整理しています。

つまり，GoogleやIBMをはじめとするCNCF設立・加入ベンダーは，
クラウドネイティブの世界で必要不可欠となるオープンテクノロジーを自ら見出し，
自社製品やサービスに積極的に取り込むことで，世の中の強い流れを取り込もうとしているわけです。


ちなみに2017年夏頃には，AWSやMicrosoft，Oracleなどが2年ほど遅れて加入しました。

2017年は，まさにクラウドネイティブ戦争の幕開けといったところでしょうか。


いままでアンテナの高い人がおもちゃのように使ってたオープンテクノロジーを中心において，
超大企業が我こそは！と市場獲得に猛ダッシュしています。

※以降，Kubernetesをk8sと表現する場合があります。

# IBM Cloud Privateとは
IBM Cloud Private は，**Kubernetesベースのコンテナ実行環境をLinuxに構築するソフトウェア製品** です。

死守したい資産の保護や，高い開発生産性，運用保守における自由度，セキュリティ，ロックイン回避など様々なレイヤーで，お客様にはそれぞれ思いがあります。
IBMはそれに応える形でプライベートクラウドにクラウドネイティブを実現する基盤として提供しています。

(例えば企業内全体を考えてみた時に，なんでパブリッククラウドじゃないの？って思えるヒトは，パブリックが許されるケースに所属されているので羨ましい限りです。それはそれでロックイン問題があったりもすると思いますが。)

話は戻りますが，
IBM Cloud Privateはソフトウェアなので **オンプレミスやIaaSなどプラットフォームを問わず導入可能** です。
Power，IBM Z のようなIBM Platform もサポートしているため，GPUをフル活用したDeep Learningや，
処理能力がキーになるブロックチェーンなどの用途にもハイスペックな資産を活用できますね。

本稿では詳細に触れませんが，**IBM Cloud Private は3つの側面** を持っています。

- エンタープライズ向け Kubernetes環境
- マルチクラウド環境の構築自動化・管理基盤
- Cloud Foundryのオンプレミス基盤

一言で表すなら，
**IBM Cloud Private** は，**お客様環境の次世代化を担う 司令塔** です。 

![image.png](https://qiita-image-store.s3.amazonaws.com/0/69447/f7d30519-1b06-e74e-a4fb-05b6f5822df0.png)
参考: [IBM Cloud Private の全貌 (kubernetesベース)](https://www.slideshare.net/capsmalt/ibm-cloud-private-kubernetes)

他にも細かく見ていくと，マイクロサービスの開発から運用まで含めて考慮されたツールチェーン機能も含まれます。
しかも，いままでのIBMとは思えないほどの **「基本 All オープンソース・テクノロジー！！」**

![image.png](https://qiita-image-store.s3.amazonaws.com/0/69447/832d71c9-0147-e865-b949-5219e7a27926.png)
参考: [Private cloud reference architecture](https://www.ibm.com/cloud/garage/content/architecture/private-cloud/0_1)

これがぜんぶ含まれて構成されるとは。
あーこれは使ってる。こっちは使いたいけどまだ取り込めてないなーなど色々ありますよね。

一個人としてもテンションあがります。(今頃は[KubeCon2017](http://events.linuxfoundation.org/events/kubecon-and-cloudnativecon-north-america)やってるんだよなぁ〜・・・)

・・・さて，そろそろ本題にいきましょう。
はい，では改めまして，
今回は私自身がすぐに試すことができた "Kubernetes環境" の導入作業手順を紹介したいと思います。

※相変わらず備忘録代わりにQiitaを使ってしまってすみません。


# 環境
今回はシングルノードでKubernetesクラスターを組みますので，以下のように準備しました。

- VMインスタンス 1つ
 - OS: Ubuntu Server 16.04
 - vCPU: 8
 - Memory: 16GB
 - Storage: 100GB
 - (2コア，8GB Macbook Air Early2015で，VirtualBow/VMware fusion上の動作実績あり)
 - (4コア，16GB Macbook Pro Late2016は，余裕でOKでした)

- インストールするコンポーネント
 - Docker CE V17.06.2
 - Python V2.7
 - IBM Cloud Private CE (Community Edition) V2.1.0

- 操作元のPC
 - macOS 10.13.1
 - Firefox 52.5.2
 - iTerm2 Build 3.0.15 

参考: [ハードウェア: システム要件](https://www.ibm.com/support/knowledgecenter/SSBS6K_2.1.0/supported_system_config/hardware_reqs.html)
参考: [OS: システム要件](https://www.ibm.com/support/knowledgecenter/SSBS6K_2.1.0/supported_system_config/supported_os.html)

# 導入手順
## サーバーインスタンスの準備
Ubuntu or RHELならOKです。
ほんとは良くないですが，ルート権限でやるとラクです。

```text
$ sudo -i
```

以降root実行するので，コマンド頭の記号は $から#に変更になります。
<img width="494" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/69447/4ee10a4a-eceb-6146-0f3f-330b05488382.png">


## OS設定
- hostsをいじります。

ループバックアドレスをコメントアウトします。
シングルノードのIPとホスト名を追加します。

```text
# vi /etc/hosts
```

```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-single  // <== コメントアウトする
10.132.75.83    k8s-icp-single  // <== 追加: シングルノードのIPとホスト名
```

- vm.max_map_countのサイズを広げる

vm.max_map_countは，プロセスが使用可能なスレッド数の上限値です。
この値が小さいと，Elasticsearch起動時に怒られるので，262144まで広げます。

```text
# sysctl vm.max_map_count
vm.max_map_count = 65530             // デフォルト値
# sysctl -w vm.max_map_count=262144  // 262144 まで広げる
# echo "vm.max_map_count=262144" | tee -a /etc/sysctl.conf  // システム構成ファイルに登録して永続化
```

## Docker導入
IBM Cloud PrivateのインストールイメージはDockerイメージなので，インストール作業のためのDockerを導入します。

IBM Cloud Privateのシステム要件にあったバージョンのDocker CEを導入します。(今回は，V17.06.2~ce-0 です)
参考: [IBM Cloud PrivateでサポートされるDocker version](https://www.ibm.com/support/knowledgecenter/SSBS6K_2.1.0/supported_system_config/supported_docker.html)

```text
# 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 // <== 省略OK。ハッシュ値確認してるだけ
# add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# apt-get update
# apt-get install docker-ce=17.06.2~ce-0~ubuntu // バージョンを指定してDockerをインストール
```

## Python導入
IBM Cloud Privateをインストールする際には，[ansible](http://ansible.io/) を使用します。
その際，pythonを使用しますので導入しておきます。(Python V2.6〜2.9.x)

今回は，Python V 2.7.12 がインストールされました。

```text
# apt install python
# apt-get update
# apt-get install python-pip
```

## IBM Cloud Private導入
通常，数台のノードによってKubernetesクラスターを構成します。
IBM Cloud Privateでは，事前にクラスター構成ファイルにIPアドレスなどを指定しておくことで，自動的に構成される仕組みです。

<img width="1224" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/69447/a6068c08-322a-40f9-5c83-9ec815195020.png">
参考: [アーキテクチャ](https://www.ibm.com/support/knowledgecenter/SSBS6K_2.1.0/getting_started/architecture.html)

- Bootノード
 - 必須
 - k8sクラスターの導入・構成をキックするためのノード
 - 高可用に組む必要はない
- Masterノード
 - 必須 
 - k8sクラスターの管理を担うノード
 - リソース割当，ステート管理，スケジューリング，モニタリング，etc.
 - 複数台での高可用構成が望ましい
- Proxyノード
 - 必須 
 - 外部からのリクエストに対するプロキシーサーバー
 - 複数台での高可用構成が望ましい
- Workerノード
 - 必須
 - アプリケーション(Pod/Deployment/Serviceなど)が動作するノード
 - パフォーマンスの観点で，十分な数のノード構成が望ましい
 - 複数台での高可用構成が望ましい
- Managementノード
 - モニタリングなど管理系に特化したノード
 - Masterノードの負荷を軽減する役割なので必ずしも必須ではない 

※本稿ではシングルノードで構成するので，Monitoringノードを除く，4ノード全てを1つのVMに構成します。

この後の手順では，以下を実施します。


1. SSHキーの生成と，各ノードへの配布
2. IBM Cloud Private CE インストールイメージを取得
3. クラスター構成ファイル群の編集
4. IBM Cloud Private CE のインストール

以下余談です。
IBM Cloud Privateのインストールイメージは，IBMによる動作テストを合格したコンポーネントの組合せとして，tarボールで固められています。
例えば，クラスター内で使用するための Docker CE も含まれており，クラスターを構成する各ノードに自動的に配布・導入されます。他にも，監視やロギング，利用量計測など様々な機能も標準機能としてビルトインで自動構築されます。

### 1) SSHキーの生成と各ノードへの配布
セキュアなノード間通信をするために，SSHキーを準備します。
※今回はシングルノード構成なので，公開鍵を各ノードにコピーするステップ(3行目)はスキップします。

```text
# ssh-keygen -b 4096 -f ~/.ssh/id_rsa -N ""
# cat ~/.ssh/id_rsa.pub | sudo tee -a ~/.ssh/authorized_keys
# ssh-copy-id -i ~/.ssh/id_rsa.pub <user>@<node_ip_address>  // 今回はスキップ
```


### 2) IBM Cloud Private CE インストールイメージを取得
DockerHubから，IBM Cloud Private CEのインストールイメージをpullします。

※バージョン適宜変更してください。(2.1.0を2.1.0.1に変えるなど)

```text
# docker pull ibmcom/icp-inception:2.1.0

2.1.0: Pulling from ibmcom/icp-inception
280aca6ddce2: Pull complete
6451c4289e16: Pull complete
fbf5ac173ad7: Pull complete
6161b89225d1: Pull complete
4242bdbf845a: Pull complete
3f3305395b3d: Pull complete
755ec132e2c4: Pull complete
f2dd77596efe: Pull complete
14740eadc65e: Pull complete
e9e523b58170: Pull complete
1e47726d79c6: Pull complete
Digest: sha256:eceb8e587b9f4fd75680672a26daa96fd5283df36ec08da197d1e393fa26cbcc
Status: Downloaded newer image for ibmcom/icp-inception:2.1.0
root@k8s-icp-single:~# docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
ibmcom/icp-inception   2.1.0               fa65473d72d8        6 weeks ago         445MB
```
### 3) クラスター構成ファイル群の編集
IBM Cloud Privateをインストールする前に，
k8sクラスターを構成する各ノードのIPアドレスや，外部公開するアドレスなどを事前設定します。

3-1) インストールするディレクトリの作成 (以下例では，k8s-icpというディレクトリ)

```text
# mkdir /opt/k8s-icp
# cd /opt/k8s-icp
```


3-2) IBM Cloud Privateのインストールイメージから，構成用のファイル群を抽出

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

# ls cluster
config.yaml  hosts  misc  ssh_key
```
インストールディレクトリ内に，clusterディレクトリと，その下にファイル群が生成されていることが分かります。

| ファイル名         | k8sクラスターにおける用途|
|:-----------------|:--------------------|
| config.yaml       |インストール用構成ファイル |
| hosts             |各ノードの定義情報        |
| misc/storage_class|動的ストレージのクラス定義 |
| ssh_key           |各ノードに通信するための秘密鍵|

3-3) クラスターを構成する各ノードのIPを定義 (cluster/hosts)

```text
# cd cluster
# vi hosts
```

```text:/etc/k8s-icp/cluster/hosts
[master]
10.132.75.83    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]
10.132.75.83

[proxy]
10.132.75.83    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
```

今回はシングルノード構成なので，全て同じIPアドレスです(10.132.75.83)

[management]ノードは，管理系(ロギングやモニタリングなど)を専門に行うノードです。デフォルトでは，[master]ノードが担っています。[master]ノードの負荷を軽減する場合に[management]ノードを有効化する使いかたがあります。
今回は[management]ノードは使いません。

~~IPアドレスの後ろについているのは，Kubernetesの Eviction Policyの設定です。
簡単に言うと，メモリーやディスク，inodeのリソースに閾値を設けて，超えた場合にコンテナやイメージを削除してくれる機能の設定です。
Dockerイメージが削除されてしまうと，コンテナやpodを置き換えることが出来なくなったり，IBM Cloud Privateを正常に動作させることができなくなる場合があるため，Dockerイメージが削除されないように設定しています。
("--image-gc-high-threshold=100%", "--image-gc-low-threshold=100%")~~

※V2.1.0.1から，上記Eviction Policyの設定は不要になりました。
このため，`/etc/k8s-icp/cluster/hosts`は以下のように指定します。

```text:/etc/k8s-icp/cluster/hosts
[master]
10.132.75.83

[worker]
10.132.75.83

[proxy]
10.132.75.83

#[management]
#4.4.4.4
```


3-4) SSHキー(秘密鍵)をコピー (cluster/ssh_key)
クラスター内の各ノードへセキュアに通信するために，秘密鍵コピーしておきます。

```text
# cp ~/.ssh/id_rsa /opt/k8s-icp/cluster/ssh_key
```

3-5) IBM Cloud PrivateのコンソールUIのIPなどを設定 (cluster/config.yml)

以下のconfig.ymlから，パスワードやIPを指定する箇所3行を探して編集します。

```text
# vi config.yml
```

```text:/etc/k8s-icp/cluster/config.yml
<before>

default_admin_password: admin
# cluster_access_ip: 0.0.0.0
# proxy_access_ip: 0.0.0.0

<after>

default_admin_password: YOUR_PASSWORD   // <== 任意のパスワードを設定
cluster_access_ip: 10.132.75.83         // <== IBM Cloud PrivateのコンソールアクセスIP
proxy_access_ip: 10.132.75.83           // <== リクエストを受け付けるプロキシーIP
```
各IPアドレスは，今回はシングルノードなので，今までと同じIPを指定します。

### 4) IBM Cloud Private CE のインストール
さて，いよいよ IBM Cloud Privateをインストールします。
dockerコマンドを実行すると，ansibleを使用して自動的に構成されます。


```text
# screen
# docker run -e LICENSE=accept --net=host -t -v "$(pwd)":/installer/cluster ibmcom/icp-inception:2.1.0 install | tee install.log
```
※本記事での上記コマンド実行ディレクトリは， "/etc/k8s-icp/cluster/" です。
※自身の "clusterディレクトリ直下" で実行するようにしてください。


15分〜30分ほど待ちましょう。

少し余談。
私の知識の乏しさを露呈するようですが，本当に便利なので紹介しちゃいます。

`docker run`でIBM Cloud Privateのインストールをする前に，`screen`コマンドを実行しています。
これは，セッションを作成し，後でセッションIDを指定すれば戻ってこれるようにしています。

|操作     |種類            | 効果                    |
|:-------|:---------------|:-----------------------|
| screen | コマンド        |新しいセッションを作成       |
| Ctrl+a+d | ショートカット |デタッチ (セッションを離れる) |
| screen -r | コマンド     |アタッチ (セッションに戻る)  |

用途としては，多少時間のかかるコマンドなど実行した際に，
「画面を切り替えて別の作業をしたり」あるいは「会社でコマンド実行して，家に帰ってから確認する」みたいな。

実はこれ，先輩から教えて頂いたのですが，目からウロコでした。
めちゃめちゃ便利。

電車の中で作業していて降車するまでにスクリプトが終わらず，駅のホームで20分ほど座っていたこともありました・・・それから帰宅。。

他の方の記事ですが，詳しくは以下を参照されると良いと思います。
参考: [Linux screenコマンド使い方](https://qiita.com/hnishi/items/3190f2901f88e2594a5f)

...
..
.
そろそろですかね。
終わったみたいです。

```bash
PLAY RECAP *********************************************************************
10.132.75.83               : ok=200  changed=66   unreachable=0    failed=0
localhost                  : ok=214  changed=112  unreachable=0    failed=0


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

UI URL is https://10.132.75.83:8443 , default username/password is admin/xxxxxx

Playbook run took 0 days, 0 hours, 24 minutes, 11 seconds
```
24分かかったようです。
インストールが正常に完了すると，上記の "POST DEPLOY MESSAGE" の記載にあるように，UIへの接続情報が表示されます。

- IBM Cloud PrivateのコンソールUI (URL)
- Username: admin
- Password: xxxxx (config.ymlで指定したパスワード)

実際の画面を見てみましょう。


# 少し遊んでみる
操作編は別途記事をあげようと思っていますが，少しだけ遊んでみましょう。

## コンソールにログイン
ブラウザで UI URLに接続 (インストール成功時に表示されたものです)
私の場合，
URL: `https://10.132.75.83:8443` です。
Username: `admin`
Password: `xxxxxx`

ログイン画面
<img width="1214" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/69447/b064f1ff-dd6c-9d38-c4f3-ea6d4560688a.png">

ログイン後のダッシュボード画面 (ノードのリソース状況が表示されています)
<img width="1695" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/69447/04d3b275-af0f-a780-4dce-efb973e59d51.png">

左上にメニューがあります (ハンバーガーアイコン)
<img width="280" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/69447/2f950982-3e7b-bb2c-3e25-e3d447b60011.png">

[メニュー]>[Workloads]>[Deployments] を開いてみましょう
<img width="1560" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/69447/2a5849ba-e59f-b769-b390-8b06c29ae771.png">

※Deployment: 正確には正しくないですが，ざっくり言うとアプリケーションのようなものです

[メニュー]>[Catalog] を開いてみましょう
<img width="1582" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/69447/f3c3a78d-4542-3c5b-93d2-e194aece32fa.png">
このカタログから，IBMミドルウェアやソフトウェア，OSSなどを選べば，すぐにコンテナとして実行できます。

## カタログからサンプルアプリケーションをコンテナ実行してみる
カタログを開きます。([メニュー]>[Catalog])

※この後の作業は，図に示された内容と同様に入力・選択して進めます。

"ibm-nodejs-sample" を選択
<img width="404" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/69447/657a51eb-3fd1-60a0-8455-ff43262b9983.png">



Release nameに任意の名前を指定し，"I have read..." にチェックを入れる (下図参照)
<img width="985" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/69447/8320c7ee-05e2-6659-6ff3-396633f41e9c.png">

Node.jsアプリがリリースされた旨を示すポップアップが表示されるので， "View Helm Release" をクリックする (下図参照)
<img width="501" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/69447/229b7b85-2103-8c5a-0d05-976b6170592e.png">

一覧の中から，先程指定した名前(例えば "appnodejs")をクリックする (下図参照)
※他にリリースしていなければ，1行だけ表示されるはずです。
<img width="906" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/69447/0543fa66-544e-4aa7-4a90-7078f230ba7e.png">

リリース済の詳細が表示されます (下図参照)
カタログからリリースした場合，ServiceとDeploymentがセットでリリースされるように構成されています
<img width="1213" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/69447/35418e2a-5c19-320b-7698-e6bb22a21d6a.png">

SERVICE欄の "appnodejs-ibm-nodejs-sam" をクリックします (下図参照)
<img width="344" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/69447/a51f2c7d-b9f0-c8bd-ea3b-b1885f3cd20d.png">

Serviceの詳細が表示されます
Node port欄の "32598/TCP" をクリックします (下図参照) ※port番号は異なる場合があります
<img width="1209" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/69447/2d75aaa5-d161-df87-2ea5-f5d18cb2dd60.png">

Node.jsのサンプルアプリケーションの画面が表示されます (下図参照)
<img width="1013" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/69447/b9bb7153-8bf3-c78d-b041-114e598c792a.png">

数枚の画面イメージでの説明手順に従って，カタログからNode.jsのサンプルを選択しデプロイしました。

Helm Chartと呼ばれるパッケージ (カタログ上に用意されていたもの)には，
k8sクラスターの外から接続するための **Service**，
アプリケーションをPodという単位でまとめた **Deployment**，
その他，ポリシーなどの初期構成が組まれています。

つまり，必要な値(例えばportや使用するDockerイメージのバージョン・タグ)のみ変更し，迅速にコンテナ実行できるわけです。

用途は色々考えられますが，プロジェクト毎に最適な構成をパッケージ，Deep Learningのアプリ開発用途のパッケージ，などのように準備することも可能です。

## IBM Cloud Privateに含まれるDockerイメージ
- IBM Cloud Private CE に含まれるDockerイメージ

```text:IBMCloudPruvate開発版(CE)
# docker images

REPOSITORY                         TAG                 IMAGE ID            CREATED             SIZE
ibmcom/icp-inception               2.1.0               fa65473d72d8        6 weeks ago         445MB
ibmcom/icp-identity-manager        2.1.0               018b45173e47        7 weeks ago         181MB
ibmcom/icp-datastore               2.1.0               3cdeba12adc9        7 weeks ago         1.69GB
ibmcom/icp-identity-provider       2.1.0               e22ffd935288        7 weeks ago         164MB
ibmcom/icp-platform-auth           2.1.0               7a0cbbda8a4c        7 weeks ago         503MB
ibmcom/iam-policy-administration   2.1.0               a6d087878dcb        7 weeks ago         876MB
ibmcom/kubernetes                  v1.7.3              09a180e57e1e        3 months ago        738MB
ibmcom/calico-policy-controller    v0.7.0              60d797585fc5        3 months ago        21.9MB
ibmcom/calico-node                 v2.4.1              7643422fdf0f        4 months ago        277MB
ibmcom/calico-ctl                  v1.4.0              b0c499acdc21        4 months ago        43.6MB
ibmcom/calico-cni                  v1.10.0             88ca805c8ddd        4 months ago        70.3MB
ibmcom/k8s-dns-sidecar             1.14.4              38bac66034a6        5 months ago        41.8MB
ibmcom/k8s-dns-kube-dns            1.14.4              a8e00546bcf3        5 months ago        49.4MB
ibmcom/k8s-dns-dnsmasq-nanny       1.14.4              f7f45b9cb733        5 months ago        41.4MB
ibmcom/etcd                        v3.1.5              3f6d64a8fae8        7 months ago        152MB
ibmcom/mariadb                     10.1.16             3b5159f610ed        16 months ago       392MB
ibmcom/pause                       3.0                 99e59f495ffa        19 months ago       747kB
```

 - IBM Cloud Private Cloud Native Edition (製品版) に含まれるイメージ

```text:IBMCloudPrivate製品版
# docker images

REPOSITORY                                  TAG                 IMAGE ID            CREATED             SIZE
ibmcom/icp-inception                        2.1.0-ee            e3f9c56cdbe0        7 weeks ago         446MB
ibmcom/icp-identity-manager                 2.1.0               018b45173e47        7 weeks ago         181MB
ibmcom/docker                               17.10               88c2796ff283        7 weeks ago         99.9MB
ibmcom/icp-datastore                        2.1.0               3cdeba12adc9        7 weeks ago         1.69GB
ibmcom/icp-identity-provider                2.1.0               e22ffd935288        7 weeks ago         164MB
ibmcom/iam-token-service                    2.1.0               1cd246816870        7 weeks ago         896MB
ibmcom/icp-platform-auth                    2.1.0               7a0cbbda8a4c        7 weeks ago         503MB
ibmcom/icp-catalog-ui                       2.1.0               d796f932443a        7 weeks ago         110MB
ibmcom/icp-platform-api                     2.1.0               41cee979105e        7 weeks ago         140MB
ibmcom/icp-platform-ui                      2.1.0               21d762ee71b3        7 weeks ago         157MB
ibmcom/icp-router                           2.1.0               a33bb610a231        7 weeks ago         46.5MB
ibmcom/unified-router                       2.1.0               56b95d3d24a6        7 weeks ago         50.1MB
ibmcom/icp-image-manager                    2.1.0               b2da60c84dd2        7 weeks ago         13.6MB
ibmcom/mb-tools                             2.0.0               38ad02e1fc10        7 weeks ago         422MB
ibmcom/icp-helm-api                         2.1.0               f4447993b624        7 weeks ago         146MB
ibmcom/icp-helm-repo                        2.1.0               4e5263125b93        7 weeks ago         91.7MB
ibmcom/mb-jenkins                           2.0.0               2b56150ae924        7 weeks ago         860MB
ibmcom/sas-api                              20171015            a5d1540bf097        7 weeks ago         514MB
ibmcom/iam-policy-decision                  2.1.0               549e1bf00613        7 weeks ago         517MB
ibmcom/iam-policy-administration            2.1.0               a6d087878dcb        7 weeks ago         876MB
ibmcom/metering-reader                      2.1.0               5033e38b5ad8        8 weeks ago         166MB
ibmcom/metering-ui                          2.1.0               98a7ff80c3fd        8 weeks ago         435MB
ibmcom/metering-data-manager                2.1.0               08631e3cce6e        8 weeks ago         72.3MB
ibmcom/metering-server                      2.1.0               6f87989e29ba        8 weeks ago         630MB
ibmcom/sas-mgmt                             20171011            75fe0662a7ab        8 weeks ago         514MB
ibmcom/notification-dispatcher              20171011            a12fcde6365e        8 weeks ago         1.19GB
ibmcom/livescan-proxy                       20171011            1f28dd781b9a        8 weeks ago         418MB
ibmcom/rootkit-annotator                    20171011            e0d54f8afa6a        8 weeks ago         413MB
ibmcom/usncrawler                           20171011            ba4a60853837        8 weeks ago         480MB
ibmcom/password-annotator                   20171011            13cbea171a66        8 weeks ago         1.19GB
ibmcom/compliance-annotator                 20171011            9a6812e9f19f        8 weeks ago         1.27GB
ibmcom/vulnerability-annotator              20171011            bca818bb6d43        8 weeks ago         1.26GB
ibmcom/config-parser                        20171011            b69068191cc9        8 weeks ago         1.22GB
ibmcom/generic-indexer                      20171011            9a03a4f3cc64        8 weeks ago         785MB
ibmcom/config-indexer                       20171011            6f388d467108        8 weeks ago         785MB
ibmcom/elasticsearch                        2.4.1-20171011      7317af2ea391        8 weeks ago         537MB
maven                                       3.5.0-jdk-8         080cf1fccf1c        2 months ago        750MB
ibmcom/zipkin                               2.1.0               1f99fd08ad3f        2 months ago        421MB
ibmcom/reg-crawler                          20171006            5317e50c4ae0        2 months ago        716MB
ibmcom/metrics-crawler                      20171004            75a5b43eaec3        2 months ago        715MB
ibmcom/live-crawler                         20171004            b72b1ccb62e2        2 months ago        715MB
ibmcom/indices-cleaner                      0.2                 5e092b17e223        2 months ago        210MB
ibmcom/statsd                               0.7.2               e6e33f5278c2        2 months ago        640MB
ibmcom/k8s-kubectl                          v1.7.6              fbd8bfaa7dd2        2 months ago        76.9MB
ibmcom/icp-initcontainer                    1.0.0               76da55c8019d        2 months ago        3.97MB
ibmcom/rescheduler                          v0.5.2              f428ec8116de        2 months ago        48.1MB
ibmcom/ucarp                                1.5.2               d6f29a895ed9        3 months ago        7.67MB
ibmcom/tiller                               v2.6.0              47011b53bf14        3 months ago        48.6MB
ibmcom/kubernetes                           v1.7.3-ee           44cb09921a21        3 months ago        741MB
ibmcom/k8s-helm                             v2.5.0              204ddc018348        3 months ago        184MB
ibmcom/nginx-ingress-controller             0.9.0-beta.12       091ec63a2173        3 months ago        118MB
ibmcom/calico-policy-controller             v0.7.0              60d797585fc5        3 months ago        21.9MB
ibmcom/service-catalog-apiserver            v0.0.15             3a30f3472e44        4 months ago        196MB
ibmcom/service-catalog-controller-manager   v0.0.15             708755fff078        4 months ago        193MB
ibmcom/kube-state-metrics                   v1.0.0              8bbbe7eb4704        4 months ago        43.9MB
ibmcom/calico-node                          v2.4.1              7643422fdf0f        4 months ago        277MB
ibmcom/grafana                              4.4.3               49e2eb4da222        4 months ago        287MB
ibmcom/calico-ctl                           v1.4.0              b0c499acdc21        4 months ago        43.6MB
ibmcom/calico-cni                           v1.10.0             88ca805c8ddd        4 months ago        70.3MB
ibmcom/curl                                 3.6                 f73fee23ac74        4 months ago        5.35MB
ibmcom/coredns                              010                 27e7aa6e71ce        4 months ago        43.5MB
ibmcom/kibana                               5.5.1               7bf53f710f44        4 months ago        629MB
ibmcom/filebeat                             5.5.1               af80995a4fcf        4 months ago        271MB
ibmcom/logstash                             5.5.1               e8f5c2ec30f2        4 months ago        577MB
ibmcom/elasticsearch                        5.5.1               74ef44f69db6        4 months ago        544MB
ibmcom/heketi                               5                   5851537645df        4 months ago        343MB
ibmcom/alertmanager                         v0.8.0              901c70144da4        4 months ago        17.7MB
ibmcom/heapster                             v1.4.0              749531a6d2cf        5 months ago        73.4MB
ibmcom/k8s-dns-sidecar                      1.14.4              38bac66034a6        5 months ago        41.8MB
ibmcom/k8s-dns-kube-dns                     1.14.4              a8e00546bcf3        5 months ago        49.4MB
ibmcom/k8s-dns-dnsmasq-nanny                1.14.4              f7f45b9cb733        5 months ago        41.4MB
ibmcom/prometheus                           v1.7.1              4da113bb6ae3        5 months ago        74.5MB
ibmcom/etcd                                 v3.1.5              3f6d64a8fae8        7 months ago        152MB
ibmcom/gluster                              0.5                 d22cfe32c3f8        7 months ago        332MB
ibmcom/node-exporter                        v0.14.0             bb4a6b774658        8 months ago        18.9MB
ibmcom/kafka                                0.10.0.1            223037679e4f        8 months ago        260MB
ibmcom/k8szk                                v2                  2fd25e05d6e2        11 months ago       284MB
ibmcom/mb-jenkins-slave                     2.5.2               9b21f9459d7a        15 months ago       644MB
ibmcom/configmap-reload                     v0.1                b70d7dba98e6        16 months ago       4.78MB
ibmcom/defaultbackend                       1.2                 4ac4774c2764        16 months ago       6.94MB
ibmcom/mariadb                              10.1.16             3b5159f610ed        16 months ago       392MB
ibmcom/registry                             2                   8ff6a4aae657        18 months ago       172MB
ibmcom/collectd-exporter                    0.3.1               8853888e7b44        18 months ago       13.8MB
ibmcom/pause                                3.0                 99e59f495ffa        19 months ago       747kB
```

いやー，さすがに違いすぎるやろ・・と思ってしまいますが。
開発版(Community Edition)と，商用版(Cloud Native Edition)では，含まれているイメージの数が全然違いました。

IBM Cloud Privateで構築した **Kubernetes環境 そのものをしっかり管理していくため** に，あらゆるオープンソース・テクノロジーを活用して仕上げているようです。

# まとめ
## Kubenetes環境を作りました。でもまだまだあります
本稿では，オンプレミスでクラウドネイティブを実現するための環境として，IBM Cloud Private (エンタープライズグレードのKubernetes環境)のCommunity Editionを導入しました。
お試しがてら，コンソール画面の一部や，カタログからサンプルアプリケーションを選択しデプロイ・稼働確認を行いました。

これでクラウドネイティブ・コンピューティングでマイクロサービスを実際に動作させるための最初のステップは行えた！
と言えるかと思います。

しかし，実はまだ・・・
IBM Cloud Privateの3つの側面の1つ目だけです。残る2つは，**マルチクラウドの構築自動化・管理機能**，さらに **Cloud Foundry**。

細かく見ると有力なものが他にもあります。
例えば，セットで提供されるツール (**Microservice Builder**) とか。

Microservice Builderを使うと，新規にアプリケーションを開発して IBM Cloud Private環境にアプリケーションをリリース，そして継続的に更新を続けられるようになります。
CI/CD (継続的インテグレーション/デリバリー)って何？って思ってるヒトも勝手に自動化の世界に引き込まれることでしょう。

いまこのエリアのテクノロジーは非常にHOTなので皆さんも楽しんで貰えると思います。
早くやったもん勝ちだと思うので，ぜひ一緒にやりましょう。


## 1つお願い

しばらく遊んだあとには，ぜひ，組織やチームの体制，もっとも効率よく開発・運用できるツールの組合せ，その実現方法，それらのチームでの使い方，などを少しだけ考えてみてください。(考え込む必要はないと思います)

クラウドネイティブの世界で，"こうあるべき" という姿はあるにはあると思いますが，アプリのアジャイル開発と同様に，実際に使っていく中で組織ごとに最適化していくのが良いのではないでしょうか。

エラそうなこと言っているようですが，私も挑戦者の一人です。ご意見があれば，コメント欄でも，Twitterでも構いませんので，お気軽にどうぞ。公開されないようにDMでも構いません。

## 次回
さて次回ですが，正直何をやろうか決めてません。方針としては開発・運用者の役に立てるような内容を発信したいと思います。
しかし，一般的な内容にするとレベル感が低すぎるのが難点なのですが，重要なところはとことん細かくやっていければと思います。またよろしくお願いいたします。

内容についてのリクエストなどもあればお気軽にどうぞ。やれる範囲で頑張ります。

# 参考リンク
- [English] Officialマニュアル: [製品マニュアルのトップページ](https://www.ibm.com/support/knowledgecenter/SSBS6K_2.1.0/kc_welcome_containers.html)
- [English] Officialマニュアル: [IBM Cloud Private-CE インストール](https://www.ibm.com/support/knowledgecenter/SSBS6K_2.1.0/installing/install_containers_CE.html)
- [English] Officialマニュアル: [IBM Cloud Private-CE アンインストール](https://www.ibm.com/support/knowledgecenter/SSBS6K_2.1.0/installing/uninstall_ce.html)
- [English] Officialマニュアル: [トラブルシューティング](https://www.ibm.com/support/knowledgecenter/SSBS6K_2.1.0/troubleshoot/troubleshoot.html)
- [English] ハンズオン: [Webブラウザで試せるハンズオン](https://www.ibm.com/cloud/garage/content/architecture/private-cloud)
- [日本語] SlideShare 製品概要: [IBM Cloud Private の全貌 (kubernetesベース)](https://www.slideshare.net/capsmalt/ibm-cloud-private-kubernetes)