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 にあります。
MySQLが127.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のファイルも置かれているので参照してみて下さい。