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

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

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

2台目のサービスを登録

それでは,もう1台のConsulクライアントを起動します。先ほどと設定は同じですが,-nodeのノード名称と-bindのIPアドレスが違うだけです。

$ consul agent -data-dir=/tmp/consul -node=node2 -bind=192.168.39.12 -config-file=/etc/consul.d/ -join=192.168.39.3

この状態でconsul membersコマンドを実行すると,新しくConsulクライアントが追加されたことがわかります。

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

また,サービスwebが登録されているかどうかも,再びdigコマンドで確認します。すると,次のように2つのIPアドレスが表示されることがわかります。

# dig web.service.consul a
(省略)
;; QUESTION SECTION:
;web.service.consul.            IN      A

;; ANSWER SECTION:
web.service.consul.     0       IN      A       192.168.39.11
web.service.consul.     0       IN      A       192.168.39.12

この状態でwebサービスに対するDNSラウンドロビンが行えるようになります。curlコマンドを何度か実行すると,2台に交互にアクセスしていることが確認できます。

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

サービス障害と名前解決

引き続きConsulのサービス検出機能を見ていきます。例えば,障害によってNginxが停止したらどうなるでしょうか。node1サーバにログインし,nginxを停止します。

# service nginx stop
Stopping nginx:                                            [  OK  ]

Consulサーバ上でdigを実行すると,停止したnode1のIPアドレスは表示されず,node2のIPアドレスのみ表示されていることがわかります。

dig web.service.consul a
(省略)
;; QUESTION SECTION:
;web.service.consul.            IN      A

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

まとめ

今回はNginxのサービス検出をDNSで行う方法を見てきました。Nginxに限らず,Consulはスクリプトで識別できるものであれば,プロセスの存在状況や,APIの処理結果など,任意のものをサービスとして定義できます。

次回はこのサービス検出をトリガとして,自動処理に応用したり,複数台のサーバー上でコマンドを実行する方法を見ていきます。

参考情報

著者プロフィール

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

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

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

Twitter:@zembutsu