OpenShift Origin 3.7でnoderedを導入してみた

OpenShift 有志で作るゆるーい Advent Calendar 2017
今日の記事はOpenShift環境を使って、WebGUIだけでアプリケーションのデプロイをやってみたを紹介します。

ゆるすぎて初日は盛大に導入失敗しましたが、ちょっと待って下さい。
もう引き返そうとしているあなた、もうちょっと見ていってください。

あるんです。代替が。
minishiftというopenshift環境を簡単に作れるパッケージが。
minishiftならではのあるあるはこのあとのadvent calendar内でおいおい触れていきます。
@nekopさん主催の[OpenShift 全部俺 Advent Calendar 2017](https://qiita.com/advent-calendar/2017/openshift)の１日目の記事で[minishiftでOpenShift Origin v3.7.0を利用する](http://nekop.hatenablog.com/entry/2017/12/01/094117)でFedraベースの導入を紹介されています。

ちょっとバタついてしばらく時間が空いてしまったのですが、
これから挽回です！　まずは７日分を書きますが、飛んだ日の分はおいおい考えます。



# OpenShift Origin 3.7 minishift + nodered

## 環境
OpenShift Origin 3.7ベースで今回はこの記事を作成していますが、
OpenShift 3.xであれば特に憂慮せず利用できると信じてます。
minishiftと普通のOriginの違いは大きくないので今回は触れません。

今回はMacBook(Early 2015)上のmacOS Sierra 10.12.6上に
minishiftを導入済みの環境でNode-RED containerを導入します。

[Node-RED UserGroup Japan Doc -
 Running Under Docker] (http://nodered.jp/docs/platforms/docker)

## Node-REDってなに？
Node-REDはIBMが開発した直感的にGUIからAPIやオンラインサービス、IoT機器などをNodeという機能の単位を線と線で繋いで流れを作る開発環境です。

既存で自分たちで作ったContainerベースのアプリケーションをAPI連携などして、Node-REDの部品と外部のサービス、IoT機器のセンサ情報などを組み合わせて簡単にプログラムが作成できます。

機能の部品はnode.jsで書かれているので、カスタマイズしたり、このパーツを公開して多くの人から利用いただいたりなど、可能性は無限大です。

[Node-RED UserGroup Japan](http://nodered.jp/)


## Node-RED + Docker　での留意点
1. ストレージが必要：
Node-REDは動作の流れ「フロー」をコンテナ上から見ると"/data"の位置にデータを保存します。
このフローの保存先をPersistent Volumeとして、メモリ空間ではなくストレージに保管できるようにOpenShiftでのデプロイ時にストレージの割当を行います。

## やってみる

 
### プロジェクトを作成
openshift WebConsoleからまず、Projectを作ります。
すでに作成済みの方はスキップしてください。
![makeproject](https://qiita-image-store.s3.amazonaws.com/0/126158/255d8aec-c8f9-353c-a650-5cb1ca3ba1f1.png)

### Deploy　Imageを開く

<img width="826" alt="スクリーンショット 2017-12-08 4.57.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/126158/1bfc4a23-85e8-7e04-1cca-60109d98a91b.png">

### Deploy Imageのパラメータ指定
Projectへは先程作成したProject名を利用します。
Image Nameの部分は以下を指定して、Searchボタン（虫眼鏡アイコン）をクリックします。
docker.ioからdocker imageを探して来て表示してくれます。

この画面ではコンテナに与える環境変数なども指定できるのですが、今回は使用せず「Deploy」をクリックします。

```bash
nodered/node-red-docker
```

<img width="899" alt="スクリーンショット 2017-12-08 4.58.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/126158/b5aba8b7-67e9-aebc-c0c5-59ceac2bdd56.png">

<img width="896" alt="スクリーンショット 2017-12-08 5.00.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/126158/a10c4a2b-f7d9-5c59-313c-6d9a7125b0e7.png">
<img width="899" alt="スクリーンショット 2017-12-08 5.02.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/126158/2f7c86f0-09af-a7f0-c18e-ffede3012816.png">
### created successfully
作成完了のメッセージが出たら、Closeをクリックします。


<img width="899" alt="スクリーンショット 2017-12-08 5.02.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/126158/ea425e44-4a5b-0fa6-c88c-7391b938e119.png">

### 最初は失敗してしまう
/dataのストレージが割り当てられていないため、Permission Deniedとしてエラーになります。
このあとストレージを割り当てます。

今回は特に外部で公開されたdocker-imageを利用しているので、
事前の割当が出来ずこのエラーがどうしても出るのですが、後日公開するQiitaでは、
事前にこのあたりも定義して一度の操作で全部定義できるようにしたいと思います。

赤い丸で囲われた「１」の数字をクリックしてください。
<img width="1021" alt="スクリーンショット 2017-12-08 5.03.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/126158/c54a572e-c752-b2b2-1bf1-6e2ba7742dbe.png">

### deployment configからAdd Storage画面を開く
画面左下のところに「Add Storage to {コンテナ名}」とテキストリンクがあるのでクリックします。
<img width="448" alt="スクリーンショット 2017-12-08 5.05.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/126158/bcb21501-0f40-86aa-8943-ac005d1636a2.png">

### No Persistent volume claimsエラー
見慣れない言葉が出てきたかもしれません。すごくおおざっぱに説明すると、以下のようになります。
コンテナが停止してもデータを永続的に残したいため、今回はストレージを利用します。

|名称|説明|
|:--|:--|
|Persistent Volume Claim|コンテナが利用するストレージの定義ラベル(開発者がほしいストレージの要求を書ける)|
|Persistent Volume|NFSなど実態のボリューム定義(インフラ管理者しか基本作れない、今回はminishiftで予め用意されたものを利用)|

### Persistent Volume Claim(PVC)の追加
Create Storageをクリックします。

<img width="721" alt="スクリーンショット 2017-12-08 5.05.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/126158/13389053-797f-e0b3-2936-9f9633a91d42.png">

|名称|説明|
|:--|:--|
|Name|適当な名前を付ける。今回はnodered-data|
|Access|今回はデータを共有しないのでSingleにしますが、複数のコンテナから利用する場合は、Share、読み取り専用ならReadOnlyを選びます|
|Size|今回必要な要求数を入力します。<br>この容量に見合ったPersistent Volume(PV)を探してアサインされます|




<img width="860" alt="スクリーンショット 2017-12-08 5.06.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/126158/c649e7e2-4153-1e01-c3e2-9cfd93d71271.png">
入力後、Createをクリックすると、作成されます。
<img width="469" alt="スクリーンショット 2017-12-08 5.06.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/126158/7b9872a2-dfd6-c9d3-0437-5596e18d92e0.png">

### コンテナへのPVC割当
PVCが作成されたのち、コンテナへのマウント定義が必要になります。

|名称|説明|
|:--|:--|
|Storage|先程作成したnodered-dataが選択されます。<br>複数存在する場合はどれか１つを選べる様になります。|
|Mount Path|コンテナからみた絶対パスを指定します。<br>今回は/dataを指定します|

指定後、Addをクリックして完了です。
<img width="836" alt="スクリーンショット 2017-12-08 5.07.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/126158/54189c0b-a977-469f-f8ff-5b62139e87ce.png">
<img width="835" alt="スクリーンショット 2017-12-08 5.07.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/126158/e9012200-373b-178b-e9c0-cb2ec51a6610.png">
<img width="433" alt="スクリーンショット 2017-12-08 5.08.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/126158/004f4e2e-376b-0272-f4d5-18cefaa5bff6.png">


ここまでで、Dockerコンテナのデプロイとストレージ割当が完了しました。
これによりPermission Deniedとなっていた部分のエラーが解消されコンテナが起動しています。
このあとはrouteを定義して外部から通信出来る経路を設定します。
### Route/Serviceの作成
画面Create routeをクリック
<img width="1006" alt="スクリーンショット 2017-12-08 5.09.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/126158/2e201737-10b5-39f1-ae1d-b4f80f9b2521.png">

以下パラメータを決定して次へ進みます。

|名称|説明|
|:--|:--|
|Name|node-red-dockerを指定<br>Hostnameを未指定の場合はここにDynDnsの名前が表示されます。|
|Hostname|DNSで名前解決出来るドメインがある場合はこちらへ登録します。今回はnip.ioを利用するため未使用|
|Path|基本は/で良いのですが、同じFQDNでURIの部分のみ変えたい場合に変更|
|Service|Dockerイメージを取得した際に登録されているものを使用します。|
|Security|今回は使用しませんが、SSL証明書を利用する時などに使用します。|


<img width="838" alt="スクリーンショット 2017-12-08 5.10.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/126158/b795da25-154d-d04d-10d7-c02374960c41.png">
<img width="838" alt="スクリーンショット 2017-12-08 5.10.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/126158/acf1e224-8c5b-feb4-5e15-754a12c3749e.png">
<img width="433" alt="スクリーンショット 2017-12-08 5.11.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/126158/58823cb4-573c-4109-d3e5-b910a7fead8f.png">

### 完成
これでアプリのデプロイと設定が完了です。
URLをクリックすると、Node-REDが利用できる状態となります。
<img width="1008" alt="スクリーンショット 2017-12-08 5.11.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/126158/49ec8424-beb7-4010-ffce-8d824a5f590a.png">

#### Node-REDフローエディタ
<img width="634" alt="スクリーンショット 2017-12-08 5.12.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/126158/8a292a80-04de-2948-bbf1-4f5231a467e6.png">

# おさらい
1. WebGUIで簡単にアプリがデプロイできる
2. docker.ioのイメージが簡単に使える

# 今後の展望
1. Node-REDをせっかくOpenShiftで稼働させるならスケールアウト対応させたい
2. もっと簡単にデプロイ・設定出来るテンプレ作りたい