Node-REDをKubernetes上で動かす

榎本陽祐氏(以下、榎本):今回私は「appsodyというオープンソースを使ってNode-REDをKubernetes上で動かしてみよう!」という内容でお話させていただきます。

今回の簡単な流れですが、Node-REDのユーザグループのセッションなので、Kubernetesに関する説明を軽くしたあとで、たぶんappsodyという言葉自体を知っている方が少ないと思うので、「appsody is 何?」というところを説明して、最後にこのappsodyを使ってNode-REDで作ったモジュールをKubernetes上にデプロイするデモをお見せできればと考えています。よろしくお願いします。

田中正吾氏(以下、田中):よろしくお願いします。

榎本:まずは、自己紹介をさせていただきます。千葉県松戸市のWeb系のベンチャー企業のJoolenというところでエンジニアをしています。motuoという名前でQiitaを書いていたりして、だいたい埼玉西武ライオンズのユニフォームロゴがあれば私だと思っていただいて間違いないです。

田中:(笑)。

榎本:「2連覇おめでとうございます!」と、これは毎回ネタとして言うんですけど、今年も3連覇狙ってがんばってほしいなと思っています。

余談は別なんですけど、今の業務では主にPHPやLaravel、EC-CUBEなどを使っています。基本的に好き嫌いなく何でも食べる雑食系で、実は汎用機なんかも触れちゃったりするんですけど、もちろんNode-REDも大好きです! 今回は運営の田中正吾さんとか横井一仁さんとかもそうなんですけど、2020年のIBM Championと言ってIBMさんから公式に認めていただいた外部エヴァンジェリストの認定をいただいております。

田中:いえーい!

榎本:あと今年はKabaneroというIBM製のオープンソースのコントリビューターとしての認定もいただきました。今回お話するappsodyというのは、このKabaneroに組み込まれているオープンソースになります。では、さっそく具体的なコンテンツに入っていきます。

Kubernetesを使う上での大きな壁

Kubernetesとは何かと言いますと、Googleが中心となって開発したコンテナを統合して管理するツールです。Dockerをご存知である前提の話になってしまいますが、このDockerを単品で使っていると複数のホストを跨いだ構成などは難しくなります。しかし、このKubernetesをかますことでうまく制御ができます。

あとはスケールの問題ですね。オートスケールの処理が増えてきたらどんどんリソースを増やすだとか、コンテナが突然落ちた際の自動回復にも対応しています。いろんな部品を独立したコンテナで構築できるので、非常にマイクロサービスと言われているような設計に適しています。

そう言われてもピンとこないと思うので、ざっくり言うと、コンテナが何かの理由で落ちても自動的に回復したり、必要な機能にリソースを集中させやすくなります。Webサーバは小さく、バッチ処理のリソースは大きくみたいな感じで必要なリソースをスケーラブルに割り当てることもできます。

あとはローリングアップデート機能も備えているので、機能のアップデートを不停止で実現したりとか、どんどん伸びていくサービスに使うことでシステムをスケールさせていくことができますと。非常に今のコンテナ界隈ではトレンドになっていて、たぶんデファクトとして扱われています。

でも実際にKubernetesを使おうとすると、大きな壁に当たります。僕も実際に直面した問題なんですが、「そもそもKubernetesってどうやって環境を作るの?」とか、このKubernetesを動かす上でいろいろ設定ファイルをyamlで書く必要があって、これは世界的には「Wall of YAML」、通称「yamlの壁」と言われる非常に学習コストが高いものです。

田中:そうなんだ。

榎本:「1人でKubernetes上にNode-REDで動く環境を構築して」と言われたときに、「そんなのできるかよ」となるわけです。実際に体験して本当につらかったです。

クラウドネイティブなアプリケーション開発を支援するツール「appsody」

こういった僕の悩みを解消してくれたのが、appsodyというオープンソースのツールです。さっそくこのappsodyを推していきたいと思うんですけど、クラウドネイティブなアプリケーション開発を支援するために作られたIBM製のオープンソースです。主に以下の3つのコンポーネントで構成されています。

Appsody Stacksは、コンテナの依存性やセキュリティ情報、Server.jsなどもこの中に入っていて、フローエディタはこの環境だと使える・使えないといった構成を保管することができます。開発する人はそういった組織とか開発するチームのポリシーを気にすることなくアプリケーションの開発が可能になります。

2番目にAppsody Hub。Hubという名前でわかる通り、Appsody Stacksを管理するためのリポジトリです。Appsody Stacksをカスタマイズしてリポジトリに入れておくと、チーム内で統一された環境でそのプロジェクトを回していくことができます。

3つ目がAppsody Command Line Interface。Appsody CLIです。これがないとappsodyに命令を出すことができないのでこれは必須なコマンドラインです。

実際にどんな感じで動いているの? と言いますと、このスタックリポジトリの中から実際にローカルで開発する人。僕みたいなアプリケーションエンジニアが該当するんですけど、あらかじめ誰かが用意してくれたスタックをローカルに持ってくると、Node-REDのフローエディタなどが使える環境ができます。

