etcd見張るやつ 
Dockerで動的ロードバランサについ 
て考えた 
@kamekoopa
お前 is 誰 
けーえむ / @kamekoopa 
ただのプログラマ 
Java, PHP, Scala, Python 
Play2とかが好き 
最近触れてない 
ボルダリングが上達しない 
ミニ四駆
Docker使ってますか? 
いろいろ便利 
プロセスの稼働環境を常にクリーンに 
構築できる 
環境をバージョン管理可能 
冪等がなんちゃらとか完全に気にしな 
くて良い 
※ 詳しい説明は省きます
マルチホストでDocker 
webアプリとか乗っけるならやっぱ 
りリバースプロキシとかで負荷分 
散したい 
Dockerでマルチホスト 
一気に難易度上がる感 
スケジューリング 
サービスディスカバリ
マルチホストでDocker 
どのホストへ配置するか 
どのホストに配置されるかは分からな 
い 
配置するホスト固定する? 
スケールアウトしづらい 
デプロイ方法はどうするのとか 
にも絡む
マルチホストでDocker 
あるコンテナがどのホストで動 
いているか 
ホストとポート固定する? 
前述のスケールアウトの問題 
ポートが衝突するので同一ホストで2インスタ 
ンス以上立ちあげられない
マルチホストでDocker 
あるコンテナがどこのホストの 
どのポートで立ち上がるかを静 
的に決めるのは難しい 
立ち上がったコンテナの状況に 
応じて動的に設定されるリバー 
スプロキシの欲しさが高まる
マルチホストでDocker 
インターネットを探してみてもあ 
まり知見が見当たらない 
色々ググってたら以下のツール 
が見つかった 
Registrator 
etcd
Registrator 
Dockerコンテナが立ち上がったり 
死んだりするのを監視して、変化 
があったらetcdに書き込む 
各コンテナホストで立ち上げる 
これ自体もDockerコンテナで実 
行するのでセットアップが楽
etcd 
分散KeyValueStore 
各コンテナホストの状況を集約 
する所 
耐障害性がある 
割と早いらしい
動的リバースプロキシ 
コンテナを適当にデプロイする 
Registratorがetcdに書き込む 
あとはetcdの内容を適当なリバー 
スプロキシの設定へ反映できれば 
良さそう?
なら作ろう! 
と思ったけどconfdというものが既 
にあった。
confd 
etcdとかを見張って、その内容に 
応じて設定ファイルを書き換える 
書き換える設定ファイルはgoの 
templateの書式で記述する 
インターバルで見張るモード 
etcdをwatchして変更があった瞬 
間に駆動するモード
ということで 
コンテナを適当にデプロイする 
Registratorがetcdに書き込む 
confdにetcdの内容を元にnginx 
の設定ファイルを生成させる 
で出来そう!
と思ったら(2回目) 
confdの挙動がちょっとアレっぽい 
保持してるキャッシュが適切に 
クリアされてない 
etcdのキーが削除された時に適切にフ 
ァイルが生成されない 
チェックコマンドが実質的に意 
味をなしてなさげ 
詳しく書くには紙面が足りない
仕方ないので 
簡易版confdみたいなの作ってみた 
https://github.com/kamekoopa/ 
kvwatcher 
pythonなのでjinja2テンプレート使っ 
てます 
docker hubにあげてあるので
でpullできます
試し方 
どっかにetcd構築する 
コンテナホストでRegistratorを 
立ち上げて、さっき作ったetcd 
を見るようにする
試し方 
kvwatcherをpullしてrun
とそれに従ったテンプレー 
トファイルが必要 
ギッハブのプロジェクトの	
デ 
ィレクトリ配下見てもらえれば何となくわかる 
と思います
デモ 
作る余力がなかった(´・ω・`)
まとめ 
nginxを利用した動的リバースプ 
ロキシ 
サービス登録をRegistrator 
バックエンドをetcd 
設定への反映をconfd
まとめ 
実際に稼働中サービスで試した 
わけじゃないので問題は出てく 
るかもしれない 
あくまで実験 
nginxの設定ドンドコ書き換えて 
reloadしまくるし 
confdはまだちょっと動きが怪し 
そう(2014-12-03時点)

Kvwatcher