IBM Bluemix Container Serviceで自前のdocker imageを稼働させるまで

Bluemixで自前のdocker imageが動かせたらいいのに。デモ環境とかみんなに配って使ってもらえるし。

こちらにガイド作成されているのですが、どうもBluemixがサービス構成変更してしまったようで・・
http://qiita.com/m_mizutani/items/2926a63a766dcf64776c

[IBM Container Registry](https://console.bluemix.net/docs/services/Registry/index.html)と[IBM Container Service](https://console.bluemix.net/docs/containers/container_index.html)を組み合わせることが必要になったようです。

Container Serviceを見ると、いきなり「Kubernetes clusters入門」なんてとこからスタートされて、ちょっとハードル高く感じてしまいますね。シングルノードで動かしたいだけなのだけど・・というわけで以下メモ。

作業するにあたり、以下のものは揃っているものとします。

- Bluemixアカウント(IBM ID)
- Bluemix CLI
- Dockerエンジン(起動しておいてください)
- Bluemixで動かしたいDockerイメージ

環境

- macOS Sierra 10.12.5
- Docker Version 17.03.1-ce-mac12 (17661)
- Bluemix CLI version 0.5.4+ae22935-2017-05-18T06:24:28+00:00

#イメージ稼働までのステップ
まずはイメージがBluemix上で稼働して、ログインできることを目指します。

1. CLIの準備
1. IBM Container Registryにdockerイメージ追加
1. IBM Container ServiceでLite Kubernetes Cluster作成
1. dockerイメージを実行

##IBM Container Registryとは
Container Serviceからdocker image管理のサービスが切り出されたようですね。

[サービス説明](https://console.bluemix.net/docs/services/Registry/index.html?pos=2)を見てみると、Dockerイメージ保管と共有のためのサービスとのこと。
>IBM® Bluemix® Container Registry provides a multi-tenant private image registry that you can use to safely store and share your Docker images with users in your Bluemix account.

>If you used the container registry in IBM Bluemix Container Service before 15 June 2017, you must consider the information in Moving to IBM Bluemix Container Registry.

##IBM Container Serviceとは
これまた[公式ドキュメント](https://console.bluemix.net/docs/containers/cs_ov.html#cs_ov)によると、以下のようなサービスとのこと。（著者訳)
>IBM® Bluemix® Container Serviceとは、DockerとKubernetes を組み合わせることで、強力なツールと、直感的なユーザーエクスピリエンス、分離環境と組み込まれたセキュリティを、そして個々のホストに分散して配置されたアプリケーションクラスタに対してKubenetes APIを通じたデプロイ・運用・スケーリング、監視の自動化を提供します」

Kubernetes推しですが、今のところはdockerだけ使いたい・・
なんて思ったものの、サービス見て見ると、Lite Kubernete Clusterだと1ノードでした。
(ちょっと手順は増える気がするけど)やりたいことはできそうです。


##CLIの準備
###プラグイン導入
コンテナサービス用にCLIのプラグインを導入します。
[ドキュメント](https://console.bluemix.net/docs/containers/cs_cli_install.html#cs_cli_install) を参考にやってみましょう。

まずはContainerを触るためのプラグイン。

```shell-session
$ bx plugin install container-service -r Bluemix
Looking up 'container-service' from repository 'Bluemix'...
Attempting to download the binary file...
21299472 bytes downloaded
Installing binary...
OK
Plug-in 'container-service 0.1.259' was successfully installed into /Users/hiroshi/.bluemix/plugins/container-service.
```

container-registryプラグインも導入します。

```shell-session
$ bx plugin install container-registry -r Bluemix
Looking up 'container-registry' from repository 'Bluemix'...
Attempting to download the binary file...
11786288 bytes downloaded
Installing binary...
OK
Plug-in 'container-registry 0.1.166' was successfully installed into /Users/hiroshi/.bluemix/plugins/container-registry.
```

ちゃんとインストールされたか確認。

```shell-session
$ bx plugin list
Listing installed plug-ins...

Plugin Name          Version   
container-registry   0.1.166   
container-service    0.1.259    
```

### Kubenets CLIのインストール
後ほどContainer Serviceでクラスタ作るときに必要なので、CLI導入します
OS X
    https://storage.googleapis.com/kubernetes-release/release/v1.5.6/bin/darwin/amd64/kubectl
Linux
    http://storage.googleapis.com/kubernetes-release/release/v1.5.6/bin/linux/amd64/kubectl
Windows
    http://storage.googleapis.com/kubernetes-release/release/v1.5.6/bin/windows/amd64/kubectl.exe

落としてきたファイルを /usr/local/binへ移動。

```shell-session
$ mv /users/hiroshi/Downloads/kubectl /usr/local/bin/kubectl
```
念のためちゃんとパス通ってるよねと。

```shell-session
$ echo $PATH
/usr/local/apache-maven-3.0.5/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin
```

実行権限忘れずに付けます。

```shell-session
$ chmod +x /usr/local/bin/kubectl
```

##IBM Container Registry にイメージを追加する
[こちら](https://console.bluemix.net/docs/services/Registry/index.html)から手順をピックアップして簡単に。

###Bluemix CLIログイン

```shell-session
$ bx login -a api.ng.bluemix.net [-sso]
```

US-South以外を使用している場合は、api.ng.blumix.net の部分を変更してください。

- api.au-syd.bluemix.net
- api.eu-gb.bluemix.net

アカウント、パスワード等聞かれるので入力します。
認証連携されてる場合は、-ssoを忘れずに。

###Container Registryへのログイン
```shell-session
$ bx cr login
Logging in to 'registry.ng.bluemix.net'...
Logged in to 'registry.ng.bluemix.net'.

OK
```

###Namespaceの設定
Dockerイメージを登録する先としてNamespaceを決めます(hirokitaの部分をそれぞれ変えてください)
Regionごとにユニークである必要があるとのこと。

```shell-session
$ bx cr namespace-add hirokita
Adding namespace 'hirokita'...

Successfully added namespace 'hirokita'

OK
```

##dockerイメージのpush
tag設定するため、pushしたいイメージのIMAGE IDを探します。

```shell-session
$ docker images
REPOSITORY                                        TAG                 IMAGE ID            CREATED             SIZE
irtest                                            latest              72b70d9a8360        8 minutes ago       2.55 GB
```

Bluemixのリポジトリに合わせてtag設定し、

```
$ docker tag <IMAGE ID> registry.ng.bluemix.com/<namespace>/<image_repo>:<tag>

例
$ docker tag 72b70d9a8360 registry.ng.bluemix.com/hirokita/irtest:latest
```

イメージをpushします。

```shell-session
$ docker push registry.ng.bluemix.net/hirokita/irtest
The push refers to a repository [registry.ng.bluemix.net/hirokita/irtest]
7cffb2d94fff: Pushed 
latest: digest: sha256:53aeb262ea8363d2a309dd206b3d5414d45d656a1a61ac3034de9827bae855b8 size: 529
```

イメージが追加されたことを確認。

```shell-session
$ bx cr image-list
Listing images...

REPOSITORY                                NAMESPACE   TAG      DIGEST         CREATED       SIZE     VULNERABILITY STATUS   
registry.ng.bluemix.net/hirokita/irtest   hirokita    latest   53aeb262ea83   5 hours ago   605 MB   OK
```



##Container実行、その前に。


###Container Serviceプラグインへのログイン
```shell-session
$ bx cs init
Using default API endpoint: https://us-south.containers.bluemix.net
OK
```
###Lite Kubernetes Cluster作成

[リンク先](https://console.bluemix.net/docs/containers/cs_tutorials.html#cs_apps_tutorial_lesson1) にあるような、シングルインスタンスのクラスタを作成します。

```shell-session
$ bx cs cluster-create --name first_cluster
Creating cluster...
OK
```
コマンドはすぐ返ってきますが、デプロイにはちょっと時間がかかります。(ドキュメントによると最大15分くらいかかるかも)

ワーカーノードのデプロイが完了したかチェックします。
(NGの例)

```shell-session
$ bx cs workers first_cluster
Listing cluster workers...
OK
ID                                                 Public IP   Private IP   Machine Type   State               Status   
kube-hou02-pafea0786bae5246c3b718e47384af8300-w1   -           -            free           provision_pending   Waiting for master to be ready 
```

(OKの例: Stateが`deployed`になっている)

```shell-session
$ bx cs workers first_cluster
Listing cluster workers...
OK
ID                                                 Public IP        Private IP     Machine Type   State      Status   
kube-hou02-pafea0786bae5246c3b718e47384af8300-w1   169.48.131.37   10.177.161.132   free           deployed   Deploy Automation Successful  
```

環境変数を取得します。今後このクラスターを操作する際には必ずこのコマンドを実行して設定を取得する必要あり。

```shell-session
$ bx cs cluster-config first_cluster
Downloading cluster config for first_cluster
OK
The configuration for first_cluster was downloaded successfully. Export environment variables to start using Kubernetes.

export KUBECONFIG=/Users/<username>/.bluemix/plugins/container-service/clusters/first_cluster/kube-config-hou02-first_cluster.yml
```

最後の一行、コピー＆ペーストして実行します

```shell-session
$ export KUBECONFIG=/Users/<username>/.bluemix/plugins/container-service/clusters/first_cluster/kube-config-hou02-first_cluster.yml
```
Kubernete CLIコマンドを使って、`Server Version`が正しく取得できることを確認します。

```shell-session
$ kubectl version --short
Client Version: v1.5.6
Server Version: v1.5.6-4+abe34653415733
```

Deploymentを作成します。

```shell-session
$ kubectl run irtest-deployment --image=registry.ng.bluemix.net/hirokita/irtest:latest
deployment "irtest-deployment" created
```
[この図](https://console.bluemix.net/docs/containers/cs_tutorials.html#cs_apps_tutorial_lesson1) のように、1つのPodから構成されるDeploymentを作成したことになります。