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

第6回 Consulのクラスタ構成とサービス検出

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

Consulクライアントのセットアップ

次は,Consulノード側のセットアップです。Consulエージェントを⁠client⁠モードとして稼働し,サーバ上のNginxを⁠web⁠という名称のサービスとしてConsulに登録します。1台目のNginxサーバの名前をnode12台目をnode2と設定することにします。

まず始めに,Nginxのセットアップを行います。

# yum -y install nginx
# service nginx start
# echo 'node1' > /usr/share/nginx/html/consul.html

curlを使って動作確認をします。正常に設定が終わっていれば,次のようにnode1という文字列が画面に表示されます。これはホスト名を確認用するためでなく,サービス正常性を確認するConsulのヘルスチェック用としても使います。

$ curl http://127.0.0.1/consul.html
node1

次にConsulエージェントのセットアップです。先ほどのConsulサーバと同様に行います。

$ 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

以上の動作を2台目のサーバでも繰り返します。このとき,ホスト名のnode1の箇所はnonde2に置き換えての実行をお願いします。

Consulへのサービス登録準備

それではConsulにサービスを登録します。サービス登録には,Consulエージェントを起動し,Consulサーバに接続する必要があります。

あらかじめ,設定ファイルを置くためのディレクトリを作成します。さらに,サービス定義用のファイルを作成します。ファイルの書式はJSON形式です。

# mkdir /etc/consul.d/
# cat << EOF > /etc/consul.d/web.json
{
  "service": {
    "name": "web",
    "tags": [ "nginx" ],
    "port": 80,
    "check": {
      "script": "curl http://127.0.0.1:80/consul.html >/dev/null 2>&1",
      "interval": "10s",
      "timeout": "5s"
    }
  }
}
EOF

ここでは⁠web⁠という名称のサービスを定義します。タグにはnginxを指定しています。重要なのはcheckで囲まれたブロックです。script⁠web⁠サービスが正常(passed)とみなす条件を指定しています。内容はcurlコマンドでconsu.htmlが取得可能かで判断します。またintervalは,このscriptを実行する間隔です。10sは10秒ごとにという指定です(任意の秒数を指定できます)⁠さらにtimeoutでタイムアウト秒数を指定しました。

今回はcurlを使いましたが,pingでも任意のコマンドを指定できます。Consulは終了コードによってサービスの状態を区別します。終了コード0であれば正常(passing)と見なされます。1の場合は警告(warning)であり,終了コードが無い場合は障害(failing)となります。

Consulエージェントの起動とサービス登録

準備が整ったら次のようにConsulを起動します。

$ consul agent -data-dir=/tmp/consul -node=node1 -bind=192.168.39.11 -config-dir=/etc/consul.d/ -join=192.168.39.3

ここで指定したオプションは,それぞれ次のような意味があります。

-data-dir
Consul用のデータ保存に使うディレクトリです。
-node
このConsulノードの名称であり,Consulクラスタ内で重複できません。
-bind
使用するIPアドレスを明示しています。
-config-dir
設定ファイル用のディレクトリを指定し,対象以下の.jsonファイルを読み込みます。
-join
ConsulサーバのIPアドレスを指定します。この例では192.168.39.3です。

正常に実行すると,次のようにメッセージが画面に表示され,この時点でConsulクライアントとして登録されただけでなく,webサービスが認識されたことがわかります。

==> Starting Consul agent...
==> Starting Consul agent RPC...
==> Joining cluster...
    Join completed. Synced with 1 initial agents
(省略)
    2015/04/18 23:15:20 [INFO] consul: adding server server (Addr: 192.168.39.3:8300) (DC: dc1)
    2015/04/18 23:15:21 [INFO] agent: Synced service 'web'
    2015/04/18 23:15:25 [INFO] agent: Synced check 'service:web'

consul membersコマンドを実行すると,Consulクラスタとしてのメンバ情報も確認できます。

$ consul members
Node    Address             Status  Type    Build  Protocol
server  192.168.39.3:8301   alive   server  0.5.0  2
node1   192.168.39.11:8301  alive   client  0.5.0

動作確認として,Consulサーバ上(192.168.39.3)で名前解決の確認を行いましょう。Consulはノード(サーバ,クライアントどちらも含みます)のIPアドレスをノード名称で名前解決できます。

# dig node1.node.consul a
(省略)
;; QUESTION SECTION:
;node1.node.consul.             IN      A

;; ANSWER SECTION:
node1.node.consul.      0       IN      A       192.168.39.11

この機能を使えば,クラウドのように動的にIPアドレスが変わる環境でも,Consulエージェントでクラスタを構成する限り,同じホスト名称でアクセスし続けることができます。

更にwebサービスの登録状況を確認します。Consulは登録したサービス名で名前解決が可能です。先ほど登録したサービスwebの情報を持つIPアドレスを調べるには,web.service.consulという名前で名前解決を試みます。正常に処理されると,次のようにIPアドレスを確認できます。

$ dig web.service.consul a
(省略)
;; ANSWER SECTION:
web.service.consul.     0       IN      A       192.168.39.11

同様にcurlを使って動作確認してみましょう。ホスト名をweb.service.consulと指定することで,Consulとdnsmasqが自動的に名前解決をしてくれます。

$ curl http://web.service.consul/consul.html
node1

著者プロフィール

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

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

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

Twitter:@zembutsu

コメント

コメントの記入