このエントリは Node-RED Advent Calendar 2017 15日目の記事です。
はじめに
Node-REDでポチポチ動作させていると、インフラ屋の悪い癖で、
「これってどうしたら冗長化できるかな」
「スケールアウトってどうなんだろう」
などと考えてしまう事があります。
たとえば僕的なフィールドですと、pacemakerとかでHAしてしまうっていうのが一番手っ取り早いけど、これではAct/Standbyしか出来なさそう。
dockerでnode-redコンテナってあるけど、kubernetesの仕組みにうまく乗れば、無敵な環境つくれるんじゃない?
って思いつきで半年以上放置していました。
k8s環境ですと、OpenShiftでの実証実験が多いので、
先日、OpenShift Origin 3.7でnoderedを導入してみたを寄稿し単独のNode-Redを動かしてみたのですが、上記のところが出来ておらずモヤモヤが解消できなかったので、考えをまとめてみました。
OpenShiftでの実証結果
Podの数を1から11Podに急増させたり、OpenShiftのオートスケール機能で、負荷に応じたPodの増減をしたのですが、とくに大きな懸念事項なく動いてしまいました。
なによりも、コンテナあたりの負荷が多くなったり、コンテナが死んでしまったらオートスケールして新しい環境を自動デプロイしてくれるので、運用がすごい楽になります。
/data部分(Node-Redの起動設定のuserDir部分)を複数コンテナで共有マウントすることで、動作が可能です。
ただし、flowの管理がファイルであることからフローエディタを同時に実行してデプロイすると、書き込みタイミングなどでデグレートする危険があると考えています。
数字をPod数をポチポチしていくだけで、11個のNode-Redコンテナが増殖。
デザイン
Node-RED環境クラスタ化のアイデアを考えると、どうしても1つの環境で大きく2つの側面があると考えました。
名前 | 概要 |
---|---|
フローエディタ | Node-REDのフローを書くエディタ。開発環境 複数人で書くユースケースの方が少ない。 |
実行環境 | Node-REDフローを実行する環境。 |
Node-REDの設定オプションにフローエディタの無効化があるので、実行環境だけをデプロイすることが可能と考える。
データの保管の問題
コンテナ自体を複数起動することを考えると、Node-REDが管理するデータはどうなるの?っていう部分が問題となる。
考慮点 | 仕様 | 考慮内容 |
---|---|---|
データの保管 | node-redコンテナはPersistent Volumeで共有ストレージ"/data"にファイルを保管する。 | 排他制御がなく上書きしてしまう可能性 |
※node-red-bluemix-starter:bluemix-settings.jsの一部を見ると、IBM CloudのNode-REDはcloudantに保管している様子。 |
現時点での構成
KubernetesのReadWriteOnce
という仕組みでPersistent Volumeを立てて共有している場合、
Singleコンテナからしか書き込み出来ないという制約がある。
このReadWriteOnce
の権限の挙動が同時に書き込めない
ことを想定しているのであれば、
同時書き込み
によるフローが壊れたりということは無いと考えるが、
ブラウザに表示中のフローエディタの内容が、あずかり知らぬところで変わってフローデプロイのタイミングでデグレートしてしまうなんていうことがあるのは本末転倒だと考える。
ここで今回提唱する考えとしては、
Podのグループを「フローエディタ」用(1Podのみ)と「実行環境」用(複数Pod,オートスケール対応)のように2種類のデプロイを行なってフローエディタの排他を行うポイントです。
同じNFSマウントパスを2種類のPV/PVCを作って、1つはReadWiteOnceでR/W可能、1つはReadOnlyManyとしてR/Oのみという形にすることで、複数動作が可能ではないかと考えています。
名前 | 概要 | k8s ストレージタイプ | Pod数上限 | disableEditor |
---|---|---|---|---|
フローエディタ | Node-REDのフローを書くエディタ。 | ReadWriteOnce | 1 | false |
実行環境 | Node-REDフローを実行する環境。 | ReadOnlyMany | 無限 | true |
まとめ
もっともっとフローエディタが複数人でつついたらどうなるかとか、
実証実験の結果をもっと充実したいとかいろいろ考えているうちに時間ばかりが経過してしまいました。
今回はこういう考えでクラスタ環境できそうだよ。という1つのアイデアにとどまっていますが、今後もNode-REDをガツガツ使う環境にも提案していきたいと思うので、このあたりの知識を増やせていければと考えています。
造形がまだ浅く、PoCとか運用ツールでとか、Mockとかで使うことがほとんどなので、
こんなコト考えなくても実際に運用できているよ。などご意見いただければ幸いです。
後日このあたりをもっと詳しく試験した結果をフィードできればと思います。