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

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

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

サービス検出を使った自動化を行うために,Consulを使って具体的にクライアント・サーバ構成を構築しましょう。複数のサーバ上でサービスを定義し,NginxのDNSラウンドロビンを行う方法を見ていきます。

サービスの可用性を高めるConsul

複数台のサーバ構成によって,Webサーバであれば通信量やアクセスの負荷分散を図ることができます。あるいは,データベースやキャッシュ用のサーバを冗長化構成にすることで,障害発生時におけるサービスの継続性(稼動時間)を高めることもできます。

クラウド技術の普及により,インフラであるサーバ環境は簡単に増減できるようになりました。その一方で,負荷分散や冗長化は,手動で行う設定に頼りがち。動的に変わるサーバ環境に応じて設定を変更するためには,何らかの手間なり工夫が求められています。

このような課題を簡単に解決すべく登場したのがConsulです。Consulが持つ機能の1つにサービス検出(service discovery)があります。Consulが認識するサービスとは,対象となるWebサーバやデータベースのデーモンが存在しているかどうかだけでに限りません。指定のポート番号に対するアクセスの正常性も判別することができます。

また,Consulは独自にDNSを持ちます。そのため,ローカル環境やプライベートなネットワーク空間内でも利用可能です。活用できるのは,ホスト名からIPアドレスの名前解決を自動的に行えるだけでなく,サービス検出に応じた動的な名前解決もできます。これを使えば,クライアント側はホスト名を定義しておくだけで,正常に稼働しているキャッシュ用サーバやデータベースのIPアドレスを知るような応用が可能です。

Consulは,そのサービス状況をConsulのDNSやHTTPのインターフェースから参照できるだけではありません。サービスが正常か異常か,それらの変化が発生したタイミングで,任意の処理を自動的に行うこともできます。

このConsulの機能を使えば,Webサーバの負荷分散の自動化も行えます。Webサーバ上でApacheやNginxなどのサービスが応答する間,負荷分散の対象となるだけでなく,正常に応答できないときは自動的に対象から外すことも容易になります。

Nginxの負荷分散にConsulを使うには

それでは,実際にConsulを使って,サービス検出の流れや挙動を見ていきましょう。ここでは,ローカル環境でNginxのDNSラウンドロビンを行います。

同一ネットワーク上で,3台のサーバ(インスタンスや仮想サーバ等)を用意します。それぞれのサーバ上でconsulエージェントを稼働し,Nginxの負荷分散環境を構築します図1)⁠

  • Consulサーバ:HTTP・DNSインターフェースを持つ。1台(192.168.39.3)のみ。
  • Consulクライアント:サービスが稼働する環境を想定。2台(192.168.39.11,192.168.39.12)で構成。

図1 ConsulでNginxの負荷分散イメージ

図1 ConsulでNginxの負荷分散イメージ

Consulサーバのセットアップ

Consulのセットアップの他に,DNSの名前解決用にBINDとdnsmasqをセットアップします。

まず,ConsulサーバではConsulエージェントを⁠server⁠モードとして起動します。

$ 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サーバを次のように実行します。nohupを使ってバックグラウンドでConsulサーバを起動するのは,ログアウト後もエージェントを起動し続けるためです。

$ nohup consul agent -server -bootstrap-expect=1 -data-dir=/tmp/consul -bind=192.168.39.3 -node=server -ui-dir=/opt/consul/dist &

正常に起動したかどうかは,consul membersコマンドでも確認できます。⁠Type」「server」となっていることに注意します。

# consul members
Node    Address            Status  Type    Build  Protocol
server  192.168.39.3:8301  alive   server  0.5.0  2

次にdnsmasqの設定を行います。ConsulのDNSインターフェースはポート8600を使用するため,アプリケーションやdig等のコマンドでConsulの名前解決を行う場合は,都度明示しなくてはいけません。ポートを指定しなくても,アプリケーションやcurlping等のツールで名前解決を手軽に行うのがdnsmasqです。

以下はCentOSにおけるセットアップ例です。

# yum -y install dnsmasq
# cp -p /etc/dnsmasq.conf /etc/dnsmasq.conf.orig
# echo "server=/consul/127.0.0.1#8600" >> /etc/dnsmasq.conf
# echo "strict-order" >> /etc/dnsmasq.conf

必要に応じて/etc/resolv.confも書き換えます。自分自身で名前解決を行うためnameserver 127.0.0.1を既存の指定よりも前の行に記述します。

nameserver 127.0.0.1
nameserver 8.8.8.8

それからdnsmasqを起動します。

# chkconfig dnsmasq on
# service dnsmasq start

正常に名前解決を行えるか確認します。hostコマンドを使い,serverというノード名称を持つIPアドレスを確認します。

$ host server.node.consul
server.node.consul has address 192.168.39.3

名前解決の確認ができれば,同様にpingなどコマンドライン上から利用できることがわかります。

$ ping -c 3 server.node.consul
PING server.node.consul (192.168.39.3) 56(84) bytes of data.
64 bytes from consul-server (192.168.39.3): icmp_seq=1 ttl=64 time=0.008 ms
64 bytes from consul-server (192.168.39.3): icmp_seq=2 ttl=64 time=0.042 ms
64 bytes from consul-server (192.168.39.3): icmp_seq=3 ttl=64 time=0.035 ms

--- server.node.consul ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.008/0.028/0.042/0.015 ms

これでConsulサーバー側の準備が完了しました。

著者プロフィール

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

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

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

Twitter:@zembutsu

コメント

コメントの記入