めもめも

このブログに記載の内容は個人の見解であり、必ずしも所属組織の立場、戦略、意見を代表するものではありません。

OpenShiftの内部構造についての覚書 (1)

OpenShiftについて調べる機会があったので、覚書を残しておきます。まずは、全体像の説明から。

OpenShiftとは?

OpenShiftは、Webアプリケーションを構築するためのPaaS環境を提供するものです。大きく、3種類の形態で提供されます(将来計画を含みます)。

OpenShift Online
Red Hatがインターネット上のクラウドサービスとして提供する形態です。現在は、「Developer Preview」としてリソース制限のかかった無償版のみが提供されています。将来的には、従量課金の有償版も提供する予定とのことです。

OpenShift Origin
OpenShiftのPaaS環境を構築するソフトウェア一式がオープンソースとして公開されています。Apache License 2.0の下に公開されていますので、これに従う範囲において、「OpenShift Online」と同じ環境をオンプレミスに構築したり、同様のクラウドサービスを独自に提供することが可能になります。(厳密には、既存のオープンソースと組み合わせて利用しますので、組み合わせるオープンソースそれぞれのライセンス規定に従う必要があります。)

OpenShift Enterprise
OpenShift Originをアップストリームとする、Red Hat提供の商用ディストリビューションです。オンプレミスのOpenShift環境を商用サポート付きで利用することができます。現在は、北米と英国での販売を計画中とのことです。

OpenShiftの仕組み(ざっくりと。。。)

Webアプリケーション開発・実行環境のインフラは、一般的には、ロードバランサ、アプリケーションサーバ、DBサーバ、ビルドサーバなどからなります。OpenShiftでは、これらのサーバ機能を「ギア」と呼ばれる論理コンテナ上で提供します。「論理コンテナ」と言っても、残念ながら(?)、LXC(Linuxコンテナ)のことではありません。1つの仮想マシン上に、複数のギアが立ち上がる点はLXCと似ていますが、SELinuxのMCS(Multi Category Security)機能とcgroupsによって、ギア同士の隔離を行なっています。

それぞれのギアで稼働するソフトウェアは、「カートリッジ」と呼ばれる独自のモジュール形式で提供されます。アプリケーションサーバ用のカートリッジとしては、PHP, Ruby, Python, Tomcat, JBossなどが選択できます。DB用のカートリッジには、MySQL, PostgreSQL, MongoDBなどがあります。ビルドサーバ用に、Jenkinsのカートリッジもあります。ロードバランサには、HA Proxyのカートリッジが使用できます。

ただし・・・、これらは、あくまで内部構造の話であって、OpenShiftの利用者自身が「ギアをいくつ用意して、どのカートリッジをどのギアに差し込んで・・・」というような事を考える必要はありません。利用者がアプリケーションサーバで利用したい言語と、それに組み合わせる機能(DBの種類、オートスケールの有無、Jenkins利用の有無など)を指定すると、必要なギアとカートリッジが複数の仮想マシン上に自動的に配置されるようになっています。

ユーザが開発したアプリケーションのソースコードは、Gitリポジトリを経由して、アプリケーションサーバに送り込みます。また、依存ライブラリは、RubyであればBundler、JBossであればMavenなど、各言語に標準的なツールで自動導入されるようになっています。したがって、Ruby on Railsなどのフレームワークを後から導入することも可能です。OpenShiftで利用できる、さまざまなフレームワークやサンプルアプリケーションがGitHubで公開されていますので、これらをgit pull/git pushすればOKです。

ちなみに、OpenShiftではトラブル対応のために、ユーザ自身が「ギア」の中にログインして(制限された範囲の)シェルコマンドを実行することも許されています。下記は、ギアの中で実行したコマンドの様子です。

> ls -lZ
drwxr-xr-x. root 0b2ea0b2025847f39b193d4dfe786e5a system_u:object_r:openshift_var_lib_t:s0:c4,c1005 app-root
drwxr-xr-x. root root                             system_u:object_r:openshift_var_lib_t:s0:c4,c1005 git
drwxr-xr-x. root root                             system_u:object_r:openshift_var_lib_t:s0:c4,c1005 jbossews-1.0

> ps -efZ
LABEL                           UID        PID  PPID  C STIME TTY          TIME CMD
system_u:system_r:openshift_t:s0:c4,c1005 5087 3299 1  0 Jan02 ?       00:09:21 /usr/lib/jvm/jre-1.7.0/bin/java -client -Xmx256m -X
unconfined_u:system_r:openshift_t:s0:c4,c1005 5087 19785 19753  0 07:17 ? 00:00:00 sshd: 0b2ea0b2025847f39b193d4dfe786e5a@pts/0
unconfined_u:system_r:openshift_t:s0:c4,c1005 5087 19786 19785  0 07:17 pts/0 00:00:00 /bin/bash --init-file /usr/bin/rhcsh -i
unconfined_u:system_r:openshift_t:s0:c4,c1005 5087 21334 19786  7 07:18 pts/0 00:00:00 ps -efZ

プロセスやファイルには、「c4,c1005」というような、見慣れないSELinuxのセキュリティコンテキストが付与されています。これが「MCS」ラベルとよばれるもので、各プロセスはラベルの異なるリソースにはアクセスすることができないようになっています。例えば、上記コマンドを実行するbashのプロセスにもラベルが付与されていますので、psコマンドを実行しても他のギアに属するプロセスは表示されません。

