RACK/ja

= RACK (Real Application Centric Kernel) =

The concept of RACK: "OpenStack Native Application"
OpenStack Native Application とは、OpenStackのリソース（たとえば、VMやVNET）を、アプリケーションの中から直接利用して動作するソフトウェアの事です. 現在主流のアプリケーションは、"クラウド以前"にデザインされており、クラウドとの親和性が考慮されていません. そのため、これらのアプリケーションがOpenStack上で動作するには、ChefやPuppetといったツールと連携する必要があり、システムが複雑化しています.

RACKはOpenStack上で直接動作するソフトウェア、"After the Cloud" アプリケーションを簡単に作成するための仕組みです. プログラマはRACKを使うことで、外部との連携を必要とせずに、OpenStack上でスケールし、移植可能なアプリケーションを記述し動作させることができます.

RACKの概念は以下になります.


 * 1) 機能を持たせたVMを1つの実行バイナリファイルとして扱う. "機能"とは、アプリが動作するために必要なOS、ミドル、プログラムの事を指します. ここでのプログラムはRACKのAPIを呼び出して動作するように作ります.
 * 2) この実行バイナリを、OpenStack上に展開することで、このVMはLinuxプロセスのように振る舞い、何らかの仕事をします.
 * 3) このプロセスは、プログラムの中で記述に基づき、Forkして子プロセスを生成したり、プロセス間で通信を行います.

手っ取り早くRACKを体験するには、サンプルプログラムを見てください
 * https://github.com/ctc-g/rack-sample-apps/tree/master/montecarlo/README_ja.md
 * https://github.com/ctc-g/rack-sample-apps/tree/master/shell-like/README_ja.md

DevRACKという簡単にサンプルアプリケーションを実行するためのツールも開発しています.
 * https://github.com/ctc-g/devrack/blob/master/README_ja.md



What is RACK?
RACKは、NovaやNeutron等のAPIをラッピングし、VMがプロセスのように振る舞うためのデータ構造を定義します. そして、このプロセスとして扱われるVM間で、通信やデータ共有を行うためのAPIを提供します. アプリケーションはこのAPIをコールすることで動作するように記述していきます. 更にRACKはこのAPIを利用するためのライブラリ|python-rackclientも提供しています. このライブラリを使うことで、簡単にOpenStack Native Applicationが記述できます. RACKは、OpenStack Native Applicationを記述するためのフレームワークとも言えます.

What we call "process"
RACKではプロセスという単語がよく出てきます. このプロセスの実態はNova上の仮想マシンインスタンスです. しかしこのインスタンスは、起動すると何かの仕事をするように作られています. これは、Linuxの各種実行ファイル、たとえば lsコマンドやgrepコマンドが起動されると仕事をするのと似ています. Linuxでは起動した実行ファイルはメモリ上のプロセスとなり、仕事を行い、最後には終了してメモリ上から消えます. RACKはこの考え方をOpenStack上で再現します. 機能を持たせたglanceイメージをNova上で展開し、展開されたインスタンスが何か仕事を行い、最後に消えます. そのため、RACKでは仮想マシンインスタンス＝プロセスと呼んでいます.

プロセスとして起動されるVMインスタンスは、PIDを持ち、Fork可能で親子関係を持ちます. また関係性を持ったプロセス間（VM間）では、IPアドレスを意識しないプロセス間通信やデータ共有、同一名前空間を持ったファイルシステムが利用可能で、この実行バイナリを作成するプログラマは、Linuxのプログラムを作る感覚で、OpenStack Native Applicationを記述できます.

Architecture
RACKはVMをプロセスとして扱うためのデータ構造を定義したデータベースを持ち、このデータ構造を操作するためのRestfulなAPIを提供します. アプリケーションから命令を受けると、OpenStackのAPIをコールし、プロセスの属性情報を自身のデータベースに書き込みます.



Attibutes of a process
プロセスの属性情報には下記のようなものがあります.

Nova、Neutronによって提供されるリソースです. プロセスの属性情報としてそれぞれのリソースIDを保持しています.
 * keypair, security-group, network

各プロセスは一つのグループに所属します. 同じグループに所属するプロセスは、同一名前空間でファイル共有できるなどのメリットがあります.
 * GID (group ID)

各プロセスに付与されるIDおよびその親のIDです. これによりプロセス間の親子関係が表現されています.
 * PID, PPID

rack-proxy
各グループにはそれぞれrack-proxyというプロセスが存在します. rack-apiがパブリックなAPIなのに対し、rack-proxyはそのグループだけがアクセス可能なAPIを提供します. プロセス間通信やファイルシステムといった機能は、rack-proxyが提供します.

Deployment of rack-api and rack-proxy
rack-apiは単独のネットワークに配置され、パブリックにアクセス可能とします. グループごとに存在するrack-proxyは、rack-apiのAPIをコールすることで起動します. rack-apiおよびすべてのrack-proxyは、同じデータベースを共有します.



現状、rack-apiとrack-proxyはVMとして起動しますが、将来的には以下の構成になることを目指します.


 * rack-apiはnova-apiなどのように、OpenStackコントローラノード内の一プロセスとして動作します. 
 * rack-proxyはneutron-ns-metadata-proxyのように、OpenStackネットワークノード内の一プロセスとして動作します. 

'''これらはOpenStackのコアプロジェクトと密接に関わる範囲のため、現段階ではVMとして起動するようにしています. '''

Interprocess communication support
RACKはプロセスのデータ構造操作、起動停止に加え、プロセス間での通信、データ共有を支援する機能を持っています. これらはライブラリと組み合わせて実現されています.



グループ内で共有されるファイルシステムを提供します. プロセスは同じ名前空間でファイルにアクセスすることができ、あたかもローカルのファイルシステムにアクセスしているかのごとく利用できます.
 * ファイルシステム

簡単なデータをプロセス間で共有するための機能です. 複数のプロセスで同時に同じデータを参照したい場合などに利用できます.
 * 共有メモリ

Unix-pipeライクな機能を提供します. あるプロセスで処理した結果を別のプロセスに渡すということが簡単にできます. 相手のIPアドレスを知る必要はなく、相手が起動するまで待つ必要もありません.
 * パイプ

PIDの指定だけで任意のプロセスに文字列送信ができる機能です. 使い方によって複数のプロセスにマルチキャスト送信することも可能です.
 * シグナル

Use cases
RACKの使い方に制限はありません. プロセスの追加・削除、プロセス間のデータ共有、データ通知などはすべて、プログラムによって記述可能です. RACKを使えば、OpenStack Nativeなアプリケーションを簡単に開発することができます.

RACKの使い方のヒントとして、いくつかのサンプルアプリケーションを用意しています. まずはサンプルアプリケーションを動かしてみて、OpenStack Native Applicationとはどのようなものか体験してください.
 * https://github.com/ctc-g/rack-sample-apps/tree/master/montecarlo/README_ja.md
 * https://github.com/ctc-g/rack-sample-apps/tree/master/shell-like/README_ja.md