Serf/Consulで管理を自動化! ~実践的な手法を紹介~

第5回 Consulインターフェースとサービス検出を最小構成で確認

この記事を読むのに必要な時間:およそ 4 分

メンバー管理とサービス検出

最小構成上で,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

図2 Consulを使ったメンバー管理・サービス検出

図2 Consulを使ったメンバー管理・サービス検出

Consulのメンバー情報を参照

Consulのメンバー管理に含まれるのは,ホスト名,IPアドレス,サービス名称やポート番号などの情報です。これはSerfを使ったメンバー管理と同等の機能です。一番簡単な確認方法は,consul membersコマンドを使う方法です。Consulサーバに別の端末からログインし,コマンドを実行すると,次のようにホスト名とIPアドレスが表示されます。

$ consul members
Node                   Address            Status  Type    Build  Protocol
sion.pocketstudio.net  192.168.39.3:8301  alive   server  0.5.0  2

この情報はConsulサーバが持つHTTPインターフェースから知ることもできます。HTTPインターフェースにはTCPポート8500番を使ってアクセスします。次の例はcurlコマンドを使って,同様の結果を取得したものです(curlの結果をjqコマンドにパイプして,見やすいように整形しています⁠⁠。

$ curl http://127.0.0.1:8500/v1/catalog/nodes | jq "."
[
  {
    "Address": "192.168.39.3",
    "Node": "sion.pocketstudio.net"
  }
]

この表示結果は,現在のConsulクラスタを形成しているのは,この1台のマシン(192.168.39.3)であることを意味します。クラスタの台数が増えれば,コマンドラインでconsul membersを実行したときと同様,HTTPインターフェースを通して情報を参照できます。

同様に,DNSインターフェースを参照してみましょう。DNSインターフェースを通してわかるのは,特定のホスト名に対するIPアドレスを名前解決します。digコマンドを使いポート8600に対して問い合わせてみます。

Consulの名前解決には「consul」がトップレベルドメイン名となります。特定の名前を持つConsulノードのIPアドレスを調べたいときは<ホスト名>.node.consulで名前解決を行います。今回の例であれば,digコマンドを実行すると,次のような結果が得られます。

$ dig @127.0.0.1 -p 8600 sion.pocketstudio.net.node.consul
(省略)
;; QUESTION SECTION:
;sion.pocketstudio.net.node.consul. IN  A

;; ANSWER SECTION:
sion.pocketstudio.net.node.consul. 0 IN A       192.168.39.3

サービスの定義と参照方法

Consul上のサービスとは,特定ポートへのヘルスチェックや,コマンドの実行結果を基に任意のサービス名称を定義することができます。定義された情報や正常性はHTTP・DNSの各インターフェースから参照できます。

サービスを定義するには,設定ファイルを使う方法とHTTP APIを使って登録する方法があります。ここでは簡単に扱えるJSON形式の設定ファイルを用います。まずは設定ファイル用のディレクトリを作成します。

$ sudo mkdir /etc/consul.d

次に,ポート80番に対応する名称「web」というサービスを定義します。先ほどのディレクトリ内にweb.jsonと言うファイルを作成し,ファイル内容は次のようにします。

{
    "service": {
        "name": "web", 
        "tags": ["test"], 
        "port": 80
    }
}

それから,Consulサーバを停止・再起動します。Ctrl+Cキーで中断したあと,Consul起動時に-config-dir=/etc/consul.dオプションを追加します。

$ consul agent -server -bootstrap-expect=1 -data-dir=/tmp/consul -bind=192.168.39.3 -config-dir=/etc/consul.d
(省略)
    2015/04/22 11:48:14 [INFO] agent: Synced service 'web'

これで「web」という名称のサービスがConsulに登録されました。HTTPインターフェースを使って参照してみます。サービスに関する情報を取得するには,エンドポイント/v1/catalog/service/<サービス名>にアクセスします。正常に実行されると,次のようにWebサーバが稼働しているホスト名・IP情報を得られます。

$ curl http://127.0.0.1:8500/v1/catalog/service/web | jq "."
[
  {
    "ServicePort": 80,
    "ServiceAddress": "",
    "ServiceTags": [
      "test"
    ],
    "ServiceName": "web",
    "ServiceID": "web",
    "Address": "192.168.39.3",
    "Node": "sion.pocketstudio.net"
  }
]

同様にDNSインターフェースから情報を参照することができます。単純にwebという名称のサービスを持つホストのIPアドレスを参照するときは,web.service.consulという名称で名前解決を行います。

# dig @127.0.0.1 -p 8600 web.service.consul a

;; QUESTION SECTION:
;web.service.consul.            IN      A

;; ANSWER SECTION:
web.service.consul.     0       IN      A       192.168.39.3

ここでは1台のみの結果しか表示されていませんが,複数のConsul上でサービスが登録されていればIPドレスが複数表示されます。また,SRVレコードを参照することで,どのConsulノードで稼働しているかを,ポート番号やホスト名を含めて参照できます。

# dig @127.0.0.1 -p 8600 web.service.consul SRV

;; QUESTION SECTION:
;web.service.consul.            IN      SRV

;; ANSWER SECTION:
web.service.consul.     0       IN      SRV     1 1 80 sion.pocketstudio.net.node.dc1.consul.

まとめ

今回はConsulの最小構成でインターフェースの参照方法や,サービスの定義を見てきました。次回はより実践的に,複数台でクラスタを構成する方法や,細かいサービスを定義・参照する方法を見ていきます。

参考情報

著者プロフィール

前佛雅人(ぜんぶつまさひと)

クリエーションライン株式会社 Technology Evangelist

ホスティングサービスで運用保守サポートに携わった後,現職へ。サポート業務や新技術検証・開発業務を行う。趣味で監視や自動化に関するOSS検証や翻訳を行うのが好き。辛口の日本酒が大好き。

Twitter:@zembutsu