まめ畑

ゆるゆると書いていきます

Cloud Foundry multinodeをAWS VPCで構築する

Cloud Foundryは、VMware社が提供するPaaSです。 http://www.cloudfoundry.com/ でBETA版が無料で提供されています。
Cloud Foundryを使うには、cloudfoundry.comに登録して、そちらにデプロイする方法もありますが、オープンソースでCloud Foundryの環境が提供されていますので、自前のサーバに導入して使用することができます。
概要はhttp://www.atmarkit.co.jp/fnetwork/rensai/cloudfoundry01/01.htmlの記事を参照していただければつかめると思います。
また、分量が多くなりそうなので、何回かに分けて書こうと思います。今回は構築して動作確認まで書こうと思います。


今回は、オープンソース版のCloud FoundryをAWS VPC上のmulti node構成で構築してみました。コードなどはhttps://github.com/cloudfoundry/vcapです。
もちろんオールインワンで1台構成でも可能です。インストールディレクトリは10GB以上あると安心です。
アプリケーションを配置するディレクトリを指定出来るので、EBSくっつけてそこを指すようにすると良いと思います。


まず、VPCを作成しインスタンスを起動します。今回は以下の構成で作成しました。

  • 6台構成
    • Router * 2
    • DEA * 2
    • Service * 1
    • Cloud Controller etc... * 1 (UAAもこちらに)
  • Ubuntu Server 11.10 64bit (small)


構成図は

のような感じです。routerの冗長化のためELBを使用しています。
また、R53をDNSとして使用しています。Cloud Foundryはデプロイ時にサブドメインを指定し、アプリケーションを指定するので、ワイルドカードでAレコードを設定します。今回は、「*.hoge.com」という名前を例として使用します。そのAレコードにELBのドメインを指定します。


構築手順ですが、最初の数stepは全ノード共通です。
/home/srcにソースなど、/home/cfにCloud Foundryをインストールします。

sudo apt-get update
sudo apt-get install libssl0.9.8 libpq5 git gdebi-core

sudo mkdir /home/src
sudo mkdir /home/cf
sudo chown ubuntu: /home/src /home/cf
cd /home/src
wget http://launchpadlibrarian.net/70321329/xulrunner-1.9.2_1.9.2.17%2Bbuild3%2Bnobinonly-0ubuntu1_amd64.deb
sudo gdebi *.deb
wget https://raw.github.com/cloudfoundry/vcap/master/dev_setup/bin/vcap_dev_setup


必要な物を入れます。この後は各ノード毎固有の設定になります。各ノードで、インストールする機能毎に、インストールの設定ファイルを作成してやります。後は実行すると、Chefを使用して必要なコンポーネントがインストールされていきます。結構時間がかかるので待ちましょう。また、今回は簡単なインストール設定ファイルにしてあるので、設定出来る項目などはhttps://github.com/cloudfoundry/vcap/blob/master/dev_setup/cookbooks/コンポーネント名/attributes/default.rbを参照してください。


今回使用したインストール用設定ファイルは
https://gist.github.com/3753807にまとめてあります。設定ファイル名とノードの対応ですが

  • dea.yml -> DEA
  • rest.yml -> Cloud Controller etc...
  • router.yml -> router
  • service.yml -> service

です。各設定ファイルが /home/src/install_configに保存してあるものとします。
また、IPアドレス・ドメインはコメントに書いてある通り、使用する環境に合わせて変更をして下さい。


インストール方法は

