Mesosphere チュートリアル02:Mesosphere Chronos検証 #mesos
この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。
前回とりあげたMesosはOSでいうCPU動作を管理するカーネルに相当します。OSにinit.dやcronなどのサービスが存在しているように、Mesosにもそれらのサービスに相当するものがあります。
今回紹介するChronosは、OSでいうcronのように、Mesos上で動く各サービスの開始と停止(とエラー処理)を自動化するためのジョブ・スケジューラです。
本稿は下記の資料を参考に検証しております。
“How to run Chronos on Apache Mesos”:"Apache Mesos上でChronosを実行する方法"
事前準備
『Mesosphere 3node-cluster検証』を参照して、Master 3ノード以上、Slave 1ノード以上のMesosphereクラスタ構成が作成できていること
1.インストール(すべてのMasterノードで実行)
Masterノードにsshログインし、ヘルスチェックします。
curl -i localhost:5050/master/health
HTTP/1.1 200 OK
Date: Fri, 16 Jan 2015 05:14:33 GMT
Content-Length: 0
動作がOKであれば、chronosのバイナリをダウンロードします。
curl -sSfL http://downloads.mesosphere.io/chronos/chronos-2.1.0_mesos-0.14.0-rc4.tgz --output chronos.tgz
tar xvf chronos.tgz
2.実行・動作確認
(Masterノードがクラスタ構成の場合、すべてのノードで設定が必要です。)
cd /root/chronos
./bin/start-chronos.bash --master `cat /etc/mesos/zk` --zk_hosts `cat /etc/mesos/zk` --http_port 8081
Webブラウザで http://<chronosを実行したノード>:8081/ を開きます。
次のような画面が表示されます。
サンプルジョブを作成します。
画面上の[+ New Job]をクリックします。
(※クリックしても次の画面が出ない場合は4-1を参照してください。)
- NAME(ジョブの名前)
- 任意。今回は"test1"
- COMMAND
- Slaveノードで実行できるコマンド。今回は”hostname”
- PARENTS
- このジョブが依存する親ジョブ。今回は無視します。
- OWNER(S)
- ジョブ投入者のメールアドレス。今回は”root@localhost.localdomain”
- SCHEDULE(スケジュール)
- R(Repeat)
- 繰り返し回数
- デフォルト値は∞ (無制限繰り返し)
- ジョブ作成時は”繰り返したい回数+1”回を入力
- 日付
- UTCのみサポート。ある特定の日時に実行したい場合、入力
- P(Epsilon)
- 現在の日時が上記の開始日時を過ぎていた場合、どの程度の間隔で繰り返し実行するかを指定。例えば”T5M”とすると、ジョブが5分間隔で繰り返し実行されます。
今回は以上のように入力しました。
入力後、画面上部の[Create]ボタンを押すとジョブが作成されます。
ジョブ作成後の状況は次のようになります。
ジョブの実行状況はMesosのUIでも確認することができます。
http://<chronosを実行したノード>:5050/ をブラウザで開きます。
(Zookeeperのリーダーノードでない場合はリダイレクトされます。)
Mesos管理画面上部の[Framework]をクリックします。
Active Frameworks の欄から Chronosが動作していることが確認出来ます。
IDのリンクをクリックするとTask(詳細情報)が表示されます。
各ジョブの状態が表示されます。
先ほど投入したジョブ ”test1” が [State]の情報から終了していることを確認できます。
確認後、[Sandbox]のリンクをクリックします。
イアkの
ジョブの標準出力(stdout)、標準エラー出力(stderr)のリンクをクリックすると、それぞれの出力結果を確認することができます。
標準出力(stdout)の例
標準エラー出力(stderr)の例
3.起動時の自動実行設定
/etc/init/chronos.confを作成します。
description "Chronos scheduler for Mesos"
start on runlevel [2345]
stop on runlevel [!2345]respawn
respawn limit 10 5
chdir /root/chronos
exec ./bin/start-chronos.bash --master `cat /etc/mesos/zk` --zk_hosts `cat /etc/mesos/zk` --http_port 8081 >> /var/log/mesos/chronos.log 2>&1
4.注意点
4ー1.MesosのZookeeperクラスタ内で有効になるChronosは1つしかない場合
(ただしすべてのMasterホストで動かしてもよい)
1つめのChronosをZookeeperクラスタで動作させると管理画面にFrameworkとして登録されますが、
2つめ以降は管理画面に出現せず、そのノード上のUIからも新規ジョブのサブミットはできません。
これはChronosの仕様で、Mesosクラスタ内でジョブのサブミットなどの管理が出来るChronosは1つのみとなります。
例
2つのホストでChronosを動作しています。
(1つめ)ホスト:yarai-mesos04.ocdet.org
管理画面を見ると Chronos が、Frameworkとして登録されていることがわかります。
ChronosのUIからジョブの閲覧や、サブミットも可能です。
つぎに2つめのホストでChronosを動かしてみます。
(2つめ)ホスト名:yarai-mesos03.ocdet.org
ホスト上でプログラムは実行されましたが、管理画面を見ると yarai-mesos03 で動作する Chronos は表示されていません。
ChronosのUIからジョブをサブミットしようとすると、ボタンがグレーアウトされており、サブミットはできないようになっています。
どのホストの Chronos が有効(リーダー)になっているかは次のように確認することができます。
# curl -X GET http://<Chronosのホスト(なんでもよい)>:8081/scheduler/jobs -o /dev/null -w "%{http_code}:%{redirect_url}\n" 2> /dev/null
指定したホストが リーダーの場合は次のように出力されます。
200:
指定したホストが リーダーではない場合は次のように出力されます。
307:http://<リーダーのホスト名>:8081/scheduler/jobs
指定したホストで Chronos が動作していない場合は次のように出力されます。
000:
解説 |
---|
Chronos の Web API はすべての Chronos で受け付けていますが、実際に応答を返すのはリーダーの Chronos のみです。そのため、その他の Chronos へ問い合わせを投げると、HTTP 307(Temporary Redirect) の応答コードと、リダイレクト先の URL が返ってきます。リダイレクト先のURLに含まれているホストがリーダーの Chronos ということになります。 上記のように Web API を使用することで Chronos のリーダーを確認することが出来ます。 ※2015/1/16現在 ( version 0.14.0 ) 、このリダイレクト動作は Web API のみの実装であり Web UI には実装されていないようです。 |
次に1つめの Chronos ( yarai-mesos04.ocdet.org ) を終了させます。
管理画面上には大きな変化はないが、”Re-Registerd” の項目が更新されていることがわかります。
先ほどの方法で Web API 確認をすると、リーダーのホストが変化していることがわかります。
# curl -X GET http://<Chronosのホスト(なんでもよい)>:8081/scheduler/jobs -o /dev/null -w "%{http_code}:%{redirect_url}\n" 2> /dev/nullookeeper-client
指定したホストが リーダーの場合は次のように出力されます。
200:
指定したホストが リーダーではない場合は次のように出力されます。
307:http://yarai-mesos03.ocdet.org:8081/scheduler/jobs
Web UI( yarai-mesos-03.ocdet.org )を見ると、先ほどはジョブのサブミットボタンがグレーアウトして、ジョブの一覧も表示されませんでしたが、再読み込みすると、ジョブの一覧が表示され、ジョブのサブミットも出来るようになりました。(スクリーンショット内のURIに注目)
従って、起動時にすべての Masterノードで Chronos を起動しておくようにすれば、Chronos は自動的に冗長性を持った状態で動作することができます。