bluemix kubernetes clusterを試してみる

# 概要
今回はbluemix kubernetes clusterを試してみました。

# （祝）日本語対応
2017/04/21 Bluxmix supportから、日本語で見れるようになりました。
と丁寧にアナウンスいただき確認しました。
画面キャプチャは追って後日更新します。

~~# 操作画面が利用できないあなたへ
※2017/03/20現在、ブラウザ言語設定で「日本語」が優先設定されていると、
項目がすべて"TRANLATE"と表示されて操作不能という状態になっています。(windows chrome/firefox)
日本語の順序を最下位にすることで表示が可能です。
![language.PNG](https://qiita-image-store.s3.amazonaws.com/0/126158/94fd659c-e984-1b2e-73df-7eccd13d1f6c.png)~~

~~※2017/03/20現在 ticketでフィードバックいれました。
国際化作業を実施中なのでこうなっているとのことです。~~

# Bluemix Kubernetes Clusterの開始
#### 1.Kubernetes Clusterをクリック
![image](https://qiita-image-store.s3.amazonaws.com/0/126158/2ed9fd4b-0319-bc05-b74b-4dfa8835767a.png)

#### 2. Cluster typeを選ぶ
2つのCluster typeから選びます。

###### 無料版(Free)
 
|設定項目|設定内容|メモ|
|:---|:---|:---|
|Cluster Name|クラスタ名|まさかと思い、日本語いれたらOKでした|
|Location:|dal10|現在はダラスのみ固定|
|Machine type:|Micro 1CPU-4GB RAM|固定|
|Number of workers:|1|固定|

###### 有料版(Paid)

|設定項目|設定内容|メモ|
|:---|:---|:---|
|Cluster Name|クラスタ名||
|Kubernetes version|1.5.3|3/20現在固定|
|Location:|dal10|現在はダラスのみ固定|
|Machine type:|Micro 2CPU-4GB RAM||
||Balanced　4CPU-16GB RAM||
||Balanced　16CPU-64GB RAM||
||Balanced　32CPU-128GB RAM||
||Balanced　56CPU-242GB RAM||
|Number of workers:|1-100000000000000000000|(試しに入れられるだけいれてみました・・・)|
|Hardware:|Dedicated|専有DockerHost|
||Shared|共有DockerHost|

#### 3. 4～5分でDeploy完了
[Bluemix CLI](https://clis.ng.bluemix.net/ui/home.html)のcontainer-serviceプラグインを導入する。

# 設定手順
#### 1. Bluemix CLIへcontainer-serviceプラグインを導入する
```lang
> bx plugin install container-service -r Bluemix
```
![image](https://qiita-image-store.s3.amazonaws.com/0/126158/2b5c28af-207f-6827-0e9a-469602bd639c.png)

#### 2. Bluemix ヘログイン
```lang
> bx login -a https://api.ng.bluemix.net
```
![image](https://qiita-image-store.s3.amazonaws.com/0/126158/80e323fb-d77b-a713-729e-316f308deb05.png)

#### 3. Bluemix コンテナサービスの起動
```lang
> bx cs init
```
![image](https://qiita-image-store.s3.amazonaws.com/0/126158/7ae172aa-35be-a106-c664-05653f39c043.png)

#### 4. クラスタの切り替え
```lang
> bx cs cluster-config 日本語クラスタ
```
![image](https://qiita-image-store.s3.amazonaws.com/0/126158/1fe6db1a-73c8-aaa8-1559-f2bb2497d826.png)

#### 5. 稼働クラスタの確認
```lang
> bx cs clusters
```
![image](https://qiita-image-store.s3.amazonaws.com/0/126158/96b296ec-d780-430c-b396-35db66667e3f.png)

#### 6. kubernetes dashboardの起動
kubectl proxyを利用してdashboardへ接続します。

```lang
> kubectl proxy
```

![image](https://qiita-image-store.s3.amazonaws.com/0/126158/58ae36e4-f249-02ab-ba90-62a867a116a4.png)

ブラウザから以下URLを開く

```lang
http://localhost:8001/
```

![image](https://qiita-image-store.s3.amazonaws.com/0/126158/80b3beda-33bb-d6a1-292f-6b75ae4ece48.png)

#### 7. コンテナのデプロイ

Specify app details below・・・スペック情報をWebから
Upload a YAML or JSON file・・・YAML or JSONに記述した情報を元にデプロイ

###### 基本設定項目

|設定項目|設定項目（日）|設定内容|メモ|
|:---|:---|:---|:---|
|AppName|デブロイアプリ名|テストアプリ||
|Container image|コンテナイメージ名|centos:7|Docker Hub/Bluemix registry/google container registry(?)で入手可能なイメージ|
|Number of pods|ポッド数|3|デプロイするpodの数|
|Service|サービス|External|None(なし)Internal(内部IP)/External(外部IP)|
|Port[A1]|公開ポート番号|22|SSHポートの開放例|
|Target port[A1]|コンテナ側ポート番号|22|SSHポートの開放例|
|Protocol[A1]|プロトコル名|TCP|SSHポートの開放例|

[A1]は組み合わせで繰り返しポート数分設定可能
※Free typeは、ここで公開ポートを指定するとうまくいかない。

###### 拡張設定項目
SHOW ADVANCED OPTIONSをクリックすると以下設定ができる

|設定項目|設定項目（日）|設定内容|メモ|
|:---|:---|:---|:---|
|Description|詳細|test application conainter|詳細メモ|
|Labels Key[B1]|ラベル キー|app|Podメタ情報ラベル(初期値)|
|Labels Value[B1]|ラベル 値|test|Podメタ情報キー(初期値)|
|Labels Key[B1]|ラベル キー|version|Podメタ情報ラベル(初期値)|
|Labels Value[B1]|ラベル 値|7|Podメタ情報キー(初期値)|
|Namespace|ネームスペース|default|default/ibm-system/kube-system/Create a new namespaceがあるが、defaultのまま|
|Image Pull Secret|イメージ取得用シークレット|(null)|docker imageを取得するときに必要なシークレット|
|CPU requirements(cores)|要求CPUコア数|(null)|millicore指定じゃなくなった？|
|Memory requirements(MiB)|要求メモリMiB数|(null)|MiBです。MBではありません。(1024kb計算)|
|Run command|実行コマンド|(null)|実行コマンド|
|Run command arguments|実行コマンドオプション|(null)|実行コマンドオプション|
|Run as privileged|特権での実行|false|false=チェックしない。shareのdockerhostだと無理なんじゃないかな？あとで試す|
|Environment variables Name[B2]|環境変数名|TMP_ENV|コンテナ内に引き継ぐ環境変数名|
|Environment variables Value[B2]|環境変数値|HelloWorld|コンテナ内に引き継ぐ環境変数の値|


[B1]は組み合わせで繰り返しラベルが設定可能
[B2]は組み合わせで繰り返し環境変数が定義可能

#### 8. 盛大に失敗してみる。
当然CPU数が1なので2個以上のコンテナは起動ができないとエラーとなります。
![image](https://qiita-image-store.s3.amazonaws.com/0/126158/295370f4-1137-ac25-5cd3-d8b938353976.png)

#### 9.コンテナデプロイまで暫し待つ
imagesをcentos:7としたら、crash loopして失敗してしまった。
![image](https://qiita-image-store.s3.amazonaws.com/0/126158/e2f9303c-fa99-b07f-e5a2-64f5b7536cb3.png)

nginx:latestとしたことですぐ動作した。
![image](https://qiita-image-store.s3.amazonaws.com/0/126158/b4231b21-fd36-16b8-d6ea-cc61f87059e8.png)

# 外部からのアクセス
ここからはキャプチャが一部変わります。
(noderedコンテナで試すことに統一します。後日前半も入れ替えてみます）

###### (2017/03/23現在)
kubernetesのload balancerはpaidtype以上定義ができないような記述も見たので、
そもそもそれが原因なのか、現在問い合わせ中
## SVCの種類
Service(SVC)には３種類あり、Free typeで使用できるのは「Node Port」のみだということがわかりました。

|種類|使用可能区分|説明|
|:---|:---|:---|
|NodePort|無償/有償両方|1コンテナ1ポートが開放可能/コンテナ起動ごとにポート番号変動(30000 - 32767のハイポートのみで80/443など任意のポート開放ができない)|
|Load balancer|有料のみ|Layer3? Layer4?ロードバランサ(TCP/UDP over IP)<br>グローバルIP(portable public)が4つ用意され、アプリ用の外部TCP/UDPロードバランサが作成可能。コンテナの起動停止に左右されない。|
|Ingress|有料のみ|Layer7ロードバランサ。<br>URLベース、パス振り分け、SSLロードバランスができる|
※この辺は自分もまだぼやーっとしてるところがあるので、ご指摘いただければ幸いです

kubernetes dash board画面ではGUIで登録できないため、
この手順ではYAMLファイルを作成して利用してみます。

### NodePortでのポート開放手順
#### 1.YAMLの作成
今回はテキストエディタを使用して。nodered-svc.ymlファイルを作成しました。
NodePortの部分は試しに1880をいれてデプロイしてみたところ、
使用可能レンジから外れたためエラーとなり使用できませんでした。
（30000 - 32767の範囲であれば指定可能なようです）


```yaml
apiVersion: v1
kind: Service
metadata:
  name: nodered
  labels:
    run: nodered
spec:
  selector:
    app: nodered
  type: NodePort
  ports:
   - protocol: TCP
     port: 1880
     #nodePort: 1880
```

#### 2. yamlの登録
kubenetes dashboard (kubectl proxyを使用して、先程開けたdashboardです。 [http://127.0.0.1:8001/ui/](http://127.0.0.1:8001/ui/))を利用してServiceのyamlを登録します。

「・・・」をクリックして、nodered-svc.ymlファイルを選択し、Uploadします。
![image](https://qiita-image-store.s3.amazonaws.com/0/126158/819cdfe4-e1a8-5d46-4074-022341a63d73.png)

#### 3. Service登録の確認
うまく登録ができると、以下画面のようにyamlで登録したServiceが表示されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/126158/857d899e-4d7a-8b0f-fb21-df23d7dc0abf.png)

#### 4. IPアドレスの確認
コマンドプロンプトに戻り、Kubernetesに割り当てられているbluemix側のグローバルIP(FCR)とローカルIP（BCR）のIPを確認します。
どちらのIPでも良いのでメモしておきます。
BCRはもちろんSSL-VPNでSoftLayerのBCR(10.0.0.0/8)につながるようにしておいてください。

```lang
> bx cs workers <クラスタ名>
```
![image](https://qiita-image-store.s3.amazonaws.com/0/126158/129d2268-7320-3e97-487f-a5679f52c8dd.png)

#### 5. kubernetes側のサービスの確認
正しくServiceが登録されると、NodePortの場合、EXTERNAL-IPの箇所が<nodes>となります。
ここで、注目。1880:31791/TCPとこの画面キャプチャでは表示されていますが、
<1880=コンテナ側ポート番号>:<外部公開ポート番号>と認識してください。

```lang
> kubectl get svc
```

![image](https://qiita-image-store.s3.amazonaws.com/0/126158/73c54655-715a-12be-03fd-07b5258b4261.png)

##### 失敗したあなたへ。そしてまたつまずく。(2017/03/23現在 -> 2017/03/24解決)
EXTERNALがpendingって・・・
この記事の項目どおり、yamlで登録してNodePortとしてServiceを登録すれば、
こういったことは無いですが、僕は最初の段階でNodePortでなくkubenetes dashboardのGUI画面でポート開放をしようとしたため、このようになりました。

この場合はkubernetes dashboardの、SevicesからAction->Deleteを使用してServiceを削除しましょう。
![image](https://qiita-image-store.s3.amazonaws.com/0/126158/2f96191a-c38b-a5b0-5cab-5b54ce693456.png)

#### 6. Servicesの設定詳細の確認

```lang
> kubectl describe svc nodered
```
![image](https://qiita-image-store.s3.amazonaws.com/0/126158/48e3de70-15b3-fc78-2f41-b6e8461d0ca5.png)

#### 7. アクセスしてみる
ブラウザから、http://<グローバルIP or ローカルIP>:<NodePort>/でアクセスしてみます。

![image](https://qiita-image-store.s3.amazonaws.com/0/126158/fc9c6e19-d1b3-f2b2-a062-746e8314bc75.png)

→　接続できました！！





# 感想
まずはkubernetes clusterでpodがデプロイできるところまでを一気にやってみました。
kubernetesの知識がまだ筆者に足りないと痛感。出直してきます。

# 今わかっていること
1. free typeは1nodeが上限。CPU割当がmillicoreでなく、core単位なので1デプロイしか組めない。dockerhubのイメージを切り替えて使うなら、deploy configの置き換えなどをする必要あり。
2. kubectl proxyするkubernetes dashboardは日本語化済み。(kubernetes側が、i18n対応なので）冒頭の言語順位を変えていないブラウザで試すと日本語環境になる。

# TODO
1.centosでなぜcrash loop back offとなるのか確認
2.特権実行
3.有償プランでコンテナのpod展開まわり
~~4.コンテナのServices公開されたポートはinternetから見えないのか確認する~~
~~　kubernetes dashboardではCluster IPがプライベートアドレスで10.10.10.からはじまるIPだった。~~
~~　これを外からアクセスする手段の確認。~~
5.永続ストレージまわりの調査。PVCはできそうだけどPVは権限的に追加できるのか

# 更新履歴
2017/03/23 TODO 4.コンテナのポート開放周りを試したので追記（でも解決してない）、今わかっていることを追記
2017/03/24 TODO 4.コンテナのポート開放周りが成功したので追記・変更
2017/04/21 bluemix consoleのkubernetes画面が日本語化対応した為、Update

# キャプチャが変わった理由
centosコンテナがcrash look back off でデプロイうまくできていなので、
いったん見捨ててngixコンテナ、noderedコンテナの2つをデプロイして外からつなごうとしましたが今はまだ途中です。
※dockerイメージ、というかデプロイ単位を入れ替えるときには既存の設定を全部消してからデプロイしています。
YAMLを直接Editすれば、docker hubの元イメージを指定できます。

2017/03/24素材としてnoderedコンテナイメージを利用してみました。