Consul は 全自動オーケストレーションの 夢を見るか?
-
Upload
uchio-kondo -
Category
Technology
-
view
11.787 -
download
7
Transcript of Consul は 全自動オーケストレーションの 夢を見るか?
GMO Pepabo, Inc. アドバンスドシニア
近藤うちお
2015/04/19 Pepabo Tech Conference
Consul は 全自動オーケストレーションの
夢を見るか?
me
Rubyist
From Fukuoka
自動化厨DevOps’er
デブオプスでCFPに応募しました
20I5.6.27 sat 10:00-17:00 @ Hakata!
今日のテーマ
Consul
Consul has multiple components
> サービスディスカバリ > ヘルスチェック > Key/Value Store > 複数データセンタ対応
Consul has multiple components
> サービスディスカバリ > ヘルスチェック > Key/Value Store > 複数データセンタ対応
Excuse> 0.5.0 の新機能については全然紹介しません……
Raft Consensus Algorithm
Raft Consensus Algorithm
執政官Consul
リーダー投票
http://ja.wikipedia.org/wiki/%E5%8F%A4%E4%BB%A3%E3%83%AD%E3%83%BC%E3%83%9E%E3%81%AE%E5%85%AC%E8%A1%86%E6%B5%B4%E5%A0%B4
“– http://www.slideshare.net/pfi/raft-36155398
“誤解を恐れずにザックリ説明すると Client からのリクエストを
Leader がシリアライズしてクラスタ内の 他のプロセスに同じ順序でばらまく。”
その他の参考サイト: http://blog.obfuscatism.net/blog/2014/12/01/raft/
http://thesecretlivesofdata.com/raft/
cf. Raftの実装> いくつかある > https://github.com/hashicorp/raft > Ruby は Celluloidプロジェクトの https://github.com/celluloid/floss が良さそう
Consulの インストールと
運用
泥臭く、 嵌った点を共有します……
ディレクトリルール> -config-dir= /etc/consul.d > -data-dir= /var/consul/data > -ui-dir= /var/consul/web_ui > (プロセスはconsulユーザで動かす)
rpm つくった> ドッカーでナウくビルドできます > あえてサービスを含まない > http://qiita.com/udzura/items/38075556d7609abd210a
consul agent -server> スーパーバイザ~ディー
> 実際はpuppetのsupervisordモジュール経由で設定している
[program:consul_master] command=/usr/bin/consul agent -config-dir=/etc/consul.d numprocs=1 numprocs_start=0 priority=999 autostart=true autorestart=true startsecs=10 startretries=3 exitcodes=0,2 stopsignal=INT stopwaitsecs=10 user=consul redirect_stderr=true stdout_logfile=/var/log/supervisor/%(program_name)s.log stdout_logfile_maxbytes=50MB stdout_logfile_backups=10 stderr_logfile=/var/log/supervisor/consul_master/consul_master.err stderr_logfile_maxbytes=250MB stderr_logfile_backups=10 environment=GOMAXPROCS=4
停止時にちゃんとleaveしてくれ> stopsignal=INT
> INTで止めるとgracefulにクラスタを抜けるので、正しく止める際の手順では明示するのが良さそう > TERMとかで止めるとクラスタに残る > 一応設定で変更可能 > https://www.consul.io/docs/agent/options.html#leave_on_terminate
サーバの数> 3以上、なるだけサーバにしている
> "bootstrap_expect": 3
> https://www.consul.io/docs/internals/consensus.html
-bootstrap(-expect)?> -bootstrap での起動は雑に試す時 > 本運用では -bootstrap-expectで > 「3台未満は冗長構成と言わない」 > 2台ではリーダーがいつまでも決まらない
> Raft だから…… > http://thesecretlivesofdata.com/raft/ を眺めて理解
-serverとクライアント> 基本的に -server で立ち上げる > 運用の都合上、台数が増減するものはクライアントモードにしている > 万一落としたサーバがリーダーだったら、リーダ不在期間が一瞬とは言え発生してしまう。なるべく減らしたい
GOMAXPROCS> CPUと同数(4なら4) > Vagrant上では、ちゃんとVMにCPUを2以上割り当てないと永遠にリーダーが交代し続けて 面倒なことに。 > I/O APIC の有効化をしないとダメ(忘れがち)
http://qiita.com/d_nishiyama85/items/c50c95795865ae7f714b
“– https://groups.google.com/forum/#!msg/consul-tool/qewFEqgAoF8/b9hxhmy1v6gJ
“The reason we recommend setting GOMAXPROCS is to avoid potential starvation of the scheduler. … If
a single goroutine blocks the scheduler it can cause degraded performance.”
vm.overcommit_memory=0
> 設定しないと、こう言う怖いログが出て落ちる。-server の時のみ。
> http://qiita.com/udzura/items/d24157a8d5ba6ab60ec0
ProgrammableConsul
consul watch
consul watch とは> consulサブコマンド > Consulでクラスタを組んでおけば、色々なイベントを監視できる。 > 監視したいイベントを指定すると特定のコマンドにJSONを渡せる。 > イベントが起こったらすぐ発火する。
イベント一覧> key: KVSの値 > keyprefix: あるプレフィックス以下のKVSの値 > services: サービス全体の状態変更 > nodes: ノードの状態変更(追加削除) > service: 特定のサービスの変更 > checks: 特定のcheckの変更 > event: カスタムイベント
実際は自分で consul watch
せずにツールを噛ますことが多い
ヘルスチェックのサマリを 通知
consul-alerts
> eventやcheckを監視して通知する デーモンを手軽に作れる
Ikachanへの通知……> カスタムコマンドが指定できる > カスタムコマンド作った > https://github.com/udzura/consul-simple-notifier
> 作ったけど大量のノード入れ替えの際には厳しい……
Slackへの通知> 組み込みである > 組み込み、フォーマットがしょぼいのでPRした……
> スルー😢
> ぼくのforkをビルドすればイケます
ELBっぽい何か
動的ロードバランサーと言う夢> ロードバランサーには夢がある > NginxやPoundの設定を動的書き換えとか > mod/ngx_mrubyを使うとか
> Automatic Load Balancer > Serfでも無論できます > 「Webサーバの増減」なのでもしかしたら、単にバックエンドのNginxが死んだだけとかだとダメ……
> http://blog.glidenote.com/blog/2013/10/30/serf-haproxy/
Serf+HAProxyで作る
consul-template
consul-template> hashicorp公式 > consulのイベントを監視し、サービス追加、ノード追加、その他のタイミングでファイル更新 > ノードの情報からテンプレートを作れる > 一緒にコマンドを打てる(reloadとか)
https://github.com/hashicorp/consul-template
具体的な奴> Solrのクラスタを組みたい > 前段のLBはNginxにした > バックエンドのSolrスレーブは横にスケールさせたい…… > ポチポチと追加する?
こう言うテンプレートupstream solr_slaves { {{range service "solr@pepabo-dc" "passing"}} server {{.Address}}:{{.Port}};{{end}} }
server { listen 8983; server_name _;
proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host;
location / { proxy_pass http://solr_slaves; }
}
こう言うテンプレートupstream solr_slaves { {{range service "solr@pepabo-dc" "passing"}} server {{.Address}}:{{.Port}};{{end}} }
server { listen 8983; server_name _;
proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host;
location / { proxy_pass http://solr_slaves; }
}
こうじゃ$ /usr/local/bin/consul-template \ -consul 127.0.0.1:8500 \ -template \ '/usr/local/consul-templates/nginx-solr.conf.ctmpl: /etc/nginx/dynamic-conf.d/solr.conf: systemctl reload nginx'\ -log-level debug ……
長さは、厳しい……
こう言うのができるupstream solr_slaves {
server 10.0.12.34:8983; server 10.0.12.56:8983; server 10.0.12.78:8983; }
server { listen 8983; server_name _;
proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host;
location / { proxy_pass http://solr_slaves; }
}
通知する> 変更したら通知して欲しい > シェルとかでラッパーを噛ませば良し
良かったこと> 動的にメンバを追加削除できる(少なくともAPI的なキックポイントがある) > ヘルスチェックをしてくれる > この2点の要件を難なく満たす動的LBが、結構あっさりと作れるぞ?
厳しいなと思うこと> Goのテンプレート記法慣れなすぎる > ピンポイントでLBとかに使うのはいいけど……、 > あんまり凝ると無限にconsul-templateのデーモンができるのでは……
そして伝説へ……
Populus
populus> Consul event definition DSL (仮) > Senatus Populusque Romanusから取った > 名作ゲームとは無関係です……
Consulと以下のことをします> consul watch プロセスの立ち上げと監視 > master node に一台だけ立ち上げ > イベントごとの処理を定義するDSL > 通知、ファイル生成、コマンド発行……ぐらいはする
具体的なDSL
中身> specinfra で リモートコマンドを発行 > ぼくもspecinfra一派になりました
> open3でconsulプロセスを立ち上げて監視 > なるべくなるべく標準ライブラリ > Threadやinstance_evalがいっぱいだ~~~~
課題> まだ consul watch -type event しか対応していない……………… > せっかくのConsulなのに単一のマスターノードが必要。いいのかな…… > Consulなので、アクティブスタンバイ構成にするのは楽ではある
> なんかロバスト感に不安はある…… > 枯れてない、どころか俺が作った
demo
https://cloud.githubusercontent.com/assets/91011/7214167/8127b948-e5d9-11e4-9fe3-6be611cd47af.gif
TODOs> とりあえず足りてない機能を…… > ファイルまだ生成できないし…… > checks, nodes ぐらいはwatchしたいし…… > あと、インストールが普通に考えて大変なので omnibus にしたいな~
→さっきできました!
絶賛開発中> https://github.com/udzura/populus
まとめ
Consulはただの「Nagiosの代替」
ではない
コードの力で 複雑なサービスディスカバリにも
対応できる
Consulが解決する課題は 多いが、
検証がまだまだ必要
Thanks> @hiboma さん > 彼のアドバイスが無ければここまで早く導入が終わらなかったと思います……
PR
Consulを全力で使える仕事あります
> GMOペパボは福岡/東京ともにエンジニアを募集中です。 > アプリケーション/インフラ両方です! > 詳細は:http://pepabo.com/recruit/career/
併せて読みたい
> OpenStack基盤との組み合わせてオペレーションの破壊的な進化が実現できる(かも)(まだ分かんないよ?)
注目の求人minne 基盤エンジニア
ぼくらと やっていきませんか
EOF