cd /home/src
sh vcap_dev_setup -c ../install_config/*****.yml -d /home/cf

です。****.ymlのところはインストールするノードに対応した、設定ファイルを指定して下さい。
今回は、runtimeでErlangをインストールしていませんが、もし指定した場合はビルドエラーが出るのでhttps://github.com/erlang/otp/commit/3b7fd1030711ad56fa45d18dc6e0f1d0beee2399のパッチを適用してからビルドして下さい。


セキュリティグループを設定している場合は、以下の様に設定して下さい。

  • Internetから

- 80
- 443

- 同一グループ間でTCP全ポート

インスタンス間での通信ですが、今回は簡単化のためにグループ間のみTCP全許可しましたが、DEA -> setviceは使用するサービスが使うポートのみを、routerからUAAは8080 / Cloud Controllerには9022。全ノードからnatsへは4222など各コンポーネントが使用するポートのみを指定するのが安全です。ただ、router -> DEAは、アプリケーションが起動すると、アプリケーション毎にポート番号が都度割り当てられるのでグループ間でTCP全ポート許可になります。


インストールが完了したら、少々設定を変更します。
まず、UAAのノードで

# vim /home/cf/.deployments/rest/config/uaa.yml
# 一番上に追加
# ドメインIPアドレスは環境に合わせる

uaa:
 uris:
  - uaa.hoge.com
  - login.hoge.com
 host: 192.168.249.43   #自ノードのIPアドレス
# vim /home/cf/.deployments/rest/config/runtimes.yml
# を修正

ymlファイル中に記述されている、ランタイムのパスに含まれる全ての「rest」を「dea」に変更


あとは、Cloud Controllerノードのhealth_manager.ymlのintervalsが動いているアプリケーションの死活監視なので、そこを調整する。
今は、以下の様な感じにしてあります。

intervals:
  # Interval for collecting statistics about this cloudfoundry instance.
  # Amongst other things, data collected includes number of users, number of
  # applications and memory usage.
  database_scan:        10
  # Time to wait before starting analysis for stopped applications.
  droplet_lost:         1
  # Interval between scans for analysis of applications.
  droplets_analysis:    1
  # An application is deemed to be flapping if it is found to be in a crashed
  # state (after a restart following every crash) for more than "flapping_death"
  # number of times in an interval that is "flapping_timeout" long.
  flapping_death:       10
  flapping_timeout:    180
  # Time to wait before trying to restart an application after a crash is
  # detected
  restart_timeout:      10
  # Time to wait before analyzing the state of an application that has been
  # started/restarted
  stable_state:         1


DEA自体でもhealth managerにHeart Beatを送っているので、そちらの間隔の設定は
DEAノードの/home/cf/.deployments/dea/config/dea.ymlに書かれています。
今は

intervals:
  # Time interval between heartbeats sent to the Health Manager
  heartbeat: 1

としています。
loggingは最初はdebugでいいと思いますが、かなりの量のログが出るので、ある程度動作確認が出来たらinfoにしておくといいと思います。


また、各サービスの設定はserviceノードの/home/cf/.deployments/service/config/*_node.yml にあります。

MySQL127.0.0.1だけを初期の設定だとリッスンしているので、/etc/mysql/my.cnfに

bind-address            = 0.0.0.0

を追加して、

sudo service mysql restart

をして上げる必要があります。


Cloud Controllerのhostsファイルに

# IPアドレスはrouterノードのもの
192.168.249.42  api.hoge.com uaa.hoge.com login.hoge.com

を追加します。


各ノードの起動方法ですが、各ノードで以下の該当するスクリプトを選び実行します。

/home/cf/vcap/dev_setup/bin/vcap_dev -n rest start
sudo /home/cf/vcap/dev_setup/bin/vcap_dev -n dea start
/home/cf/vcap/dev_setup/bin/vcap_dev -n router start
/home/cf/vcap/dev_setup/bin/vcap_dev -n service start

停止時はstop/restartが使用できます。ログの閲覧はtailで一気に参照可能です。また、start/stop/restart/tail/statusの後に、deaやrouterなど各コンポーネントの名前を指定するとそれだけを指定して操作できます。
start時、インスタンススペックによってはタイムアウトしてSTOPPEDのままやRUNNINGのままになってる表示になることがありますが、start実行後にstatusを実行してきちんと全部RUNNINGになっているか確認して下さい。
Cloud Controllerのノードだと今回の設定だと以下のようになっています。

cloud_controller              :  RUNNING
postgresql_gateway            :  RUNNING
filesystem_gateway            :  RUNNING
rabbitmq_gateway              :  RUNNING
health_manager                :  RUNNING
vblob_gateway                 :  RUNNING
mongodb_gateway               :  RUNNING
uaa                           :  RUNNING
mysql_gateway                 :  RUNNING
redis_gateway                 :  RUNNING


動作確認ですが
http://uaa.hoge.com/ にアクセスして

のような画面が出ればとりあえずは大丈夫です。

http://api.hoge.com/ にアクセスすると、Welcome to VMware's Cloud Application Platformという文字が表示されると思います。


後は手元のマシンで

# 初回だけインストール
gem install vmc

vmc tartget api.hoge.com

で、追加出来ると思います。


ユーザ登録は

vmc register

で、登録します。

vmc login

でログイン出来るので、vmc infoで状態を見てみます。

Target:   http://api.hoge.com (v0.999)
Client:   v0.3.21

User:     con_mame@hoge.com
Usage:    Memory   (0M of 2.0G total)
          Services (0 of 16 total)
          Apps     (0 of 20 total)

こんな感じで出力されればOKです。
ここに表示させる文字や、ユーザのリミットは、

# vim /home/cf/.deployments/rest/config/cloud_controller.yml
# Cloud Controller URI
external_uri: api.hoge.com
description: HOGE Inc. Cloud Application TEST Platform
support_address: None Supported!!!

# Controls the amount of resources assigned to a user
# Normal user accounts
default_account_capacity:
  memory:   2048
  app_uris: 4
  services: 16
  apps:     20

このへんを変更して、Cloud Controllerをrestartします。


アプリケーションのデプロイはデプロイしたいアプリケーションのディレクトリ中で

vmc push

を実行して、質問に答えていくと簡単にデプロイできます。



簡単にマルチノードの設定を書きました。
セキュリティ面やバックアップなども含めて詳しいことや詳細な動作は徐々に書いていこうと思います。
serviceノードのconfディレクトリには、nodeの設定のほかbackupのスクリプトや設定するcronのファイルも置かれているので参照してみて下さい。