前回は『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 2 3 4 5 6 7 |
$ consul members -detailed Node Address Status Tags agent-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=dc1 $ consul members -detailed Node Address Status Tags agent-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 2 |
$ consul join 172.16.1.14 Successfully joined cluster by contacting 1 nodes. |
1nodesがClusterへ追加されたのがわかります。
membersコマンドで確認してみます。
1 2 3 4 5 6 7 8 9 |
$ consul members -detailed Node Address Status Tags agent-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=consul agent-two 172.16.1.14:8301 alive build=0.5.0:0c7ca91c,role=node,dc=dc1,vsn=2,vsn_min=1,vsn_max=2 $ consul members -detailed Node Address Status Tags agent-two 172.16.1.14:8301 alive build=0.5.0:0c7ca91c,role=node,dc=dc1,vsn=2,vsn_min=1,vsn_max=2 agent-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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$ dig @127.0.0.1 -p 8600 agent-two.node.consul ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.35.amzn1 <<>> @127.0.0.1 -p 8600 agent-two.node.consul ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21930 ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 ;; WARNING: recursion requested but not available ;; QUESTION SECTION: ;agent-two.node.consul. IN A ;; ANSWER SECTION: agent-two.node.consul. 0 IN A 172.16.1.14 ;; Query time: 2 msec ;; SERVER: 127.0.0.1#8600(127.0.0.1) ;; WHEN: Thu Mar 19 06:41:33 2015 ;; MSG SIZE rcvd: 76 |
正しく取得できています。
(Ctrl-C)で止めて確認してみます。
1 2 3 4 |
$ consul members -detailed Node Address Status Tags agent-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=2 agent-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 2 |
$ sudo yum -y install httpd $ sudo /etc/rc.d/init.d/httpd start |
続いてコンフィグレーションを準備します。
1台目に以下のファイルを作成してエージェントを起動します。
1 2 3 4 5 6 7 8 |
$ sudo mkdir /etc/consul.d $ echo '{"check": {"name": "ping", "script": "ping -c1 google.com >/dev/null", "interval": "30s"}}' >/etc/consul.d/ping.json $ echo '{"service": {"name": "web", "tags": ["rails"], "port": 80, "check": {"script": "curl localhost:80 >/dev/null 2>&1", "interval": "10s"}}}' >/etc/consul.d/web.json $ consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -node=agent-one -bind=172.16.1.13 -config-dir /etc/consul.d 2015/03/19 06:59:25 [INFO] agent: Synced check 'ping' 2015/03/19 06:59:25 [INFO] agent: Synced check 'service:web' 2015/03/19 06:59:40 [INFO] agent: Synced check 'ping' |
ログに出力されているのが分かります。
1台目で実際にApacheをとめてみます。
1 2 |
$ sudo /etc/rc.d/init.d/httpd stop Stopping httpd: [ OK ] |
2台目でヘルスチェックを確認してみます。
止まっているNodeが分かります
1 2 3 |
$ curl http://localhost:8500/v1/health/state/critical [][ec2-user@ip-172-16-1-14 ~]$ curl http://localhost:8500/v1/health/state/critil [{"Node":"agent-one","CheckID":"service:web","Name":"Service 'web' check","Status":"critical","Notes":"","Output":"","ServiceID":"web","ServiceName":"web"}] |
DNS APIでも確認してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$ dig @127.0.0.1 -p 8600 web.service.consul ; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.35.amzn1 <<>> @127.0.0.1 -p 8600 web.service.consul ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61048 ;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0 ;; WARNING: recursion requested but not available ;; QUESTION SECTION: ;web.service.consul. IN A ;; Query time: 1 msec ;; SERVER: 127.0.0.1#8600(127.0.0.1) ;; WHEN: Thu Mar 19 07:44:48 2015 ;; MSG SIZE rcvd: 36 |
いかがでしたでしょうか?
次回もお楽しみに!!!