Ubuntu14.04でのサービスディスカバリシステムであるConsulの使用の概要
序章
Consul は、分散型の高可用性、データセンター対応のサービス検出および構成システムです。 これを使用して、柔軟で強力なインターフェイスでサービスとノードを表示できるため、クライアントは、その一部であるインフラストラクチャの最新のビューを常に把握できます。
Consulは、インフラストラクチャに関する一貫性のある利用可能な情報を提供するために使用されるさまざまな機能を提供します。 これには、サービスとノードの検出メカニズム、タグ付けシステム、ヘルスチェック、コンセンサスベースの選択ルーチン、システム全体のキー/値の保存などが含まれます。 組織内の領事を活用することで、アプリケーションやサービスに高度なレベルの認識を簡単に組み込むことができます。
このガイドでは、領事館の基本的な使い方をいくつか紹介します。 領事をサーバー上で実行してテストするために必要な一般的な手順について説明します。 次のガイドでは、本番環境での領事の設定に焦点を当てます。
前提条件と目標
このガイドでは、consulを使用して、インフラストラクチャのサービス検出と構成のシステムを構築する方法について説明します。
デモンストレーションでは、3台のサーバーと1台のクライアントを構成します。 サーバーは、クエリを処理し、システムの一貫したビューを維持するために使用されます。 クライアントはシステムのメンバーでもあり、インフラストラクチャに関する情報を得るためにサーバーに接続できます。 クライアントには、領事によって監視されるサービスが含まれている場合もあります。
このガイドおよびこのシリーズ全体の目的のために、4台のコンピューターを構成します。 最初の3つは、上記の領事サーバーになります。 最後の1つは、クライアントとして機能し、システムに関する情報を照会するために使用できる領事エージェントです。
後でセキュリティメカニズムの一部を実装するには、単一のドメイン内のすべてのマシンに名前を付ける必要があります。 これは、将来的にワイルドカードSSL証明書を活用できるようにするためです。
私たちのマシンの詳細はここにあります:
ホスト名 | IPアドレス | 役割 |
---|---|---|
server1.example.com | 192.0.2.1 | ブートストラップ領事サーバー |
server2.example.com | 192.0.2.2 | 領事サーバー |
server3.example.com | 192.0.2.3 | 領事サーバー |
agent1.example.com | 192.0.2.50 | 領事クライアント |
このデモでは64ビットのUbuntu14.04サーバーを使用しますが、最新のLinuxサーバーでも同様に機能するはずです。
領事のダウンロードとインストール
私たちが取るべき最初のステップは、私たちの各マシンに領事ソフトウェアをダウンロードしてインストールすることです。 上記のマシンの各で次の手順を実行する必要があります。 rootとしてログインする必要があります。
領事申請書を調べる前に、次のことを行う必要があります。 unzip
実行可能ファイルを抽出します。 また、 screen
1つのターミナルウィンドウで複数のセッションを簡単に実行できるようにするアプリケーション。 領事は通常、サービスとして実行されていないときに画面全体を占めるため、これは紹介に役立ちます。
ローカルシステムのパッケージキャッシュを更新してから、を使用してパッケージをインストールします apt
:
apt-get update
apt-get install unzip screen
したがって、後で忘れずに、今すぐスクリーンセッションを開始してください。
screen
著作権メッセージが表示されたら、Enterキーを押します。 ターミナルウィンドウに戻りますが、スクリーンセッション内にいます。
これで、領事プログラムの取得に取り掛かることができます。 consulプロジェクトのページには、Windows、OS X、およびLinux用のバイナリパッケージへのダウンロードリンクがあります。
上のページに移動し、サーバーを表すオペレーティングシステムとアーキテクチャを右クリックします。 このガイドでは、64ビットサーバーを使用しているため、「linux」の下にある「amd64」リンクを使用します。 「リンクの場所をコピー」またはブラウザが提供する同様のオプションを選択します。
ターミナルで、に移動します /usr/local/bin
ディレクトリ。実行可能ファイルを保持します。 タイプ wget
とスペースを入力し、サイトからコピーしたURLを貼り付けます。
cd /usr/local/bin
wget https://dl.bintray.com/mitchellh/consul/0.3.0_linux_amd64.zip
これで、を使用してバイナリパッケージを抽出できます。 unzip
以前にインストールしたコマンド。 次に、zipファイルを削除できます。
unzip *.zip
rm *.zip
これで、 consul
すべてのサーバーで使用可能なコマンド。
ブートストラップサーバーの起動
領事との連携を開始するには、領事サーバーを稼働させる必要があります。 推奨されるマルチサーバー環境でこれを構成する場合、この手順は段階的に実行する必要があります。
最初に行う必要があるのは、次のサーバーの1つで領事プログラムを開始することです。 server
と bootstrap
モード。 サーバーモードとは、領事がクライアントではなくサーバーインスタンスとして起動することを意味します。 ブートストラップオプションは、最初のサーバーに使用されます。 これにより、選択なしでクラスターの「リーダー」として自分自身を指定できます(使用可能な唯一のサーバーになるため)。
ホストを指定する表で、 server1
ブートストラップサーバーとして。 server1で、次のように入力してブートストラップインスタンスを起動します。
consul agent -server -bootstrap -data-dir /tmp/consul
サーバーは現在の端末で起動し、イベントが発生するとログデータが出力されます。 ログデータの終わりに向かって、次の行が表示されます。
. . .
2014/07/07 14:32:15 [ERR] agent: failed to sync remote state: No cluster leader
2014/07/07 14:32:17 [WARN] raft: Heartbeat timeout reached, starting election
2014/07/07 14:32:17 [INFO] raft: Node at 192.0.2.1:8300 [Candidate] entering Candidate state
2014/07/07 14:32:17 [INFO] raft: Election won. Tally: 1
2014/07/07 14:32:17 [INFO] raft: Node at 192.0.2.1:8300 [Leader] entering Leader state
2014/07/07 14:32:17 [INFO] consul: cluster leadership acquired
2014/07/07 14:32:17 [INFO] consul: New leader elected: server1.example.com
2014/07/07 14:32:17 [INFO] consul: member 'server1.example.com' joined, marking health alive
ご覧のとおり、これは最初のノードであるため、クラスターリーダーは見つかりませんでした。 ただし、ブートストラップオプションを有効にしたため、このサーバーは、単一のホストでクラスターを開始するために、それ自体でリーダー状態に入ることができました。
他のサーバーの起動
の上 server2
と server3
、次のように入力して、ブートストラップオプションなしで
consul agent -server -data-dir /tmp/consul
これらのサーバーについては、ログエントリも表示されます。 最後に、次のようなメッセージが表示されます。
. . .
2014/07/07 14:37:25 [ERR] agent: failed to sync remote state: No cluster leader
2014/07/07 14:37:27 [WARN] raft: EnableSingleNode disabled, and no known peers. Aborting election.
2014/07/07 14:37:53 [ERR] agent: failed to sync remote state: No cluster leader
これは、クラスターリーダーが見つからず、リーダー自体になることができないために発生します。 この状態は、2番目と3番目のサーバーが有効になっているが、どのサーバーもまだ相互に接続されていないために発生します。
相互に接続するには、これらのサーバーを相互に結合する必要があります。 これはどの方向でも実行できますが、最も簡単なのは server1
機械。
領事サーバーを現在のターミナルウィンドウで実行しているので server1
、で別の端末を作成する必要があります screen
追加の作業を行うために。 の既存の画面セッション内に新しいターミナルウィンドウを作成します server1
次のように入力します。
CTRL-A C
これにより、前のセッションを実行したまま、新しいターミナルインスタンスが開きます。 次のように入力すると、既存の各ターミナルセッションをステップスルーできます。
CTRL-A N
新しい端末に戻り、次のようにIPアドレスを参照して他の2つのインスタンスに参加します。
consul join 192.0.2.2 192.0.2.3
これにより、3つのサーバーすべてが同じクラスターに即座に参加します。 次のように入力して、これを再確認できます。
consul members
Node Address Status Type Build Protocol
server1.example.com 192.0.2.1:8301 alive server 0.3.0 2
server2.example.com 192.0.2.2:8301 alive server 0.3.0 2
server3.example.com 192.0.2.3:8301 alive server 0.3.0 2
上記のように画面に新しいターミナルセッションを作成し、同じコマンドを発行することで、他のサーバーからもこの情報を取得できます。
ブートストラップサーバーを削除し、通常のサーバーとして再参加する
3つのサーバーすべてがクラスターに参加していますが、まだ完了していません。
現在、以来 server1
ブートストラップモードで開始されたため、他のサーバーに問い合わせることなく決定を下すことができます。 それらは同等として動作し、クォーラムによって決定を行うことになっているため、クラスターがブートストラップされた後でこの特権を削除する必要があります。
これを行うには、領事サービスを停止する必要があります server1
. これにより、残りのマシンが新しいリーダーを選択できるようになります。 その後、領事サービスを再開できます server1
ブートストラップオプションなしで、クラスターに再参加します。
server1で、consulを実行しているターミナルに戻ります。
CTRL-A N
次のように入力してサービスを停止します。
CTRL-C
ここで、ブートストラップオプションなしでサービスを再起動します。
consul agent -server -data-dir /tmp/consul
開いているターミナルに戻り、クラスター内の2つのサーバーのいずれかに接続してクラスターに再参加します。
CTRL-A N
consul join 192.0.2.2
これで、3台のサーバーを同等の状態で使用できるようになります。 それらは互いに情報を複製し、単一のサーバーが使用できなくなった状況を処理します。 ブートストラップなしでサーバーを起動してクラスターに参加するだけで、追加のサーバーもクラスターに参加できるようになりました。
クライアントとしてクラスターに参加し、WebUIを提供する
サーバークラスターが使用可能になったので、先に進んでクライアントマシンを使用して接続できます。
領事のWebUIをクライアントマシンに配置して、クラスターと対話し、クラスターの状態を監視できるようにします。 これを行うには、WebUIのダウンロードページにアクセスします。 ダウンロードボタンを右クリックして、「リンクの場所をコピー」または利用可能な同様のオプションを選択します。
クライアントマシンで、ホームディレクトリに移動します。 タイプ wget
スペースを入力して、ページからコピーしたURLを貼り付けます。
cd ~
wget https://dl.bintray.com/mitchellh/consul/0.3.0_web_ui.zip
ダウンロードが完了したら、アーカイブを解凍して削除します。
unzip *.zip
rm *.zip
と呼ばれるディレクトリがあります dist
これには、領事のWebUIをレンダリングするために必要なすべてのファイルが含まれています。 クラスタに接続するときに、このディレクトリを指定する必要があります。
クラスターに接続するには、サーバーに使用したのと同様の領事エージェントへの呼び出しを使用します。 ただし、異なるフラグを使用します。
使用しません server
クライアントモードで操作したいので、フラグ。 デフォルトでは、各ノードのクライアントインターフェイスには、ローカルループバックインターフェイスを使用してアクセスできます。 Web UIにリモートでアクセスするため、代わりにクライアントのパブリックIPアドレスを指定する必要があります。
そのコンテンツを提供するには、WebUIを格納するディレクトリをconsulに指定する必要があります。 さらに、クラスター内のサーバーの1つのIPアドレスを渡すことにより、すぐにクラスターに参加します。 これにより、後で参加する必要がなくなります。 サーバーの例でも、これを以前に行うことができたはずです。
結局、接続コマンドはかなり長いです。 次のようになります。
consul agent -data-dir /tmp/consul -client 192.0.2.50 -ui-dir /home/your_user/dir -join 192.0.2.1
これにより、クライアントマシンが通常の非サーバーエージェントとしてクラスターに接続されます。 このエージェントは、通常の代わりにパブリックIPアドレスでリクエストに応答します 127.0.0.1
インターフェース。 このため、領事コマンドにフラグを追加して、 rpc-addr
.
たとえば、クライアントからメンバーのリストを照会する場合は、選択した代替インターフェースとポートを渡すことによって照会する必要があります。
consul members -rpc-addr=192.0.2.50:8400
Node Address Status Type Build Protocol
agent1 192.0.2.50:8301 alive client 0.3.0 2
server2 192.0.2.2:8301 alive server 0.3.0 2
server1 192.0.2.1:8301 alive server 0.3.0 2
server3 192.0.2.3:8301 alive server 0.3.0 2
これは面倒に思えるかもしれませんが、領事のWebインターフェイスにアクセスする機会を提供してくれます。 クライアントのIPアドレスにアクセスし、続いてWebインターフェイスにアクセスできます。 :8500/ui
Webブラウザで:
http://192.0.2.50:8500/ui
メインインターフェイスは次のようになります。
さまざまなメニューをクリックして、インターフェイスを調べることができます。 これにより、クラスターとマシンおよびサービスの状態を視覚化するための優れた方法が提供されます。
サービスとチェックの追加
ここで、これを設定するための主要なユースケースである領事館にサービスを追加したいと思います。 サービスはさまざまな方法で追加できますが、最も簡単なのは、サービス定義を格納するための構成ディレクトリを作成することです。
サービスは、サービス定義を含むノードに関連付けられています。 したがって、Webサーバーがある場合は、そのサーバーに領事エージェントをインストールし、そこにサービス定義ファイルを作成する必要があります。
この目的のために、これを示すためにクライアントにNginxをインストールします。 次のように入力して、現在のクライアントセッションを強制終了します。
CTRL-C
次のように入力して、クライアントにNginxをインストールします。
apt-get install nginx
これで、サービス定義を格納するための構成ディレクトリを作成できます。
mkdir ~/services
このディレクトリ内に、Webサービスを説明するJSONファイルを作成します。 これを呼びます web.json
:
nano ~/services/web.json
このファイル内に、サービス定義の構造を含める必要があります。 この構造内で、サービスのヘルスチェック用のサブ構造を定義して、サービスが実行されているかどうかを確実に判断できるようにします。
基本的なアウトラインは次のようになります。
{
"service": {
. . .
"check": {
. . .
}
}
}
サービスの場合、サービスの名前を定義し、どのポートをチェックする必要があるかを領事に伝える必要があります。 さらに、独自の並べ替えの目的でサービスを任意に分類するために使用できるタグのリストを提供できます。
この例では、これは次のようになります。
{
"service": {
"name": "web server",
"port": 80,
"tags": ["nginx", "demonstration"],
"check": {
. . .
}
}
}
サービス自体を定義するために必要なのはこれだけです。 ただし、領事がサービスの状態を確認できる方法も定義したいと思います。 これは通常、かなり単純であり、通常のシステム管理者の手動チェックを複製します。
私たちのサービスでは、簡単なWebリクエストを実装します curl
領事プロジェクトが独自のドキュメントにリストしているように。 実際にcurlが取得できるものを知る必要はなく、コマンドがエラーなしで実行できたかどうかだけを気にします。 このため、出力を破棄できます。
また、チェックを実行する間隔を設定する必要があります。 これは常にパフォーマンスと最新情報の間の妥協点です。 何かが間違っているかどうかを比較的早く知りたいので、10秒を使用します。
{
"service": {
"name": "web server",
"port": 80,
"tags": ["nginx", "demonstration"],
"check": {
"script": "curl localhost:80 > /dev/null 2>&1",
"interval": "10s"
}
}
}
終了したら、ファイルを保存して閉じます。
これで、クライアント領事セッションを再起動し、サービス定義があるものとしてこのディレクトリを指定できます。
consul agent -data-dir /tmp/consul -client 192.0.2.50 -ui-dir /home/your_user/dist -join 192.0.2.1 -config-dir /home/your_user/services
これにより、ノードが再起動され、クラスターに接続されます。 Webインターフェイスに戻ると、次のサービスが表示されます。
クライアントに戻ったら、新しい端末を作成して、Webサーバーを一時的に停止できます。
CTRL-A C
service nginx stop
Web UIを更新すると、予想どおり、Webサービスのチェックが失敗していることがわかります。
これは、ヘルスチェックが期待どおりに機能していることを示しています。
結論
これで、領事がどのように機能するかについての基本的な考え方がわかりました。 このガイドで提供したデモンストレーションは、本番環境で領事を処理するための最良の方法ではありませんが、ソフトウェアの便利な機能をすばやく確認できるようにするために使用されました。
次のガイドでは、実稼働環境での領事の使用方法について説明します。 簡単に参照できるようにすべての構成の詳細をファイルに入れ、起動時にサービスを開始するためのアップスタートスクリプトを作成します。