ここで開発をしていって、開発が終わったらビルドしてKubernetesへデプロイという流れです。これが本当に簡単に、コマンドライン一発でできるようになる画期的なオープンソースになっています。なのでもうyamlとかをぜんぜん意識することなく、Kubernetes上でも簡単に動きます。

Kubernetes以外にもIBM CloudのKubernetes Service、AzureやAWSなどどこでも動くんです。こういったものが簡単に組めるようになります。

appsody stackの構成なんですけど、今回READMEはどうでもいいとして……。

田中:(笑)。

榎本:最初に適用するテンプレートの指定やプロジェクトをデプロイするときの設定、ポートを何番で動かせますよなど。実際にデプロイするときに必要なファイル群はだいたいここに入ってます。これはNode-REDのServer.jsとかもここの中に入っていて、一番最初に生成されるテンプレートのJSONを置いてあげれば、あとはみなさん勝手に使ってねという感じになっています。

ちょっとここは複雑なんですけど、Node-REDを使われている方はこのGitHubの中を見てもらえば「あー! そういうことか!」というのをなんとなくわかっていただけると思いますので、時間のあるときにぜひご参照ください。

Kubernetesへデプロイする方法

いよいよ実際にKubernetesへのデプロイというのを行います。と言いながらも、僕はすごいビビりなので、動画を用意しました。

ここからは実際にappsodyを使ってどんな動きをしたのかというのをお見せできればと思います。

まずはappsodyで使えるプログラム言語のリスト。appsodyに対応している言語がザっと出ます。Javaを始めNode-REDやNode.js、Python、Swiftも動きます。みたいな感じで、いろんなアプリケーションが使えます。

田中:おぉー!

榎本:ここに書いてあるものは基本的に自分で設定する必要もなく使えるappsodyのスタックです。今回はいろんなものがある中でNode-REDにフォーカスをして進めていきます。

どうやって叩くの? となったときに、もう1回改めてappsody listを叩いてNode-REDを見つけたらappsody initを叩いていきます。

僕のターミナルがざわざわした瞬間でしたね。

田中:(笑)。

榎本:appsody init node-redと叩くと……。

一番見せたかったのはここです。空っぽのディレクトリの中にappsody init node-redと叩くだけで、Dockerの環境をザっと持ってきてこのまま展開してくれます。

ディレクトリの中身を見てみると、こんな感じですね。configと初期テンプレートのFlow.jsonが入っている。こういったシンプルなファイルを生成してくれます。これで準備は完了。

KubernetesにNode-REDのプログラムをビルド

準備は完了したので、いよいよ走らせます。走らせるコマンドはappsody runです。appsodyのconfig yamlが入っているディレクトリでそのままappsody runで走らせると、このままDockerのイメージを起動してくれます。

ここでノードの情報を展開するとさくさくと動きます。ここでStarting flowsと出ているので、この時点でローカルホストのポート3000番で起動しています。

ブラウザでの動作確認を見てみると、ノードのローカルホストの3000番で「Hello World! This is the default.」。動くのが早いですね。adminと叩くと、さっきテンプレートの中に入っていたものがそのまま展開されます。「Hello World! This is the default.」というかたちです。もちろんこれのHello World!をちょっとエディットして「Hello New World!」とすると、そのままデプロイして……。

ちょっと時間が掛かりますけど、「Hello New World!」というかたちで、開発をいつも通り進めていって動かすことができます。これで開発が終わったと想定した上で、これをKubernetes上に乗せます。これも本当に至ってシンプルなappsody deployですね。このコマンド一発で、ローカル上にあるKubernetesに実際に作ったNode-REDのプログラムをビルドして、固めて乗せます。

これはかなり時間が掛かる作業です。ドキドキしながらやってます。

田中:わかります(笑)。チャレンジですよね(笑)。

榎本:だいぶチャレンジングですね(笑)。ここでちょっと時間は掛かるんですけど、裏側でappsodyがyamlも作ってくれて、最終的にKubernetesのクラスタ上に置いてくれます。それでは、Kubernetesの動作確認をしていきます。

これは本当に大したことはなくて、Kubernetesのコマンドで、kubectl get podsと入れてあげます。node-red-demoというものがあると思うんですけど、実際にちゃんときれいにデプロイされていることがわかります。

あとはどのポートで動いているのかを確認した上で、そのまま「Hello New World!」というフォームが出てきました。非常に簡単にKubernetesまで持っていけるので、もし既存の環境とかで使われていて、なかなか使う機会がなかったよという人たちは非常にやりやすいのかなと考えています。

最後に今日のまとめです。すごい駆け足でわかりづらかったかもしれなくて申し訳ないんですけど、今回の手順はQiitaにも上がっています。『appsodyがNode-REDに対応したので使ってみた』というので公開もしています。

田中:ありがとうございます。

榎本:これの発展版としてIBM Cloudを例にして、IBM Cloud Kubernetes ServiceにNode-REDでデプロイしたというのをやっています。なのでちょっと自分で試してみたいときはぜひそちらを参照してください。Node-REDは今はどのクラウドでも動かせるようになっています。これはすごく良いことだと思うので、Node-REDユーザのみなさんはぜひ挑戦していただけるとうれしいです。

はい、私からは以上となります。ありがとうございました。