Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Consul は 全自動オーケストレーションの 夢を見るか?

19,077 views

Published on

@ペパボテックカンファレンス
http://pepabo.connpass.com/event/13208/

Published in: Technology
  • Login to see the comments

Consul は 全自動オーケストレーションの 夢を見るか?

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

×