序章

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

領事のWebUIをレンダリングするために必要なすべてのファイルを含むdistというディレクトリがあります。 クラスタに接続するときに、このディレクトリを指定する必要があります。

クラスターに接続するには、サーバーに使用したのと同様の領事エージェントへの呼び出しを使用します。 ただし、異なるフラグを使用します。

クライアントモードで動作させたいので、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

これにより、クライアントマシンが通常の非サーバーエージェントとしてクラスターに接続されます。 このエージェントは、通常の127.0.0.1インターフェイスではなく、パブリックIPアドレスでリクエストに応答します。 このため、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

メインインターフェイスは次のようになります。

Consul web UI landing page

さまざまなメニューをクリックして、インターフェイスを調べることができます。 これにより、クラスターとマシンおよびサービスの状態を視覚化するための優れた方法が提供されます。

サービスと小切手の追加

ここで、これを設定するための主要なユースケースである領事館にサービスを追加したいと思います。 サービスはさまざまな方法で追加できますが、最も簡単なのは、サービス定義を格納するための構成ディレクトリを作成することです。

サービスは、サービス定義を含むノードに関連付けられています。 したがって、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": {
            . . .
        }
    }
}

サービス自体を定義するために必要なのはこれだけです。 ただし、領事がサービスの状態を確認できる方法も定義したいと思います。 これは通常、かなり単純であり、通常のシステム管理者の手動チェックを複製します。

私たちのサービスでは、領事プロジェクトが独自のドキュメントにリストしているように、curlを使用して簡単なWebリクエストを実装します。 実際に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インターフェイスに戻ると、次のサービスが表示されます。

Consul intro service

クライアントに戻ったら、新しい端末を作成して、Webサーバーを一時的に停止できます。

CTRL-A C
service nginx stop

Web UIを更新すると、予想どおり、Webサービスのチェックが失敗していることがわかります。

Consul intro failed service

これは、ヘルスチェックが期待どおりに機能していることを示しています。

結論

これで、領事がどのように機能するかについての基本的な考え方がわかったはずです。 このガイドで提供したデモンストレーションは、本番環境で領事を処理するための最良の方法ではありませんが、ソフトウェアの便利な機能をすばやく確認できるようにするために使用されました。

次のガイドでは、実稼働環境での領事の使用方法について説明します。 簡単に参照できるようにすべての構成の詳細をファイルに入れ、起動時にサービスを開始するためのアップスタートスクリプトを作成します。