consul & consul-alerts を使った監視システム (hbstyle-2015-01-08)
TRANSCRIPT
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
アーキテクチャ• データセンタ"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
通知!(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)
• 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)
• データセンタごとノードのステータスが一覧で見れる
• 特定サービスの通知停止も"Key/Value"から値を入れれば出来る
• ノードごと/サービスごと/ヘルスチェックごと"...
• データセンタを束ねた全体のステータス一覧は見れない
• HTTP"API"を発行して"json"をまとめるだけなので作れそう
ハートビーツ社内勉強会!hbstyle!(2015/01/07)!1!YOSHIKAWA!Ryota!(@rrreeeyyy) 27
何が良いか• モダンな雰囲気
• 割とよく出来た"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