前回はConsulの登場背景や使いどころについて扱いました。今回はConsulを実際に使うために、簡単なクライアント・サーバ構成を作成します。それから基本的なサービスの登録方法や、その結果をConsulのインターフェースを通して知る方法を見ていきます。
動作確認のための最小構成
Consulの基本動作を確認するための最小環境は、1台のサーバ上でConsulエージェントをサーバモードとして動かします(図1)。Consulサーバは、エージェントから取得した様々なデータを保管し、結果を参照するためのインターフェースを提供します。Consulエージェントを起動するときに、サーバモードを明示するオプションを付けて起動します。
なお、Consulサーバが1台なのは、あくまで簡単な動作確認のためです。実際の環境においては、データ保全のために3または5台のConsulサーバでクラスタを形成することが強く推奨されています。
Consulのセットアップ
Consulを使い始めるには、まずアーキテクチャ毎のバイナリファイルを取得します。ダウンロード用ページから、自分の環境向けのダウンロードします。提供されているバイナリは、Linux、Mac OS X、Windows向けです。
以下はLinux(x86_64)の環境でのセットアップ例です。アーカイブを取得・展開した後、任意のパスにファイルを設置します。
以上でセットアップ作業は完了です。Consulはconsul
という名前のバイナリのみで動作するため、その他ライブラリ等のセットアップは不要です。あとはコマンドライン上からバージョン番号を確認するには、consul version
と実行します。
ここで「Consul Protocol」に表示されている、Consulプロトコルのバージョン番号に注意が必要です。Consulは後方互換性が用意されているため、古いバージョンのConsulクライアントと通信することができます。しかし、Consulバージョン0.5のサーバは。バージョン0.4と同じプロトコル番号ですが、クラスタを構成できません。そのため、今後もConsulのバージョンが上がるときには、仕様が変わっていないかどうかの確認をお勧めします。
Web UIのセットアップ
Consulは、ブラウザからConsulのノード情報やサービスの状況を参照できるインターフェース(Web UI)があります。これは、必ずしも使う必要がないため、Consulの実行バイナリとは別に配布されています。Web UIをセットアップするには、アーカイブを展開した後、任意の場所に移動します。
移動したディレクトリを控えておき、Consul起動時にWeb UIのオプションを指定して起動します。
Consulサーバの起動
Consulエージェントをサーバとして起動するには、consul agent
コマンドを使う時、複数のオプション指定を行います。
-server
エージェントをサーバ状態にします(必須)。
-bootstrap-expect=1
Consulサーバを1台で構成することを明示します(必須)。
-data-dir=/tmp/consul
データ保管場所を指定します(必須)。
-bind=192.168.39.3
複数のネットワークインターフェースがある環境では、どのIPアドレスを利用するか選べます。
これらのオプションを使って起動すると、次のように画面に表示されます。
Consulエージェントを終了するには、Ctrl+C
キーで中断するか、kill
コマンドで停止できます。
メンバー管理とサービス検出
最小構成上で、Consulのメンバー管理機能とサービス検出機能を試して行きましょう。まず、Consulサーバ上の情報は、Consulエージェント、HTTP、DNSの各インターフェースから参照します(表1)。
表1 インターフェースとポート番号
インターフェース | 取得方法 | ポート番号 |
consulエージェント(RPC) | consulコマンドで参照(メンバー情報のみ) | 8100(TCP) |
HTTPインターフェース | curlやwget等で参照 | 8500(TCP) |
DNSインターフェース | hostやdigなどホスト名の名前解決時に参照 | 8600(UDP) |
ここで参照できる情報は、Consulエージェントで構成されるメンバー情報だけではありません。Consulエージェント上でWebサーバやDBサーバを「サービス」と呼ばれる単位で定義し、ヘルスチェック用のコマンドを通した監視を行えます。そして、そのサービスの状態はHTTPやDNSインターフェースを通して参照できます(図2)
Consulのメンバー情報を参照
Consulのメンバー管理に含まれるのは、ホスト名、IPアドレス、サービス名称やポート番号などの情報です。これはSerfを使ったメンバー管理と同等の機能です。一番簡単な確認方法は、consul members
コマンドを使う方法です。Consulサーバに別の端末からログインし、コマンドを実行すると、次のようにホスト名とIPアドレスが表示されます。
この情報はConsulサーバが持つHTTPインターフェースから知ることもできます。HTTPインターフェースにはTCPポート8500番を使ってアクセスします。次の例はcurl
コマンドを使って、同様の結果を取得したものです(curlの結果をjqコマンドにパイプして、見やすいように整形しています)。
この表示結果は、現在のConsulクラスタを形成しているのは、この1台のマシン(192.168.39.3)であることを意味します。クラスタの台数が増えれば、コマンドラインでconsul members
を実行したときと同様、HTTPインターフェースを通して情報を参照できます。
同様に、DNSインターフェースを参照してみましょう。DNSインターフェースを通してわかるのは、特定のホスト名に対するIPアドレスを名前解決します。dig
コマンドを使いポート8600に対して問い合わせてみます。
Consulの名前解決には「consul」がトップレベルドメイン名となります。特定の名前を持つConsulノードのIPアドレスを調べたいときは<ホスト名>.node.consul
で名前解決を行います。今回の例であれば、dig
コマンドを実行すると、次のような結果が得られます。
サービスの定義と参照方法
Consul上のサービスとは、特定ポートへのヘルスチェックや、コマンドの実行結果を基に任意のサービス名称を定義することができます。定義された情報や正常性はHTTP・DNSの各インターフェースから参照できます。
サービスを定義するには、設定ファイルを使う方法とHTTP APIを使って登録する方法があります。ここでは簡単に扱えるJSON形式の設定ファイルを用います。まずは設定ファイル用のディレクトリを作成します。
次に、ポート80番に対応する名称「web」というサービスを定義します。先ほどのディレクトリ内にweb.json
と言うファイルを作成し、ファイル内容は次のようにします。
それから、Consulサーバを停止・再起動します。Ctrl+C
キーで中断したあと、Consul起動時に-config-dir=/etc/consul.d
オプションを追加します。
これで「web」という名称のサービスがConsulに登録されました。HTTPインターフェースを使って参照してみます。サービスに関する情報を取得するには、エンドポイント/v1/catalog/service/<サービス名>
にアクセスします。正常に実行されると、次のようにWebサーバが稼働しているホスト名・IP情報を得られます。
同様にDNSインターフェースから情報を参照することができます。単純にweb
という名称のサービスを持つホストのIPアドレスを参照するときは、web.service.consul
という名称で名前解決を行います。
ここでは1台のみの結果しか表示されていませんが、複数のConsul上でサービスが登録されていればIPドレスが複数表示されます。また、SRV
レコードを参照することで、どのConsulノードで稼働しているかを、ポート番号やホスト名を含めて参照できます。
まとめ
今回はConsulの最小構成でインターフェースの参照方法や、サービスの定義を見てきました。次回はより実践的に、複数台でクラスタを構成する方法や、細かいサービスを定義・参照する方法を見ていきます。
参考情報