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

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

前回はConsulの登場背景や使いどころについて扱いました。今回はConsulを実際に使うために、簡単なクライアント・サーバ構成を作成します。それから基本的なサービスの登録方法や、その結果をConsulのインターフェースを通して知る方法を見ていきます。

動作確認のための最小構成

Consulの基本動作を確認するための最小環境は、1台のサーバ上でConsulエージェントをサーバモードとして動かします図1⁠。Consulサーバは、エージェントから取得した様々なデータを保管し、結果を参照するためのインターフェースを提供します。Consulエージェントを起動するときに、サーバモードを明示するオプションを付けて起動します。

図1 Consulサーバの最小構成
図1 Consulサーバの最小構成

なお、Consulサーバが1台なのは、あくまで簡単な動作確認のためです。実際の環境においては、データ保全のために3または5台のConsulサーバでクラスタを形成することが強く推奨されています。

Consulのセットアップ

Consulを使い始めるには、まずアーキテクチャ毎のバイナリファイルを取得します。ダウンロード用ページから、自分の環境向けのダウンロードします。提供されているバイナリは、Linux、Mac OS X、Windows向けです。

以下はLinux(x86_64)の環境でのセットアップ例です。アーカイブを取得・展開した後、任意のパスにファイルを設置します。

$ wget -O 0.5.0_linux_amd64.zip https://dl.bintray.com/mitchellh/consul/0.5.0_linux_amd64.zip
$ unzip 0.5.0_linux_amd64.zip
$ sudo cp consul /usr/bin/consul

以上でセットアップ作業は完了です。Consulはconsulという名前のバイナリのみで動作するため、その他ライブラリ等のセットアップは不要です。あとはコマンドライン上からバージョン番号を確認するには、consul versionと実行します。

$ consul version
Consul v0.5.0
Consul Protocol: 2 (Understands back to: 1)

ここで「Consul Protocol」に表示されている、Consulプロトコルのバージョン番号に注意が必要です。Consulは後方互換性が用意されているため、古いバージョンのConsulクライアントと通信することができます。しかし、Consulバージョン0.5のサーバは。バージョン0.4と同じプロトコル番号ですが、クラスタを構成できません。そのため、今後もConsulのバージョンが上がるときには、仕様が変わっていないかどうかの確認をお勧めします。

Web UIのセットアップ

Consulは、ブラウザからConsulのノード情報やサービスの状況を参照できるインターフェース(Web UI)があります。これは、必ずしも使う必要がないため、Consulの実行バイナリとは別に配布されています。Web UIをセットアップするには、アーカイブを展開した後、任意の場所に移動します。

$ wget -O 0.5.0_web_ui.zip https://dl.bintray.com/mitchellh/consul/0.5.0_web_ui.zip
$ unzip 0.5.0_web_ui.zip
$ sudo mv dist /opt/consul/dist

移動したディレクトリを控えておき、Consul起動時にWeb UIのオプションを指定して起動します。

Consulサーバの起動

Consulエージェントをサーバとして起動するには、consul agentコマンドを使う時、複数のオプション指定を行います。

-server

エージェントをサーバ状態にします(必須⁠⁠。

-bootstrap-expect=1

Consulサーバを1台で構成することを明示します(必須⁠⁠。

-data-dir=/tmp/consul

データ保管場所を指定します(必須⁠⁠。

-bind=192.168.39.3

複数のネットワークインターフェースがある環境では、どのIPアドレスを利用するか選べます。

これらのオプションを使って起動すると、次のように画面に表示されます。

# consul agent -server -bootstrap-expect=1 -data-dir=/tmp/consul -bind=192.168.39.3
==> WARNING: BootstrapExpect Mode is specified as 1; this is the same as Bootstrap mode.
==> WARNING: Bootstrap mode enabled! Do not enable unless necessary
==> Starting Consul agent...
==> Starting Consul agent RPC...
==> Consul agent running!
         Node name: 'sion.pocketstudio.net'
        Datacenter: 'dc1'
            Server: true (bootstrap: true)
       Client Addr: 127.0.0.1 (HTTP: 8500, HTTPS: -1, DNS: 8600, RPC: 8400)
      Cluster Addr: 192.168.39.3 (LAN: 8301, WAN: 8302)
    Gossip encrypt: false, RPC-TLS: false, TLS-Incoming: false
             Atlas: <disabled>

==> Log data will now stream in as it occurs:

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

図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の最小構成でインターフェースの参照方法や、サービスの定義を見てきました。次回はより実践的に、複数台でクラスタを構成する方法や、細かいサービスを定義・参照する方法を見ていきます。

参考情報

おすすめ記事

記事・ニュース一覧