Más contenido relacionado La actualidad más candente (20) Similar a Consulを頑張って理解する (20) Consulを頑張って理解する9. 大雑把な構成イメージ ※色々省略してます
node01.example.jp
IP:192.168.20.21
consul server 01
node04.example.jp
IP:192.168.20.41
consul client 01
apach01
node02.example.jp
IP:192.168.20.22
consul server 02
node03.example.jp
IP:192.168.20.23
consul server 03
node05.example.jp
IP:192.168.20.42
consul client 02
apach02
consul操作script等
consul操作script等
consulクライアントで自身のノー
ドにあるApacheの状態を監視
Apacheで実行されているWeb
アプリをサービスとして
consulに登録
Webアプリがサービスとして登
録された事をイベント的に検知
して何かを行う等
15. サーバノードで consul server を起動
1:各サーバノードで順番に実行
○node01.example.jp
#nohup consul agent -server -bootstrap-expect=3
-data-dir=/var/lib/consul -advertise=192.168.20.21 &
○node02.example.jp
#nohup consul agent -server -bootstrap-expect=3
-data-dir=/var/lib/consul -advertise=192.168.20.22
-join=node01.example.jp &
○node03.example.jp
#nohup consul agent -server -bootstrap-expect=3
-data-dir=/var/lib/consul -advertise=192.168.20.23
-join=node01.example.jp &
※consulをそのまま実行するとフロントエンドで動作する為、先頭の nohup と 最後の & にてバックグラウンド動作をさせています。
16. クライアントノードで consul client を起動
1:各クライアントノードで実行
○node04.example.jp
#nohup consul agent -data-dir=/var/lib/consul -advertise=192.168.20.41
-join node01.example.jp &
○node05.example.jp
#nohup consul agent -data-dir=/var/lib/consul -advertise=192.168.20.42
-join node01.example.jp &
※consulをそのまま実行するとフロントエンドで動作する為、先頭の nohup と 最後の & にてバックグラウンド動作をさせています。
20. ちなみにもう少しだけ実践的な起動時の引数では...
○node01.example.jp、node02.example.jp、node03.example.jp (サーバ)
#consul agent -server -bootstrap-expect=3
-data-dir=/var/lib/consul -bind 0.0.0.0 -advertise=192.168.20.21
-retry-join=node01.example.jp
-retry-join=node02.example.jp
-retry-join=node03.example.jp
※赤字部分は各ホスト自身のIPアドレスで後は全台同じ記述
○node04.example.jp、node05.example.jp (クライアント)
#consul agent
-data-dir=/root/consul/data -bind 0.0.0.0 -advertise=192.168.20.41
-retry-join=node01.example.jp
-retry-join=node02.example.jp
-retry-join=node03.example.jp
※赤字部分は各ホスト自身のIPアドレスで後は全台同じ記述
25. またこの図ですが ※色々省略してます
node01.example.jp
IP:192.168.20.21
consul server 01
node04.example.jp
IP:192.168.20.41
consul client 01
apach01
node02.example.jp
IP:192.168.20.22
consul server 02
node03.example.jp
IP:192.168.20.23
consul server 03
node05.example.jp
IP:192.168.20.42
consul client 02
apach02
consul操作script等
consul操作script等
普通この手のクライアントサーバな構
成のものの場合、何かをしたい場合は
サーバに問い合わせるイメージです
が、consulの場合、自身のホストにあ
るconsulクライアントを使用するの
が基本形です。
つまりこの線の部分がconsulへの操作
や問い合わせになります。
26. またこの図ですが ※色々省略してます
node01.example.jp
IP:192.168.20.21
consul server 01
node04.example.jp
IP:192.168.20.41
consul client 01
apach01
node02.example.jp
IP:192.168.20.22
consul server 02
node03.example.jp
IP:192.168.20.23
consul server 03
node05.example.jp
IP:192.168.20.42
consul client 02
apach02
consul操作script等
consul操作script等
consulクライアントは自身のconsul
クラスタとしてのjoinや通信により、
consulサーバとリンクしている状態
にあります。
つまり、consulクライアントへの操作や問い合わ
せはconsulサーバへ操作や問い合わせをしている
のと同等に近い動作をするようになっています。
この辺りがconsulを使う場合の基本となります。
※必須ではありませんが
30. 現在のクラスタ状態の確認
○とりあえずはcliで現在のクラスタ状態の確認
まずはconsulクライアント/サーバの入っている環境で以下のコマン
ドを入力
#consul members
Node Address Status Type Build Protocol DC
node01.example.jp 192.168.20.21:8301 alive server 0.6.3 2 dc1
node02.example.jp 192.168.20.22:8301 alive server 0.6.3 2 dc1
node03.example.jp 192.168.20.23:8301 alive server 0.6.3 2 dc1
node04.example.jp 192.168.20.41:8301 alive client 0.6.3 2 dc1
node05.example.jp 192.168.20.42:8301 alive client 0.6.3 2 dc1
特に問題なく構築されている場合は以上のような出力となります。先
程までで構築したサーバやクライアントが全て列挙され、ステータス
がaliveとなっていれば問題ありません。
38. DNSについて (service srv機能 ※少し重要な機能)
digコマンドを実行 (クライアントノードで実行)(サーバノードでも可能ですが)
サービス情報(srv)を取得する場合 (サービス名.service.consul)
#dig @localhost -p 8600 consul.service.consul srv
;; ANSWER SECTION:
consul.service.consul. 0 IN SRV 1 1 8300 node01.example.jp.node.dc1.consul.
consul.service.consul. 0 IN SRV 1 1 8300 node02.example.jp.node.dc1.consul.
consul.service.consul. 0 IN SRV 1 1 8300 node03.example.jp.node.dc1.consul.
*srv
digコマンドでDNSのsrvレコードを問い合わせる場合に付加する。
*8300
このサービスが待ち受けているポート番号、consulサーバは8300で利用可能という意味。
*node01.example.jp.node.dc1.consul
このサービスを行っているノード。(デフォルト設定ではdc1というデータセンタに所属する)
39. DNSについて (service srv機能 ※少し重要な機能)
さて、DNSの三つの機能の説明を書きましたが、srvレコードの問い
合わせ機能は少し重要なので捕捉があります。
前述の問い合わせ結果により、srvレコードを使えば「サービス名」
だけで「consulサービスを利用する為にはどのサーバのどのポート
を使用すれば良いかが分かる」という事になります。また、この三
つの回答はDNSらしくラウンドロビンされた結果となっている為、問い
合わせする度に違う順番で結果が返って来ます。つまり、複数のレプ
リカを持つような冗長化サービスでは適度にバランシングされた接
続先を使用する事が可能という事になります。
また、このSRVレコードですが、consulのヘルスチェック機能を有効
にしていた場合、ヘルスチェックで問題があるサービスは結果から
除外されて返って来ます。冗長化構成にぴったりの機能ですね。
43. HTTP-API (catalog ※後述のagentとの役割の違いに注意がいります)
*ノードの一覧を表示する
#curl http://localhost:8500/v1/catalog/nodes
[{"Node":"node01.example.jp","Address":"192.168.20.21","CreateIndex":3,"ModifyIndex":8},
{"Node":"node02.example.jp","Address":"192.168.20.22","CreateIndex":4,"ModifyIndex":9},
{"Node":"node03.example.jp","Address":"192.168.20.23","CreateIndex":5,"ModifyIndex":10},
{"Node":"node04.example.jp","Address":"192.168.20.41","CreateIndex":6,"ModifyIndex":11},
{"Node":"node05.example.jp","Address":"192.168.20.42","CreateIndex":7,"ModifyIndex":12}]
*ノード個別の情報を表示する
#curl http://localhost:8500/v1/catalog/node/node01.example.jp
{"Node":
{"Node":"node01.example.jp","Address":"192.168.20.21","CreateIndex":3,"ModifyIndex":8},"
Services":{"consul":{"ID":"consul","Service":"consul","Tags":
[],"Address":"","Port":8300,EnableTagOverride":false,"CreateIndex":3,"ModifyIndex":8}}}
44. HTTP-API (catalog ※後述のagentとの役割の違いに注意がいります)
*サービスの一覧を表示する
#curl http://localhost:8500/v1/catalog/services
{"consul":[]}
*サービス個別の情報を表示する
#curl http://localhost:8500/v1/catalog/service/consul
[{"Node":"node01.example.jp","Address":"192.168.20.21","ServiceID":"consul","ServiceName
":"consul","ServiceTags":
[],"ServiceAddress":"","ServicePort":8300,"ServiceEnableTagOverride":false,"CreateIndex"
:3,"ModifyIndex":6},
{"Node":"node02.example.jp","Address":"192.168.20.22","ServiceID":"consul","ServiceName"
:"consul","ServiceTags":
[],"ServiceAddress":"","ServicePort":8300,"ServiceEnableTagOverride":false,"CreateIndex"
:4,"ModifyIndex":7},
{"Node":"node03.example.jp","Address":"192.168.20.23","ServiceID":"consul","ServiceName"
:"consul","ServiceTags":
[],"ServiceAddress":"","ServicePort":8300,"ServiceEnableTagOverride":false,"CreateIndex"
:5,"ModifyIndex":8}]
45. HTTP-API (agent ※前述のcatalogとの役割の違いに注意がいります)
*サービスを登録する
HTTPの PUTで http://localhost:8500/v1/agent/service/register に
以下のようなJSONを送信する (下記内容は公式のexampleからのコピペです)
{
"ID": "redis1",
"Name": "redis",
"Tags": [
"master",
"v1"
],
"Address": "127.0.0.1",
"Port": 8000,
"Check": {
"Script": "/usr/local/bin/check_redis.py",
"HTTP": "http://localhost:5000/health",
"Interval": "10s",
"TTL": "15s"
}
}
46. HTTP-API (kv)
*key value を登録する
#curl -X PUT -d 'value01' http://localhost:8500/v1/kv/key01
true
*key value を取得する
#curl http://localhost:8500/v1/kv/key01
[{"LockIndex":0,"Key":"key01","Flags":0,"Value":"dmFsdWUwMQ==","CreateIndex":1324,"M
odifyIndex":1324}]
57. server node 01 node 01
consul-agent (client)
agent
service 01 (web)
check 01
(chrck http)
apache 01
catalog
node情報
service情報
health
consul-agent (server)
agent
catalog
node情報
service情報
health
kvskvs
consul(service) へのservice登録
consul(kvs) への値登録
※あくまで概念図です。実際の通信はもっと相互に入り組んでいるようです。データ中心の概念図