OSS編~オーケストレーションツール Consul 03 Cluster構成でのヘルスチェック編~

前回は『 OSS編~オーケストレーションツール Consul 02 サービス検出編~ 』と題して、オーケストレーションのConsulでサービス検出を試してみました。

今回は『OSS編~オーケストレーションツール Consul 03 Cluster構成でのヘルスチェック編~』と題して、オーケストレーションのConsulでCluster構成でのヘルスチェックを試してみたいと思います。

Cluster構成

Consulはサーバとクライアントの2つのコンポーネントがあり、これによりClusterを形成します。

Clusterを形成する事でメンバーは自動的にお互いを発見する事で動的なインフラのサポートが簡単に行えます。

ヘルスチェック

Consulはいくつものヘルスチェック機能を提供しており、

この情報を利用してクラスタ上のヘルス状況を監視することができます。

試してみる

1.エージェントの起動

Clusterを構成する為にエージェントを起動します。

1台目はserverで起動します。

1$ consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -node=agent-one -bind=172.16.1.13

続いて2台目を起動します。

1$ consul agent -data-dir /tmp/consul -node=agent-two -bind=172.16.1.14

この時点ではお互いを認識していない為、memberを確認しても自分のみが出てきます。

1$ consul members -detailed2Node       Address           Status  Tags34agent-one  172.16.1.13:8301  alive   vsn=2,vsn_min=1,vsn_max=2,build=0.5.0:0c7ca91c,port=8300,bootstrap=1,role=consul,dc=dc156$ consul members -detailed7Node       Address           Status  Tags89agent-two  172.16.1.14:8301  alive   vsn_min=1,vsn_max=2,build=0.5.0:0c7ca91c,role=node,dc=dc1,vsn=2

2.ClusterへのJoin

エージェントをClusterに追加してみます。

1台目で以下のコマンドを実行します。

1$ consul join 172.16.1.142Successfully joined cluster by contacting 1 nodes.

1nodesがClusterへ追加されたのがわかります。

membersコマンドで確認してみます。

1$ consul members -detailed2Node       Address           Status  Tags34agent-one  172.16.1.13:8301  alive   dc=dc1,vsn=2,vsn_min=1,vsn_max=2,build=0.5.0:0c7ca91c,port=8300,bootstrap=1,role=consul5agent-two  172.16.1.14:8301  alive   build=0.5.0:0c7ca91c,role=node,dc=dc1,vsn=2,vsn_min=1,vsn_max=267$ consul members -detailed8Node       Address           Status  Tags9agent-two  172.16.1.14:8301  alive   build=0.5.0:0c7ca91c,role=node,dc=dc1,vsn=2,vsn_min=1,vsn_max=210agent-one  172.16.1.13:8301  alive   vsn_max=2,build=0.5.0:0c7ca91c,port=8300,bootstrap=1,role=consul,dc=dc1,vsn=2,vsn_min=1

DNS APIで2台目の情報を取得してみます。

1$ dig @127.0.0.1 -p 8600 agent-two.node.consul23; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.35.amzn1 <<>> @127.0.0.1 -p 8600 agent-two.node.consul4; (1 server found)5;; global options: +cmd6;; Got answer:7;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 219308;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 09;; WARNING: recursion requested but not available1011;; QUESTION SECTION:12;agent-two.node.consul.         IN      A1314;; ANSWER SECTION:15agent-two.node.consul.  0       IN      A       172.16.1.141617;; Query time: 2 msec18;; SERVER: 127.0.0.1#8600(127.0.0.1)19;; WHEN: Thu Mar 19 06:41:33 201520;; MSG SIZE  rcvd: 76

正しく取得できています。

(Ctrl-C)で止めて確認してみます。

1$ consul members -detailed2Node       Address           Status  Tags34agent-one  172.16.1.13:8301  alive   build=0.5.0:0c7ca91c,port=8300,bootstrap=1,role=consul,dc=dc1,vsn=2,vsn_min=1,vsn_max=25agent-two  172.16.1.14:8301  left    vsn_max=2,build=0.5.0:0c7ca91c,role=node,dc=dc1,vsn=2,vsn_min=1

2台目がleftされているのがわかります。

ヘルスチェック

3.ヘルスチェック

次にClusterでのヘルスチェックを試してみます。

先ずは1台目でテストに利用するためのApacheをインストールして起動しておきます。

1$ sudo yum -y install httpd2$ sudo /etc/rc.d/init.d/httpd start

続いてコンフィグレーションを準備します。

1台目に以下のファイルを作成してエージェントを起動します。

1$ sudo mkdir /etc/consul.d23$ echo '{"check": {"name": "ping", "script": "ping -c1 google.com >/dev/null", "interval": "30s"}}' >/etc/consul.d/ping.json4$ echo '{"service": {"name": "web", "tags": ["rails"], "port": 80, "check": {"script": "curl localhost:80 >/dev/null 2>&1", "interval": "10s"}}}' >/etc/consul.d/web.json5$ consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -node=agent-one -bind=172.16.1.13 -config-dir /etc/consul.d67    2015/03/19 06:59:25 [INFO] agent: Synced check 'ping'8    2015/03/19 06:59:25 [INFO] agent: Synced check 'service:web'9    2015/03/19 06:59:40 [INFO] agent: Synced check 'ping'

ログに出力されているのが分かります。

1台目で実際にApacheをとめてみます。

1$ sudo /etc/rc.d/init.d/httpd stop2Stopping httpd:                                            [  OK  ]

2台目でヘルスチェックを確認してみます。

止まっているNodeが分かります

1$ curl http://localhost:8500/v1/health/state/critical2[][ec2-user@ip-172-16-1-14 ~]$ curl http://localhost:8500/v1/health/state/critil34[{"Node":"agent-one","CheckID":"service:web","Name":"Service 'web' check","Status":"critical","Notes":"","Output":"","ServiceID":"web","ServiceName":"web"}]

DNS APIでも確認してみます。

1$ dig @127.0.0.1 -p 8600 web.service.consul23; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.35.amzn1 <<>> @127.0.0.1 -p 8600 web.service.consul4; (1 server found)5;; global options: +cmd6;; Got answer:7;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 610488;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 09;; WARNING: recursion requested but not available1011;; QUESTION SECTION:12;web.service.consul.            IN      A1314;; Query time: 1 msec15;; SERVER: 127.0.0.1#8600(127.0.0.1)16;; WHEN: Thu Mar 19 07:44:48 201517;; MSG SIZE  rcvd: 36

いかがでしたでしょうか?

次回もお楽しみに!!!

この記事を書いた人

aws-recipe-user