consul & consul-alerts を使った監視システム (hbstyle-2015-01-08)

32
consul & consul)alerts を使った監視システム ハートビーツ社内勉強会 hbstyle (2015/01/07) 1 YOSHIKAWA Ryota (@rrreeeyyy) 1

Transcript of consul & consul-alerts を使った監視システム (hbstyle-2015-01-08)

consul'&'consul)alerts''を使った監視システム

ハートビーツ社内勉強会!hbstyle!(2015/01/07)!1!YOSHIKAWA!Ryota!(@rrreeeyyy) 1

概要• consul(1(並びに(consul*alerts(2(を使った監視システムを試作

• consul(の(health(check(3(機能を使用し監視を設定

• check(の状態が変化した場合に(consul*alerts(が通知を実行

• 通知先は(email,(slack,(pagerduty(...(等

3"h$p://www.consul.io/docs/agent/checks.html

2"h$ps://github.com/AcalephStorage/consul9alerts

1"h$ps://consul.io/

ハートビーツ社内勉強会!hbstyle!(2015/01/07)!1!YOSHIKAWA!Ryota!(@rrreeeyyy) 2

consul

• hashicorp*4*の出しているオーケストレーションツール

• Service*Discovery/Health*Check/DNS/KVS/*...*等の様々な機能

• ここでは*Health*Check/KVS*の機能をメインで使い、監視エージェントとして動作させる

• health*check*スクリプトは*nagios/sensu*の物がそのまま使える4"h$ps://hashicorp.com/

ハートビーツ社内勉強会!hbstyle!(2015/01/07)!1!YOSHIKAWA!Ryota!(@rrreeeyyy) 3

consul-alerts

• consul(の(health(check(の状態を監視し、変更があれば通知するデーモン

• 通知先は(email/slack/InfluxDB/pagerduty(...(等

• 独自スクリプトのキックも可能

• ノードやサービス、チェック毎の通知停止が出来る

• HTTP(API(を叩くとノード/チェック毎のステータスが分かるハートビーツ社内勉強会!hbstyle!(2015/01/07)!1!YOSHIKAWA!Ryota!(@rrreeeyyy) 4

アーキテクチャと設定

ハートビーツ社内勉強会!hbstyle!(2015/01/07)!1!YOSHIKAWA!Ryota!(@rrreeeyyy) 5

アーキテクチャ図

ハートビーツ社内勉強会!hbstyle!(2015/01/07)!1!YOSHIKAWA!Ryota!(@rrreeeyyy) 6

アーキテクチャ• データセンタ"2"つ"("DC1"/"DC2")

• それぞれのデータセンタにノードを"2"つずつ置く

• データセンタのリーダごとに"consul0alerts"のデーモンを起動

• いずれかのデータセンタ上の"WebUI"でアラートの確認が可能

• ヘルスチェックの追加は"HTTP"API"か設定ファイルで行う

ハートビーツ社内勉強会!hbstyle!(2015/01/07)!1!YOSHIKAWA!Ryota!(@rrreeeyyy) 7

アーキテクチャ• 冗長化/スケールしやすそうなアーキテクチャ

• リーダノードの冗長化

• new&leader+event+に対する+hook+を作っておけば良さそう

• スケールは+DC+内のクラスタを細かく作れば良さそう

• Web+のリーダ/DB+のリーダ+...+等を作って管理

ハートビーツ社内勉強会!hbstyle!(2015/01/07)!1!YOSHIKAWA!Ryota!(@rrreeeyyy) 8

設定• consul(のインストール(→(go(なので任意のバイナリ置くだけ

• consul+alerts(のインストール(→(同上

• 設定ファイルの配置は以下の通りにした

• consul(自体の設定を/opt/consul/consul.confに置く

• 各チェックの設定を/opt/consul/conf.d/*.jsonに置く

ハートビーツ社内勉強会!hbstyle!(2015/01/07)!1!YOSHIKAWA!Ryota!(@rrreeeyyy) 9

設定!(consul upstart)• upstart(の例description "consul"author "YOSHIKAWA Ryota ([email protected])"

start on runlevel [2345]stop on runlevel [016]

exec /usr/local/bin/consul agent \ -config-file /opt/consul/consul.conf \ -config-dir /opt/consul/conf.d/ \ >> /var/log/consul.log 2>&1

respawn

ハートビーツ社内勉強会!hbstyle!(2015/01/07)!1!YOSHIKAWA!Ryota!(@rrreeeyyy) 10

設定!(/opt/consul/consul.conf){ "server": true, "node_name": "rrreeeyyy", "bootstrap": true, "datacenter": "rrreeeyyy", "bind_addr": "0.0.0.0", "advertise_addr": "0.0.0.0", "data_dir": "/opt/consul/data/", "log_level": "INFO", "ui_dir": "/opt/consul/ui/", "encrypt": "**************"}

ハートビーツ社内勉強会!hbstyle!(2015/01/07)!1!YOSHIKAWA!Ryota!(@rrreeeyyy) 11

設定!(/opt/consul/consul.conf)• bootstrap)は最初に起動するノードだけに付ける

• encrypt)は)consul keygen)コマンドで生成した値

• 通信する全てのノードで統一する

• data_dir)は)consul)の)KVS)のデータとかが入る

• ui_dir)は)consul3ui)を解凍した中身を置いておく

ハートビーツ社内勉強会!hbstyle!(2015/01/07)!1!YOSHIKAWA!Ryota!(@rrreeeyyy) 12

設定!(/opt/consul/conf.d/*.json)• 以下のようなヘルスチェックの定義を書いた"json"を沢山置く{ "check": { "id": "check_users", "name": "Users", "script": "/usr/lib64/nagios/plugins/check_users -w 2 -c 3", "interval": "20s" }}

ハートビーツ社内勉強会!hbstyle!(2015/01/07)!1!YOSHIKAWA!Ryota!(@rrreeeyyy) 13

設定!(/opt/consul/conf.d/*.json)• 実は次のように"HTTP"API"でもチェックを登録できて便利curl -vvv -X PUT \ -d '{ "ID": "check_swap", "Name": "Swap Utilization", "Notes": "Check swap space on local machine.", "Script": "/usr/lib64/nagios/plugins/check_swap -w 80% -c 30%", "Interval": "10s"}' \http://localhost:8500/v1/agent/check/register

ハートビーツ社内勉強会!hbstyle!(2015/01/07)!1!YOSHIKAWA!Ryota!(@rrreeeyyy) 14

設定!(/opt/consul/conf.d/*.json)

• 削除はこうcurl localhost:8500/v1/agent/check/deregister/check_swap

• consul(を(reload(することなく登録できる

• 0.4(だと(restart(すると消えちゃうけど(0.5(で直るらしい(5

• ホスト外からチェックを登録することも可能

5"h$ps://github.com/hashicorp/consul/issues/507

ハートビーツ社内勉強会!hbstyle!(2015/01/07)!1!YOSHIKAWA!Ryota!(@rrreeeyyy) 15

設定!(consul)

• start consul"で起動

• クラスタを作る

• consul join -wan ${DC_LEADER_IP}"(DC"間)

• consul join ${INTERNAL_LEADER_IP}"(DC"内)

• consul members"で確認"(DC"間"は"-wan"を付ける)

ハートビーツ社内勉強会!hbstyle!(2015/01/07)!1!YOSHIKAWA!Ryota!(@rrreeeyyy) 16

設定!(consul-alerts upstart)• upstart(の例description "consul-alerts"author "YOSHIKAWA Ryota ([email protected])"

start on runlevel [2345]stop on runlevel [016]

exec consul-alerts start \ --watch-checks \ --watch-events \ --consul-dc=rrreeeyyy \ >> /var/log/consul-alerts.log 2>&1

respawn

ハートビーツ社内勉強会!hbstyle!(2015/01/07)!1!YOSHIKAWA!Ryota!(@rrreeeyyy) 17

設定!(consul-alerts)

• 必要な値の"PUT"(slack"の例)"6

curl -X PUT -d 'true' \ http://localhost:8500/v1/kv/consul-alerts/config/notifiers/slack/enabledcurl -X PUT -d 'https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXXXXX' \ http://localhost:8500/v1/kv/consul-alerts/config/notifiers/slack/urlcurl -X PUT -d 'CLUSTER-NAME' \ http://localhost:8500/v1/kv/consul-alerts/config/notifiers/slack/cluster-namecurl -X PUT -d '#alerts' \ http://localhost:8500/v1/kv/consul-alerts/config/notifiers/slack/channel

• WebUI'からも値を入れられる6"Slack連携は"consul,alerts"が"v0.2.0"だと仕様が古いので最新をビルドすると上手くいく"(consul,alerts/pull/29)

ハートビーツ社内勉強会!hbstyle!(2015/01/07)!1!YOSHIKAWA!Ryota!(@rrreeeyyy) 18

動作デモ

ハートビーツ社内勉強会!hbstyle!(2015/01/07)!1!YOSHIKAWA!Ryota!(@rrreeeyyy) 19

通知!(consul-alerts)• Log%no'fier%がデフォルトでオンなので確認してみる

• 何かアラートを発生させてから以下のログを確認cat /tmp/consul-notifications.log[consul-notifier] 2015/01/06 15:34:30 Node=rrreeeyyy, Service=, Check=Disk /, Status=warning[consul-notifier] 2015/01/06 15:34:30 Node=rrreeeyyy, Service=, Check=Users, Status=passing[consul-notifier] 2015/01/06 15:35:32 Node=rrreeeyyy, Service=, Check=Users, Status=passing[consul-notifier] 2015/01/06 15:41:11 Node=rrreeeyyy, Service=, Check=Users, Status=critical[consul-notifier] 2015/01/06 15:44:20 Node=rrreeeyyy, Service=, Check=Users, Status=passing[consul-notifier] 2015/01/06 16:13:40 Node=rrreeeyyy, Service=, Check=Users, Status=critical[consul-notifier] 2015/01/07 16:22:56 Node=rrreeeyyy, Service=, Check=Users, Status=critical:

ハートビーツ社内勉強会!hbstyle!(2015/01/07)!1!YOSHIKAWA!Ryota!(@rrreeeyyy) 20

通知!(consul-alerts)

ハートビーツ社内勉強会!hbstyle!(2015/01/07)!1!YOSHIKAWA!Ryota!(@rrreeeyyy) 21

通知!(consul-alerts)

• Slack/Log+の通知はちょっと貧相+7

• email+の通知はテンプレートが書けてかなり柔軟

• 独自スクリプトもキック出来るので実際何でもできる

• consul+の+events+を拾ってスクリプトの実行も可能

• member-fail,+new-leader,+user+defini9on+..7"プルリクエストを送ろう!!"h%ps://github.com/AcalephStorage/consul:alerts/compare

ハートビーツ社内勉強会!hbstyle!(2015/01/07)!1!YOSHIKAWA!Ryota!(@rrreeeyyy) 22

WebUI&(consul-webui)

ハートビーツ社内勉強会!hbstyle!(2015/01/07)!1!YOSHIKAWA!Ryota!(@rrreeeyyy) 23

ハートビーツ社内勉強会!hbstyle!(2015/01/07)!1!YOSHIKAWA!Ryota!(@rrreeeyyy) 24

ハートビーツ社内勉強会!hbstyle!(2015/01/07)!1!YOSHIKAWA!Ryota!(@rrreeeyyy) 25

ハートビーツ社内勉強会!hbstyle!(2015/01/07)!1!YOSHIKAWA!Ryota!(@rrreeeyyy) 26

WebUI&(consul-webui)

• データセンタごとノードのステータスが一覧で見れる

• 特定サービスの通知停止も"Key/Value"から値を入れれば出来る

• ノードごと/サービスごと/ヘルスチェックごと"...

• データセンタを束ねた全体のステータス一覧は見れない

• HTTP"API"を発行して"json"をまとめるだけなので作れそう

ハートビーツ社内勉強会!hbstyle!(2015/01/07)!1!YOSHIKAWA!Ryota!(@rrreeeyyy) 27

所感/まとめ

ハートビーツ社内勉強会!hbstyle!(2015/01/07)!1!YOSHIKAWA!Ryota!(@rrreeeyyy) 28

何が良いか• モダンな雰囲気

• 割とよく出来た"WebUI"が付属

• スケール/冗長化しやすそうなアーキテクチャ

• consul"導入のきっかけになる

• ホストのインベントリ管理やオーケストレーションも同時に

ハートビーツ社内勉強会!hbstyle!(2015/01/07)!1!YOSHIKAWA!Ryota!(@rrreeeyyy) 29

何が良いか• consul(acl(でアクセス制御もある程度可能

• consul(の(HTTP(API(だけで監視設定が完了できる(将来)

• コンテナとかだと特に嬉しいかもしれない

• sensu/nagios(監視設定はそのまま引き継げる(8

8"zabbix(get"があれば"zabbix"もなんとかなりそう"h-p://sfujiwara.hatenablog.com/entry/20140611/1402472346

ハートビーツ社内勉強会!hbstyle!(2015/01/07)!1!YOSHIKAWA!Ryota!(@rrreeeyyy) 30

何が課題か• 外形監視は別の仕組みが必要"(TTL"死活監視で出来るかも?)

• consul"自体の運用が結構難しい"(知見がないだけかも)

• 現在は1サービスに対する複数のチェック定義が難しい"9

• 未知なのでまだまだ課題はたくさん出てきそう

9"h$ps://github.com/hashicorp/consul/issues/230

ハートビーツ社内勉強会!hbstyle!(2015/01/07)!1!YOSHIKAWA!Ryota!(@rrreeeyyy) 31

まとめ• consul(並びに(consul)alerts(を用いた監視システムを紹介

• アーキテクチャは良さそう

• 自宅で元気に稼働中

• まだ(2(日ぐらいしか動いてないので課題はバンバン出そう

• 細かい設定やハマりどころはブログ等で公開するかも

ハートビーツ社内勉強会!hbstyle!(2015/01/07)!1!YOSHIKAWA!Ryota!(@rrreeeyyy) 32