今回は『OSS編~オーケストレーションツール Consul 01 インストール編~』と題して、オーケストレーションのConsulでインストールから起動までを試してみたいと思います。
Consulとは
VagrantやSerfで有名なHashiCorp社がGo言語で開発しているサービスディスカバリーとコンフィグレーションのための分散型ツールです。
以下の4つの特徴があります。
・Service Discovery
Consulのクライアントは「api」や「mysql」のような与えられた名前を持つサービスを提供し、他のクライアントがConsulを利用してサービスの提供者を探す事が出来ます。
アプロケーションはDNSまたはHTTPインターフェースを利用する事で簡単にサービス検出を行う事が出来ます。
・Health Checking
Consulクライアントは多くのヘルスチェックを提供します。
(“is the webserver returning 200 OK”)や (“is memory utilization below 90%”)等の提供されているサービスの情報と連携する事が出来ます。
上記の情報を利用してオペレータはクラスタのヘルス状態を監視出来たり、サービス検出コンポーネントを利用して障害ホストへのトラフィックをルーティングしたり出来ます。
・Key/Value Store
アプリケーションはConsulの階層的なKey/Valueストアを利用出来ます。
動的構成やリーダー選定等の為に利用でき、シンプルなHTTP APIで簡単に出来ます。
・Multi Datacenter
複数のデータセンターでの利用をサポートしています。
ユーザーは複数のデータセンターによるConsulの階層等は気にせずに利用することが出来ます。
Serfとの違い
Serfはノードベースのサービスディスカバリーやオーケストレーションのツールであり、
Consulはサービスレベルでのサービスディスカバリーとコンフィグレーションです。
また、SerfはCAPでいうAP(可用性のために一貫性を犠牲にしている)システムですが、
ConsulはSerfより高度なサービスレベルの抽象化に特化しており、複数のデータセンターでのヘルスチェックやKVSのような高レベルを提供する為にCP(一貫性のために可用性を犠牲にしている)システムとなります。
一長一短があり、利用シーンによりどちらが適しているかが決まると思います。
Consulのインストール
1.バイナリファイルの取得
バイナリファイルを取得してパスを通します。
1 2 3 |
$ wget https://dl.bintray.com/mitchellh/consul/0.5.0_linux_amd64.zip $ unzip 0.5.0_linux_amd64.zip $ sudo mv consul /usr/local/bin/ |
バージョンを確認します。
1 2 3 |
$ consul -v Consul v0.5.0 Consul Protocol: 2 (Understands back to: 1) |
Consulの起動
1.エージェントの起動
ConsulをServerエージェントで起動してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
$ consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul ==> WARNING: BootstrapExpect Mode is specified as 1; this is the same as Bootstrap mode. ==> WARNING: Bootstrap mode enabled! Do not enable unless necessary ==> WARNING: It is highly recommended to set GOMAXPROCS higher than 1 ==> Starting Consul agent... ==> Starting Consul agent RPC... ==> Consul agent running! Node name: 'vagrant-ubuntu-trusty-64' Datacenter: 'dc1' Server: true (bootstrap: true) Client Addr: 127.0.0.1 (HTTP: 8500, HTTPS: -1, DNS: 8600, RPC: 8400) Cluster Addr: 10.0.2.15 (LAN: 8301, WAN: 8302) Gossip encrypt: false, RPC-TLS: false, TLS-Incoming: false Atlas: <disabled> ==> Log data will now stream in as it occurs: 2015/03/11 16:55:42 [INFO] raft: Node at 10.0.2.15:8300 [Follower] entering Follower state 2015/03/11 16:55:42 [INFO] serf: EventMemberJoin: vagrant-ubuntu-trusty-64 10.0.2.15 2015/03/11 16:55:42 [INFO] serf: EventMemberJoin: vagrant-ubuntu-trusty-64.dc1 10.0.2.15 2015/03/11 16:55:42 [INFO] consul: adding server vagrant-ubuntu-trusty-64 (Addr: 10.0.2.15:8300) (DC: dc1) 2015/03/11 16:55:42 [INFO] consul: adding server vagrant-ubuntu-trusty-64.dc1 (Addr: 10.0.2.15:8300) (DC: dc1) 2015/03/11 16:55:42 [ERR] agent: failed to sync remote state: No cluster leader 2015/03/11 16:55:43 [WARN] raft: Heartbeat timeout reached, starting election 2015/03/11 16:55:43 [INFO] raft: Node at 10.0.2.15:8300 [Candidate] entering Candidate state 2015/03/11 16:55:43 [INFO] raft: Election won. Tally: 1 2015/03/11 16:55:43 [INFO] raft: Node at 10.0.2.15:8300 [Leader] entering Leader state 2015/03/11 16:55:44 [INFO] consul: cluster leadership acquired 2015/03/11 16:55:44 [INFO] consul: New leader elected: vagrant-ubuntu-trusty-64 2015/03/11 16:55:44 [INFO] raft: Disabling EnableSingleNode (bootstrap) 2015/03/11 16:55:44 [INFO] consul: member 'vagrant-ubuntu-trusty-64' joined, marking health alive 2015/03/11 16:55:44 [INFO] agent: Synced service 'consul' |
2.メンバーリストの取得
別ターミナルからメンバーリストを取得してみます。
1 2 3 |
$ consul members Node Address Status Type Build Protocol vagrant-ubuntu-trusty-64 10.0.2.15:8301 alive server 0.5.0 2 |
3.HTTP,DNSインターフェースによる取得
httpによる取得を試してみます。
1 2 |
$ curl localhost:8500/v1/catalog/nodes [{"Node":"vagrant-ubuntu-trusty-64","Address":"10.0.2.15"}] |
続いてDNSによる取得を試してみます。
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 vagrant-ubuntu-trusty-64.node.consul ; <<>> DiG 9.9.5-3-Ubuntu <<>> @127.0.0.1 -p 8600 vagrant-ubuntu-trusty-64.node.consul ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27810 ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 ;; WARNING: recursion requested but not available ;; QUESTION SECTION: ;vagrant-ubuntu-trusty-64.node.consul. IN A ;; ANSWER SECTION: vagrant-ubuntu-trusty-64.node.consul. 0 IN A 10.0.2.15 ;; Query time: 7 msec ;; SERVER: 127.0.0.1#8600(127.0.0.1) ;; WHEN: Wed Mar 11 17:01:15 JST 2015 ;; MSG SIZE rcvd: 106 |
いかがでしたでしょうか?
次回もお楽しみに!!!