Ubuntu14.04で本番環境に対応したMesosphereクラスターを構成する方法
序章
Mesosphereは、多数のコンポーネントを組み合わせて、既存のオペレーティングシステムレイヤー上でサーバークラスタリングと高可用性展開を効果的に管理するシステムです。 CoreOSのようなシステムとは異なり、Mesosphereは特殊なオペレーティングシステムではなく、パッケージのセットです。
このガイドでは、Mesosphereで高可用性クラスターを構成する方法について説明します。 この構成では、マスターノードのいずれかがダウンした場合のフェイルオーバーと、スケジュールされたタスクを処理するためのスレーブサーバーのプールが設定されます。
このガイドでは、Ubuntu14.04サーバーを使用します。
前提条件と目標
このガイドを完了する前に、Mesosphereの概要を確認することを強くお勧めします。 これは、システムが構成されているコンポーネントに精通し、各ユニットが何を担当しているかを特定するのに役立つ良い方法です。
このチュートリアルでは、6つのUbuntuサーバーを使用します。 これは、実稼働環境に少なくとも3つのマスターを持つというApacheMesosの推奨事項を満たしています。 また、タスクがクラスターに送信されるときに作業が割り当てられる3つのワーカーサーバーまたはスレーブサーバーのプールも提供します。
使用する6台のサーバーは、zookeeper
を使用して、マスターサーバーの現在のリーダーを追跡します。 この上に構築されたMesosレイヤーは、分散同期とリソース処理を提供します。 クラスターの管理を担当します。 クラスターの分散初期化システムであるMarathonは、タスクをスケジュールし、スレーブサーバーに作業を渡すために使用されます。
このガイドでは、マシンの構成が次のとおりであると想定しています。
ホスト名 | 働き | IPアドレス |
---|---|---|
master1 | Mesosマスター | 192.0.2.1 |
master2 | Mesosマスター | 192.0.2.2 |
master3 | Mesosマスター | 192.0.2.3 |
slave1 | Mesosスレーブ | 192.0.2.51 |
slave2 | Mesosスレーブ | 192.0.2.52 |
slave3 | Mesosスレーブ | 192.0.2.53 |
これらの各マシンには、Ubuntu14.04がインストールされている必要があります。 Ubuntu14.04初期サーバーセットアップガイドにリストされている基本的な構成項目を完了する必要があります。
上記の手順が完了したら、このガイドに進んでください。
サーバーにMesosphereをインストールする
クラスタを起動して実行するための最初のステップは、ソフトウェアをインストールすることです。 幸い、Mesosphereプロジェクトは、インストールが簡単な最新のパッケージを備えたUbuntuリポジトリを維持しています。
Mesosphereリポジトリをホストに追加します
ホスト(マスターとスレーブ)の all で、次の手順を実行します。
まず、Mesosphereリポジトリをソースリストに追加します。 このプロセスには、UbuntuキーサーバーからMesosphereプロジェクトのキーをダウンロードしてから、Ubuntuリリースの正しいURLを作成することが含まれます。 プロジェクトはこれを行うための便利な方法を提供します:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv E56151BF
DISTRO=$(lsb_release -is | tr '[:upper:]' '[:lower:]')
CODENAME=$(lsb_release -cs)
echo "deb http://repos.mesosphere.io/${DISTRO} ${CODENAME} main" | sudo tee /etc/apt/sources.list.d/mesosphere.list
必要なコンポーネントをインストールします
Mesosphereリポジトリをシステムに追加した後、新しいコンポーネントにアクセスするには、ローカルパッケージキャッシュを更新する必要があります。
sudo apt-get -y update
次に、必要なパッケージをインストールする必要があります。 必要なコンポーネントは、ホストの役割によって異なります。
マスターホストには、mesosphere
メタパッケージが必要です。 これには、zookeeper
、mesos
、marathon
、およびchronos
アプリケーションが含まれます。
sudo apt-get install mesosphere
slave ホストの場合、必要なのはmesos
パッケージのみで、これも依存関係としてzookeeper
を取り込みます。
sudo apt-get install mesos
MesosのZookeeper接続情報を設定する
最初に行うことは、zookeeper
接続情報を構成することです。 これは、すべてのホストが正しいマスターサーバーに接続できるようにする基盤となるレイヤーであるため、ここから始めるのが理にかなっています。
マスターサーバーはzookeeper
クラスターの唯一のメンバーになりますが、プロトコルを使用して通信できるようにするには、すべてのサーバーで何らかの構成が必要になります。 これを定義するファイルは/etc/mesos/zk
です。
すべてのホストですべてで、次の手順を実行します。 root権限でファイルを開きます。
sudo nano /etc/mesos/zk
内部では、接続URLがデフォルトでローカルインスタンスにアクセスするように設定されていることがわかります。 次のようになります。
zk://localhost:2181/mesos
3つのマスターサーバーを指すようにこれを変更する必要があります。 これは、localhost
を最初のMesosマスターサーバーのIPアドレスに置き換えることによって行われます。 次に、ポート指定の後にコンマを追加し、フォーマットを複製して、2番目と3番目のマスターをリストに追加できます。
ガイドの場合、マスターのIPアドレスは192.0.2.1
、192.168.2.2
、および192.168.2.3
です。 これらの値を使用すると、ファイルは次のようになります。
zk://192.0.2.1:2181,192.0.2.2:2181,192.0.2.3:2181/mesos
行はzk://
で始まり、/mesos
で終わる必要があります。 その間に、マスターサーバーのIPアドレスとzookeeper
ポート(デフォルトでは2181
)が指定されます。
終了したら、ファイルを保存して閉じます。
マスターとスレーブのそれぞれでこの同じエントリを使用します。 これは、個々のサーバーがクラスターと通信するために正しいマスターサーバーに接続するのに役立ちます。
マスターサーバーのZookeeper構成を構成する
マスターサーバーでは、追加のzookeeper
構成を行う必要があります。
最初のステップは、マスターサーバーごとに1〜255の一意のID番号を定義することです。 これは/etc/zookeeper/conf/myid
ファイルに保存されます。 今すぐ開く:
sudo nano /etc/zookeeper/conf/myid
このファイルのすべての情報を削除し、1から255までの単一の番号に置き換えます。 各マスターサーバーには一意の番号が必要です。 簡単にするために、1から始めて、上に向かって進むのが最も簡単です。 ガイドには1、2、3を使用します。
私たちの最初のサーバーは、ファイルにこれを持っています:
1
終了したら、ファイルを保存して閉じます。 各マスターサーバーでこれを実行します。
次に、zookeeper
構成ファイルを変更して、zookeeper
IDを実際のホストにマップする必要があります。 これにより、サービスが使用するIDシステムから各ホストを正しく解決できるようになります。
zookeeper
構成ファイルを今すぐ開きます。
sudo nano /etc/zookeeper/conf/zoo.cfg
このファイル内で、各IDをホストにマップする必要があります。 ホスト仕様には2つのポートが含まれます。1つはリーダーとの通信用で、もう1つは新しいリーダーが必要な場合の選挙の処理用です。 zookeeper
サーバーは、「サーバー」の後にドットとそのID番号が続くことで識別されます。
このガイドでは、各機能のデフォルトのポートを使用し、IDは1〜3です。 ファイルは次のようになります。
server.1=192.168.2.1:2888:3888
server.2=192.168.2.2:2888:3888
server.3=192.168.2.3:2888:3888
これらの同じマッピングを各マスターサーバーの構成ファイルに追加します。 終了したら、各ファイルを保存して閉じます。
これで、zookeeper
の構成が完了しました。 MesosとMarathonに焦点を当てることができます。
マスターサーバーでMesosを構成する
次に、3つのマスターサーバーでMesosを構成します。 これらの手順は、各マスターサーバーで実行する必要があります。
クラスターサイズを反映するようにクォーラムを変更します
まず、決定を下すために必要なクォーラムを調整する必要があります。 これにより、クラスターが機能状態になるために必要なホストの数が決まります。
クォーラムは、マスターメンバーの50%以上が決定を下すために出席しなければならないように設定する必要があります。 ただし、すべてのマスターが存在しない場合でもクラスターが機能できるように、フォールトトレランスを組み込む必要もあります。
マスターは3つあるため、これらの要件の両方を満たす設定は2つのクォーラムのみです。 初期構成では単一サーバーのセットアップを想定しているため、現在、クォーラムは1に設定されています。
クォーラム構成ファイルを開きます。
sudo nano /etc/mesos-master/quorum
値を「2」に変更します。
2
ファイルを保存して閉じます。 各マスターサーバーでこれを繰り返します。
ホスト名とIPアドレスを構成する
次に、各マスターサーバーのホスト名とIPアドレスを指定します。 インスタンスが正しく解決できないように、ホスト名にIPアドレスを使用します。
マスターサーバーの場合、IPアドレスを次のファイルに配置する必要があります。
- / etc / mesos-master / ip
- / etc / mesos-master / hostname
まず、/etc/mesos-master/ip
ファイルに各マスターノードの個別のIPアドレスを追加します。 適切な値に一致するように、サーバーごとにこれを変更することを忘れないでください。
echo 192.168.2.1 | sudo tee /etc/mesos-master/ip
これで、この値をホスト名ファイルにコピーできます。
sudo cp /etc/mesos-master/ip /etc/mesos-master/hostname
各マスターサーバーでこれを実行します。
マスターサーバーでMarathonを構成する
Mesosが構成されたので、Mesosphereのクラスター化されたinitシステム実装であるMarathonを構成できます。
Marathonは各マスターホストで実行されますが、実際にジョブをスケジュールできるのは主要なマスターサーバーのみです。 他のMarathonインスタンスは、リクエストをマスターサーバーに透過的にプロキシします。
まず、各サーバーのMarathonインスタンスのホスト名を再設定する必要があります。 ここでも、ファイルにすでにあるIPアドレスを使用します。 それを必要なファイルの場所にコピーできます。
ただし、必要なMarathon構成ディレクトリ構造は自動的に作成されません。 ディレクトリを作成する必要があります。その後、ファイルをコピーできます。
sudo mkdir -p /etc/marathon/conf
sudo cp /etc/mesos-master/hostname /etc/marathon/conf
次に、Marathonが情報とスケジューリングのために接続するzookeeper
マスターのリストを定義する必要があります。 これは、Mesosで使用していたzookeeper
接続文字列と同じであるため、ファイルをコピーするだけで済みます。 master
というファイルに配置する必要があります。
sudo cp /etc/mesos/zk /etc/marathon/conf/master
これにより、MarathonサービスがMesosクラスターに接続できるようになります。 ただし、Marathonが独自の状態情報をzookeeper
に保存することも必要です。 このために、他のzookeeper
接続ファイルをベースとして使用し、エンドポイントを変更するだけです。
まず、ファイルをMarathonzookeeperの場所にコピーします。
sudo cp /etc/marathon/conf/master /etc/marathon/conf/zk
次に、エディターでファイルを開きます。
sudo nano /etc/marathon/conf/zk
このファイルで変更する必要があるのは、エンドポイントだけです。 /mesos
から/marathon
に変更します。
zk://192.0.2.1:2181,192.0.2.2:2181,192.0.2.3:2181/marathon
これが、Marathon構成で行う必要があるすべてです。
サービス初期化ルールの構成とサービスの再起動
次に、マスターサーバーのサービスを再起動して、構成した設定を使用します。
まず、マスターサーバーがMesosマスタープロセスのみを実行し、スレーブプロセスを実行していないことを確認する必要があります。 現在実行中のスレーブプロセスを停止できます(これは失敗する可能性がありますが、これはプロセスを確実に停止するためだけなので問題ありません)。 オーバーライドファイルを作成することで、サーバーが起動時にスレーブプロセスを開始しないようにすることもできます。
sudo stop mesos-slave
echo manual | sudo tee /etc/init/mesos-slave.override
これで、zookeeper
を再起動するだけで、マスター選挙が設定されます。 次に、MesosマスターとMarathonプロセスを開始できます。
sudo restart zookeeper
sudo start mesos-master
sudo start marathon
設定した内容を最大限に活用するには、Webブラウザのポート5050
でマスターサーバーの1つにアクセスします。
http://192.168.2.1:5050
Mesosのメインインターフェースが表示されます。 選出されたリーダーに接続したかどうかによっては、アクティブなマスターにリダイレクトされていると言われる場合があります。 いずれにせよ、画面は次のようになります。
これは、現在のクラスターのビューです。 使用可能なスレーブノードがなく、タスクが開始されていないため、確認することはあまりありません。
また、Mesosphereの長期実行タスクコントローラーであるMarathonを構成しました。 これは、任意のマスターのポート8080
で利用できます。
スレーブをセットアップしたら、これらのインターフェイスの使用方法について簡単に説明します。
スレーブサーバーを構成する
マスターサーバーの構成が完了したので、スレーブサーバーの構成を開始できます。
マスターサーバーのzookeeper
接続情報を使用してスレーブを構成済みです。 スレーブ自体は、独自のzookeeper
インスタンスを実行しません。
スレーブノードで現在実行されているzookeeper
プロセスを停止し、サーバーの再起動時に自動的に開始されないようにオーバーライドファイルを作成できます。
sudo stop zookeeper
echo manual | sudo tee /etc/init/zookeeper.override
次に、別のオーバーライドファイルを作成して、Mesosマスタープロセスがスレーブサーバーで開始されないようにします。 また、現在停止していることを確認します(プロセスがすでに停止している場合、このコマンドは失敗する可能性があります。 これは問題ではありません):
echo manual | sudo tee /etc/init/mesos-master.override
sudo stop mesos-master
次に、マスターサーバーの場合と同様に、IPアドレスとホスト名を設定する必要があります。 これには、各ノードのIPアドレスをファイルに入れることが含まれます。今回は/etc/mesos-slave
ディレクトリの下にあります。 これをホスト名としても使用し、Webインターフェイスを介してサービスに簡単にアクセスできるようにします。
echo 192.168.2.51 | sudo tee /etc/mesos-slave/ip
sudo cp /etc/mesos-slave/ip /etc/mesos-slave/hostname
ここでも、最初のコマンドに各スレーブサーバーの個別のIPアドレスを使用します。 これにより、正しいインターフェイスにバインドされていることが保証されます。
これで、Mesosスレーブを開始するためのすべての要素が整いました。 サービスをオンにする必要があります。
sudo start mesos-slave
各スレーブマシンでこれを実行します。
スレーブがクラスターに正常に登録されているかどうかを確認するには、ポート5050
でマスターサーバーの1つに戻ります。
http://192.168.2.1:5050
インターフェイスにアクティブなスレーブの数が「3」で表示されているはずです。
また、インターフェイスで使用可能なリソースが更新され、スレーブマシンのプールされたリソースが反映されていることも確認できます。
各スレーブマシンに関する追加情報を取得するには、インターフェイスの上部にある[スレーブ]リンクをクリックします。 これにより、各マシンのリソース貢献の概要と、各スレーブのページへのリンクが表示されます。
MesosとMarathonでサービスを開始
Marathonは、長時間実行されるタスクをスケジュールするためのMesosphereのユーティリティです。 Marathonは、サービスの開始と停止、タスクのスケジューリング、およびアプリケーションがダウンした場合の確実な復旧を処理するため、Mesosphereクラスターのinitシステムと考えるのは簡単です。
いくつかの異なる方法で、サービスとタスクをMarathonに追加できます。 基本的なサービスのみをカバーします。 Dockerコンテナーは、将来のガイドで処理されます。
Webインターフェイスを介したサービスの開始
クラスター上でサービスを迅速に実行するための最も簡単な方法は、MarathonWebインターフェースを介してアプリケーションを追加することです。
まず、マスターサーバーの1つでMarathonWebインターフェイスにアクセスします。 Marathonインターフェースはポート8080
にあることを忘れないでください。
http://192.168.2.1:8080
ここから、右上隅にある「新しいアプリ」ボタンをクリックできます。 これにより、新しいアプリケーションに関する情報を追加できるオーバーレイがポップアップ表示されます。
アプリの要件をフィールドに入力します。 必須のフィールドは次のとおりです。
- ID :プロセスを識別するためにユーザーが選択した一意のID。 これは好きなものにすることができますが、一意である必要があります。
- コマンド:これは、Marathonによって実行される実際のコマンドです。 これは、失敗した場合に監視および再起動されるプロセスです。
この情報を使用して、「hello」を出力し、10秒間スリープする簡単なサービスを設定できます。 これを「こんにちは」と呼びます。
インターフェイスに戻ると、サービスは「デプロイ中」から「実行中」になります。
約10秒ごとに、スリープ量が経過してサービスが停止すると、「タスク/インスタンス」の読み取り値が「1/1」から「0/1」になります。 その後、Marathonは自動的にタスクを再開します。 このプロセスは、ポート5050
のMesosWebインターフェイスでより明確に確認できます。
http://192.168.2.1:5050
ここでは、プロセスが終了して再開されていることを確認できます。
いずれかのタスクで「サンドボックス」をクリックしてから「stdout」をクリックすると、「hello」出力が生成されていることがわかります。
APIを介したサービスの開始
MarathonのAPIを介してサービスを送信することもできます。 これには、オーバーレイに含まれるすべてのフィールドを含むJSONオブジェクトを渡すことが含まれます。
これは比較的単純なプロセスです。 この場合も、必須フィールドは、プロセス識別子のid
と、実行する実際のコマンドを含むcmd
のみです。
したがって、次の情報を使用してhello.json
というJSONファイルを作成できます。
nano hello.json
内部では、最低限の仕様は次のようになります。
{
"id": "hello2",
"cmd": "echo hello; sleep 10"
}
このサービスは問題なく機能します。 ただし、Web UIで作成したサービスを本当にエミュレートする場合は、いくつかのフィールドを追加する必要があります。 これらはWebUIでデフォルト設定されており、ここで複製できます。
{
"id": "hello2",
"cmd": "echo hello; sleep 10",
"mem": 16,
"cpus": 0.1,
"instances": 1,
"disk": 0.0,
"ports": [0]
}
終了したら、JSONファイルを保存して閉じます。
次に、MarathonAPIを使用して送信できます。 ターゲットはポート8080
でのマスターのマラソンサービスの1つであり、エンドポイントは/v2/apps
です。 データペイロードはJSONファイルであり、-d
フラグと@
フラグを使用してファイルを示すことでcurl
に読み込むことができます。
送信するコマンドは次のようになります。
curl -i -H 'Content-Type: application/json' [email protected] 192.168.2.1:8080/v2/apps
Marathonインターフェースを見ると、正常に追加されたことがわかります。 それは私たちの最初のサービスとまったく同じプロパティを持っているようです:
新しいサービスは、最初のサービスとまったく同じ方法で監視およびアクセスできます。
結論
この時点で、本番環境に対応したMesosphereクラスターが稼働しているはずです。 ここでは基本的な構成についてのみ説明しましたが、Mesosphereシステムを活用する可能性を確認できるはずです。
今後のガイドでは、Dockerコンテナーをクラスターにデプロイする方法と、いくつかのツールをより詳細に使用する方法について説明します。