ギアとカートリッジの配置例

ここでは、CLIから操作します。OpenShift Onlineの利用登録とクライアントツールの導入は、こちらのマニュアルを参照してください。

まず、次は、スケーリング機能を使用しない指定で、JBoss EAP6の環境を用意して、バックエンドDBとして、PostgreSQLのカートリッジを追加する例です。

# rhc app create -a jbossapp -t jbosseap-6.0
Password: ********

Creating application 'jbossapp'
===============================

  Cartridge: jbosseap-6.0
  Namespace: enakaidom
  Scaling:   no
  Gear Size: default

Your application's domain name is being propagated worldwide (this might take a minute)...
The authenticity of host 'jbossapp-enakaidom.rhcloud.com (54.242.125.142)' can't be established.
RSA key fingerprint is cf:ee:77:cb:0e:fc:02:d7:72:7e:ae:80:c0:90:88:a7.
Are you sure you want to continue connecting (yes/no)? yes
Initialized empty Git repository in /home/enakai/jbossapp/.git/
done

jbossapp @ http://jbossapp-enakaidom.rhcloud.com/
=================================================
  Application Info
  ================
    Gear Size = small
    Created   = Jan 04  7:58 PM
    SSH URL   = ssh://efdc858ef944456eaec64912600a4d56@jbossapp-enakaidom.rhcloud.com
    Git URL   = ssh://efdc858ef944456eaec64912600a4d56@jbossapp-enakaidom.rhcloud.com/~/git/jbossapp.git/
    UUID      = efdc858ef944456eaec64912600a4d56
  Cartridges
  ==========
    jbosseap-6.0

RESULT:
Application jbossapp was created.

# rhc cartridge add -a jbossapp -c postgresql-8.4
Password: ********

Adding 'postgresql-8.4' to application 'jbossapp'
Success
postgresql-8.4
==============
  Properties
  ==========
    Connection URL = postgresql://127.11.66.129:5432/
    Username       = admin
    Database Name  = jbossapp
    Password       = Bmw1sVbMfv4D

この場合は、1つのギアに対して、「JBoss EAP」のカートリッジと「PostgreSQL」のカートリッジが差し込まれた状態になります。

次は、スケーリング機能を使用する指定で、JBoss EAP6の環境を用意して、PostgreSQLのカートリッジを追加する例です。

# rhc app create -a jbossapp -t jbosseap-6.0 -s
Password: ********

Creating application 'jbossapp'
===============================

  Gear Size: default
  Scaling:   yes
  Cartridge: jbosseap-6.0
  Namespace: enakaidom

Your application's domain name is being propagated worldwide (this might take a minute)...
Initialized empty Git repository in /home/enakai/jbossapp/.git/
done

jbossapp @ http://jbossapp-enakaidom.rhcloud.com/
=================================================
  Application Info
  ================
    Created   = Jan 04  8:13 PM
    UUID      = 6f42161ea5fe40caa2744f12b756a97a
    Gear Size = small
    SSH URL   = ssh://6f42161ea5fe40caa2744f12b756a97a@jbossapp-enakaidom.rhcloud.com
    Git URL   = ssh://6f42161ea5fe40caa2744f12b756a97a@jbossapp-enakaidom.rhcloud.com/~/git/jbossapp.git/
  Cartridges
  ==========
    haproxy-1.4
    jbosseap-6.0
  Scaling Info
  ============
    Scaled x2 (minimum: 2, maximum: available gears) with haproxy-1.4 on small gears

RESULT:
Application jbossapp was created.

# rhc cartridge add -a jbossapp -c postgresql-8.4
Password: ********
(以下略)

この場合は、下図のように、「JBoss EAP」カートリッジ、「PostgreSQL」カートリッジ、そして、ロードバランサの「HA Proxy」カートリッジが、それぞれ、個別のギアで稼働します。スケーリングする際は、「JBoss EAP」カートリッジのギアが自動で複製されていきます。

なお、OpenShift Onlineの無償利用枠では、ギア数が3個までに制限されているので、実際にはスケーリングできません。。。もっといろいろ試したい場合は、OpenShift Originで、オンプレミスの独自環境を構築すれば、利用枠を気にせずにスケーリング可能です。

OpenShiftのインフラ構成

OpenShift Orignによる独自環境を構築する手順は、こちらで紹介されています。これに従うと、図のような環境が構築できます。

「ブローカー」がクライアントからの指示をREST APIで受けて、「実行ノード」上にギアを作成・配置します。WebアプリケーションのURLを動的に生成して、Dynamic DNSでDNS登録を行います。ユーザ認証は、htaccessによるベーシック認証を使用します。

より大規模な環境に対応する場合は、次のような構成も可能です。

・DBサーバ(MongoDB)を分けて、MongoDBの機能で、冗長/負荷分散構成にする。
・MQサーバ(ActiveMQ)を分けて、ActiveMQの機能で、冗長/負荷分散構成にする。
・ブローカーを複数用意して、HA Proxyで負荷分散する。
・認証サーバ(LDAP/Kerberos/WinADなど)を別に用意する。

各サーバは、物理サーバでも仮想マシンでもOKですので、仮想ホスティングサービスを利用して、俺々OpenShiftをインターネット上で利用することもできると思います。