Node-REDをIBM Cloud上で使うということ
Node-REDはビジュアルプログラミングツール、フローベースプログラミングツール、などと表現されることのあるプログラミングツールです。Node.jsで作成されたエディター上で、プログラミングのフローを組み立てると、Node.jsのWebアプリケーションが作成される、といったとても便利なツールです。
このNode-RED、IBMが開発しているのですがOSSとしてLinux Foundation/Ndode.js Foundation配下のプロジェクトとして開発が進められているので、必ずしもIBM環境下でないと動かせないものでは無く、実行環境さえ整っていればAWS上でも、Azure上でも、Raspbian上でも、もちろんスタンドアロンでも、可動してくれます。まあ、Node.jsアプリなので当然といえば当然です。
で、なぜIBM Cloudで動かすのかというと、開発元がIBMであることもあり、IBM CloudのPaaS上にNode-REDをボタン一つで使えるように出来るスターターキットが用意されているんですね。これは便利です。余計な設定など考えずに使い始められますからね。因みにこれはCF(Cloud Foundry)上で動くことになります。
さて、今後ですがCFが悪いわけでは無いですが、より移植性が良くメンテナンス性も良いコンテナ環境でNode-REDを動かすことが主流となるだろうと予測し、我々もIBM Cloud環境のマネージドKubernetesサービスでNode-REDを動かすことを推奨しています。IKSと呼ばれるものです。
※注意点:IBM Cloud/CF版のNode-REDではCloudantに設定情報や作成したFlowデータなどを保存してますが、今回のdockerイメージではNode-REDのホームディレクトリにこれらを保存します。なのでpodを削除するとデータごと消滅します。
IKS (IBM Cloud Kubernetes Service)
IBM Cloudはクレジットカードの登録が不要でいつまででも使えるライトアカウントというのがあります。通常アカウントを作成すると初期状態では全ての人がこのライトアカウントになります。
残念ながらIKSはライトアカウントで使うことができません。ではIBM CloudでKubernetesを使うとお金がかかってしまうのか?というのが気になる所だと思います。
ご安心下さい。Kubernetesを試してみたい方、そんなに本格的には使わないよという方向けに、無償で使えるプランがあります。アカウントそのものはライトアカウントからPAYGアカウント(クレジットカード登録が必要な従量課金アカウント)へアップグレードが必要になります。ただし、このPAYGアカウントは使ったらいきなり課金が発生するわけではありません。細かい料金体系はサービスごとに異なるので気になる方はお気軽にお聞き下さい。
Kubernetesについては、無償で使えるフリークラスタというのが用意されています。こちらは課金が発生しない代わりにシングルノードのみ、30日でExpireする、という制限があります。簡単なアプリをデプロイしたり、挙動を確認したり、勉強会などで作り方を学んだりするレベルであれば十分事足りると思います。
IBM Cloudアカウントの作成
まずはIBM Cloudのアカウントを作成しましょう。初めて作成する場合は前述の通りライトアカウントになります。このままだとKubernetesが使えないのでPAYGアカウントへアップグレードしてください。
すでにライトアカウントをお使いの方も同様にPAYGアカウントへアップグレードしてください。
アカウント登録はこちらから。
https://ibm.biz/Bdzce8
上部メニューからManage (管理) を選択します。
Account settingからAdd credit cardを選択するとPAYGアカウントへアップグレードできます。
Node-REDをDockerで動かす
さて、Kubernetesはコンテナオーケストレーションのサービスですので、アプリそのものを動かすコンテナにはDockerを利用します。Node-REDアプリケーションのDockerイメージはNode-RED公式サイトから見つけることができます。
https://nodered.jp/docs/platforms/docker
今回はバージョンはlatestのものを使っていきたいと思います。
すでにローカル環境にDockerの実行環境があるものとして、以下のコマンドを実行して下さい。Dockerがローカル環境にインストールされていない方はまず最初にこちらから自分の環境に合わせてDockerのインストールをしてください。
$ docker run -it -p 1880:1880 --name mynodered nodered/node-red-docker
実行するとポート1880でローカルホストが起動しそこにNode-REDアプリが実行されるので、 http://{host-ip}:1880/ にアクセスしてNode-REDフローエディタへアクセスできることを確認して下さい。
Kubernetesのクラスタ作成
今回はIBM Cloud上のマネージドKubernetesサービスであるIKS (IBM Cloud Kubernetes Service) を使いますので、IBM Cloudへログインします。
以下のURLにアクセスし、前の手順で作成したIBM Cloudアカウント (ライトからPAYGへアップグレード済み) でログインして下さい。
ログインしましたら、管理コンソール画面左上にあるハンバーガーメニューからKubernetesを選択します。
Kubernetes Service画面からCreate (新規作成) ボタンでクラスタ作成画面へ遷移します。クラスタタイプでFreeを選択し、地域と都市を選択して作成します。ここでは、地域を北アメリカ、都市をダラスで作成をリクエストしています。クラスタの作成は10分〜15分くらいかかりますので焦らず待ちましょう。
クラスタが作成されると、ステータスがNormalとなり緑色に変更します。これでクラウド側のKubernetesの準備はOKです。
CLI作業準備
ここからはCLIで作業をしていきます。IBM CloudのCLIツールと、KubernetesのCLIツールをインストールします。
■IBM Cloud CLI
こちらを参照し、インストーラーかShellからインストールします。
https://cloud.ibm.com/docs/cli/reference/ibmcloud?topic=cloud-cli-install-ibmcloud-cli&locale=ja#install-ibmcloud-cli
■Kubernetes CLI
以下のコマンドを実行します。
$ curl -sL https://ibm.biz/idt-installer | bash
CLIが使えるようになったら、早速操作していきます。
まず、ターミナル上でIBM Cloudにログインします。
$ ibmcloud login -a https://cloud.ibm.com
IKSの地域を指定します。
$ ibmcloud ks region-set us-south
Kubernetesの設定ファイルを取得します。
$ ibmcloud ks cluster-config myclusterexport KUBECONFIG=/Users/$USER/.bluemix/plugins/container-service/clusters/mycluster/kube-config-hou02-mycluster.yml
上記のexport~をコピーして実行します。この操作はターミナル上の環境変数へKubernetesの設定ファイルのパスをsetするものです。
$ export KUBECONFIG=/Users/$USER/.bluemix/plugins/container-service/clusters/mycluster/kube-config-hou02-mycluster.yml
worker nodeが動いていることを確認します。
$ kubectl get nodes
アプリのデプロイ
IKSへアプリをデプロイします。デプロイするアプリ(=Node-RED)はDocker Hubにあるものを使用します。
以下の通り、YAMLファイルを作成してください。ここではファイル名はnode-red-depoy.yaml とします。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: node-red
spec:
replicas: 1
template:
metadata:
labels:
app: node-red
spec:
containers:
— name: node-red
image: nodered/node-red-docker:latest
ports:
— containerPort: 1880
作成したYAMLを使ってpodを作成します。
$ kubectl create -f node-red-depoy.yaml
deployment.extensions "node-red" created
get deploy 作成したアプリ名 でコマンドを実行しステータスを確認します。AVAILABLEの値が”1"になっていればOKです。
現状では、k8sのクラスタネットワーク上だけに、コンテナを内包するpodが繋がった状態です。そこで、外部からアクセスできるようにするため、podをホストしているノードにアクセスポートを開きます。 nodePortの値に31880を指定し、外部に解放されるNode-REDのポート番号を設定します。アプリの時と同じようにYAMLファイルを作成します。ここではファイル名は node-red-nodeport.yaml とします。
apiVersion: v1
kind: Service
metadata:
name: node-red
spec:
type: NodePort
selector:
app: node-red
ports:
- protocol: TCP
port: 1880
nodePort: 31880
作成したYAMLを使ってポートを割り当てます。
kubectl create -f node-red-nodeport.yaml
自分のIKS上に作成したクラスタ名を確認します。ここでは”mycluster”であることが確認できました。
$ ibmcloud cs clusters
OK
Name ID State Created Workers Location Version Resource Group Name
mycluster 53c53b2aa66d4800bbd712edf52eb565 normal 43 minutes ago 1 Dallas 1.12.7_1548 default
次に公開先のIPアドレスを確認します。ここでは”173.193.99.139”であることが確認できました。
$ ibmcloud cs workers mycluster
OK
ID Public IP Private IP Machine Type State Status Zone Version
kube-hou02-pa53c53b2aa66d4800bbd712edf52eb565-w1 173.193.99.139 10.76.68.210 free normal Ready hou02 1.12.7_1549
後は、公開IPアドレス+公開ポート番号でブラウザからアクセスすればNode-REDのフローエディタを起動することができます。
無事起動しましたね。
試しにフローを作成して、動くかどうか確認してみましょう。
問題なく動きました。ぜひ、これをベースにみなさまNode-REDをどんどん活用していってくださいね!
――――――――――――――――――――――――――――――――――――――
Information
IBM Code Patterns
http://developer.ibm.com/jp/
IBM Developer Advocate Profile
https://developer.ibm.com/code/community/advocates/taijih
Cloud Developers Circle
(ベンダー依存しないクラウドデベロッパーのためのコミュニティ)
https://cdevc.connpass.com/
Node-RED ユーザーグループ
https://node-red.connpass.com/
IBM Cloud ユーザーグループ
https://bmxug.connpass.com/