Submit Search
Consul は 全自動オーケストレーションの 夢を見るか?
•
38 likes
•
19,920 views
Uchio Kondo
Follow
@ペパボテックカンファレンス http://pepabo.connpass.com/event/13208/
Read less
Read more
1 of 79
Download now
Downloaded 43 times
More Related Content
Consul は 全自動オーケストレーションの 夢を見るか?
1.
GMO Pepabo, Inc. アドバンスドシニア 近藤うちお 2015/04/19
Pepabo Tech Conference Consul は 全自動オーケストレーションの 夢を見るか?
2.
me
4.
Rubyist
6.
From Fukuoka
8.
自動化厨 DevOps er
10.
デブオプスでCFPに応募しました 20I5.6.27 sat 10:00-17:00
@ Hakata!
11.
今日のテーマ
12.
Consul
14.
Consul has multiple
components > サービスディスカバリ > ヘルスチェック > Key/Value Store > 複数データセンタ対応
15.
Consul has multiple
components > サービスディスカバリ > ヘルスチェック > Key/Value Store > 複数データセンタ対応
16.
Excuse > 0.5.0 の新機能については 全然紹介しません……
17.
Raft Consensus Algorithm
18.
Raft Consensus Algorithm
19.
執政官 Consul
20.
リーダー投票 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
21.
“– http://www.slideshare.net/pfi/raft-36155398 誤解を恐れずにザックリ説明すると Client からのリクエストを Leader
がシリアライズしてクラスタ内の 他のプロセスに同じ順序でばらまく。 その他の参考サイト: http://blog.obfuscatism.net/blog/2014/12/01/raft/ http://thesecretlivesofdata.com/raft/
22.
cf. Raftの実装 > いくつかある >
https://github.com/hashicorp/raft > Ruby は Celluloidプロジェクトの https://github.com/celluloid/floss が 良さそう
23.
Consulの インストールと 運用
24.
泥臭く、 嵌った点を共有します……
25.
ディレクトリルール > -config-dir= /etc/consul.d >
-data-dir= /var/consul/data > -ui-dir= /var/consul/web_ui > (プロセスはconsulユーザで動かす)
26.
rpm つくった > ドッカーでナウくビルドできます >
あえてサービスを含まない > http://qiita.com/udzura/items/38075556d7609abd210a
27.
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
28.
停止時にちゃんとleaveしてくれ > stopsignal=INT > INTで止めるとgracefulにクラスタを 抜けるので、正しく止める際の手順では 明示するのが良さそう >
TERMとかで止めるとクラスタに残る > 一応設定で変更可能 > https://www.consul.io/docs/agent/options.html#leave_on_terminate
29.
サーバの数 > 3以上、なるだけサーバにしている > "bootstrap_expect":
3 > https://www.consul.io/docs/internals/consensus.html
30.
-bootstrap(-expect)? > -bootstrap での起動は雑に試す時 >
本運用では -bootstrap-expectで > 「3台未満は冗長構成と言わない」 > 2台ではリーダーがいつまでも決まらない > Raft だから…… > http://thesecretlivesofdata.com/raft/ を 眺めて理解
31.
-serverとクライアント > 基本的に -server
で立ち上げる > 運用の都合上、台数が増減するもの はクライアントモードにしている > 万一落としたサーバがリーダーだったら、 リーダ不在期間が一瞬とは言え発生してし まう。なるべく減らしたい
32.
GOMAXPROCS > CPUと同数(4なら4) > Vagrant上では、ちゃんとVMに CPUを2以上割り当てないと 永遠にリーダーが交代し続けて 面倒なことに。 >
I/O APIC の有効化をしないとダメ (忘れがち) http://qiita.com/d_nishiyama85/items/c50c95795865ae7f714b
33.
“– 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.
34.
vm.overcommit_memory=0 > 設定しないと、こう言う怖いログが出て 落ちる。-server の時のみ。 >
http://qiita.com/udzura/items/d24157a8d5ba6ab60ec0
35.
Programmable Consul
36.
consul watch
37.
consul watch とは >
consulサブコマンド > Consulでクラスタを組んでおけば、 色々なイベントを監視できる。 > 監視したいイベントを指定すると 特定のコマンドにJSONを渡せる。 > イベントが起こったらすぐ発火する。
38.
イベント一覧 > key: KVSの値 >
keyprefix: あるプレフィックス以下のKVSの値 > services: サービス全体の状態変更 > nodes: ノードの状態変更(追加削除) > service: 特定のサービスの変更 > checks: 特定のcheckの変更 > event: カスタムイベント
39.
実際は自分で consul watch せずにツールを噛ますことが多い
40.
ヘルスチェックのサマリを 通知
41.
consul-alerts > eventやcheckを監視して通知する デーモンを手軽に作れる
42.
Ikachanへの通知…… > カスタムコマンドが指定できる > カスタムコマンド作った >
https://github.com/udzura/consul-simple-notifier > 作ったけど大量のノード入れ替えの 際には厳しい……
43.
Slackへの通知 > 組み込みである > 組み込み、フォーマットがしょぼいのでPRした …… >
スルー😢 > ぼくのforkをビルドすればイケます
44.
ELBっぽい何か
45.
動的ロードバランサーと言う夢 > ロードバランサーには夢がある > NginxやPoundの設定を 動的書き換えとか >
mod/ngx_mrubyを使うとか
46.
> Automatic Load
Balancer > Serfでも無論できます > 「Webサーバの増減」なので もしかしたら、単にバックエンドの Nginxが死んだだけとかだとダメ…… > http://blog.glidenote.com/blog/2013/10/30/serf-haproxy/ Serf+HAProxyで作る
47.
consul- template
48.
consul-template > hashicorp公式 > consulのイベントを監視し、 サービス追加、ノード追加、 その他のタイミングでファイル更新 >
ノードの情報からテンプレートを作れる > 一緒にコマンドを打てる(reloadとか) https://github.com/hashicorp/consul-template
49.
具体的な奴 > Solrのクラスタを組みたい > 前段のLBはNginxにした >
バックエンドのSolrスレーブは 横にスケールさせたい…… > ポチポチと追加する?
50.
こう言うテンプレート 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; } }
51.
こう言うテンプレート 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; } }
52.
こうじゃ $ /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 …… 長さは、厳しい……
53.
こう言うのができる 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; } }
54.
通知する > 変更したら通知して欲しい > シェルとかでラッパーを噛ませば良し
55.
良かったこと > 動的にメンバを追加削除できる (少なくともAPI的なキックポイント がある) > ヘルスチェックをしてくれる >
この2点の要件を難なく満たす 動的LBが、結構あっさりと作れるぞ?
56.
厳しいなと思うこと > Goのテンプレート記法慣れなすぎる > ピンポイントでLBとかに使うのは いいけど……、 >
あんまり凝ると無限に consul-templateの デーモンができるのでは……
57.
そして伝説へ……
58.
Populus
60.
populus > Consul event
definition DSL (仮) > Senatus Populusque Romanus から取った > 名作ゲームとは無関係です……
61.
Consulと以下のことをします > consul watch
プロセスの立ち上げ と監視 > master node に一台だけ立ち上げ > イベントごとの処理を定義するDSL > 通知、ファイル生成、コマンド発行 ……ぐらいはする
62.
具体的なDSL
63.
中身 > specinfra で リモートコマンド を発行 >
ぼくもspecinfra一派になりました > open3でconsulプロセスを立ち上げて監視 > なるべくなるべく標準ライブラリ > Threadやinstance_evalがいっぱいだ
64.
課題 > まだ consul
watch -type event しか対応 していない……………… > せっかくのConsulなのに単一のマスターノード が必要。いいのかな…… > Consulなので、アクティブスタンバイ構成にするのは楽 ではある > なんかロバスト感に不安はある…… > 枯れてない、どころか俺が作った
65.
demo https://cloud.githubusercontent.com/assets/91011/7214167/8127b948- e5d9-11e4-9fe3-6be611cd47af.gif
67.
TODOs > とりあえず足りてない機能を…… > ファイルまだ生成できないし…… >
checks, nodes ぐらいは watchしたいし…… > あと、インストールが普通に考えて 大変なので omnibus にしたいな∼ →さっきできました!
68.
絶賛開発中 > https://github.com/udzura/ populus
69.
まとめ
70.
Consulは ただの「Nagiosの代替」 ではない
71.
コードの力で 複雑なサービスディスカバリにも 対応できる
72.
Consulが解決する課題は 多いが、 検証がまだまだ必要
73.
Thanks > @hiboma さん >
彼のアドバイスが無ければここまで早く 導入が終わらなかったと思います……
74.
PR
75.
Consulを全力で使える仕事あります > GMOペパボは 福岡/東京ともにエンジニアを 募集中です。 > アプリケーション/インフラ両方です! >
詳細は: http://pepabo.com/recruit/ career/
76.
併せて読みたい > OpenStack基盤との組み合わせて オペレーションの破壊的な進化が実現できる (かも)(まだ分かんないよ?)
77.
注目の求人 minne 基盤エンジニア
78.
ぼくらと やっていきませんか
79.
EOF
Download