3日間の開発合宿で、Docker と Mesos を使ってリソース管理からテスト・デプロイ管理までするやつのプロトタイプを作ってた。
4人チームで3日間みっちりやって、それなりにいい感じにはできたと思う。id:shiba_yu36 が既に書いてるけど、自分の視点から感想だけ書いておく。
本番環境のBlue-Green Deploymentの仕組みのプロトタイプを作っていた - $shibayu36->blog;
経緯
- 最近忙しくてあまり触れてない、Immutable Infrastracture みたいなのを作ってみたかった。
- Docker を開発に使うのはいい感じだけど、実際の運用に組み込むには、というイメージをつかみたかった。
- というのをラーメン屋で話してたら4人集まったので風呂敷を広げてみた。
どんなものを作ったか
- アプリケーションは Docker コンテナとして動かす。
- Debian Wheezy に 3.10.23 のカーネルを入れて使った。
- コンテナ環境を提供するリソースプールは Mesos 上のフレームワーク Marathon で管理する。
- 特定バージョンの環境は Marathon 上のジョブとして実行される。反映や切り戻しはボタン一発で行える。
- 各種リソースをモニタリングしアプリケーションごと・ジョブごとに可視化される。
- Docker イメージ中に sensu と fluentd を入れてログやメトリクスを転送・監視する。
- 可視化は Graphite で。いい感じにまとめてダッシュボードに表示する。
- コンテナのテストから可視化まで Jenkins で行う。
- git リポジトリに push したら Docker イメージのビルドとテスト。
- 全体のフルビルド・アプリ変更のみの差分ビルドを用意して普段は後者のみ行う。
- Docker イメージを push する形は選ばなかった。
- 全体を統括するダッシュボードアプリから反映操作を行う。
- バージョンごとに Marathon にリソース要求。nginx 設定を生成し、ヘルスチェックが通ったら切り替えボタンでリリースできる。
- 個別のバージョン環境へのアクセス提供。実際にアクセスして確認できる。
- Jenkinsでテストが通ったらすぐに最新版が作られる。手動で作成もでき、各バージョンは削除するまで残されている。
感想
開発用にはすぐにでも導入したい
- コンテナ型の起動時間とリソース消費の少なさで気軽に Immutable にできる。
- サーバ設定変更・反映含めて思った以上に気楽にできた。既存の社内環境やAWS で5-10分かかるのと比較しても心理的な障壁がかなり小さい。
- 気軽に環境作成・分離ができる。
本番導入には課題が多い
- Docker 自身もまだ発展途上にある
- issue になってるところにけっこうはまってた https://github.com/dotcloud/docker/issues?page=1&state=open
- すごい勢いで開発されてるのでそれなりに
- リソース管理まわりのミドルウェアが揃っていない気がする。*1
- Marathon を動かしていると mesos-slave 自身の負荷がかなり高い
- Marathon や executor の mesos-docker もドキュメントが足りなくて、チームメンバがソースを読んで挙動を確認する感じになった。*2
- 何もしない分、オートスケール部分は自分で管理しないといけない。
- Flynn には期待してる。
- (Fluentd|Sensu) + Graphite という組み合わせで可視化と監視はいい感じにできる。
- Fluentd, Sensu 両方動かしたくはないけど、一長一短あって両方動かすことになった。気合いを入れて fluentd に寄せるといいかもしれない
- Sensu を使うと client 一覧をちゃんと管理しないと破滅するので面倒 (作りなおすたびに増える)
- Graphite の記法が強力で楽しい
- Fluentd, Sensu 両方動かしたくはないけど、一長一短あって両方動かすことになった。気合いを入れて fluentd に寄せるといいかもしれない
自分がやったこと
総括
- Immutable infrastructure 環境作成まわりのミドルウェアとその上で動くアプリケーションの要求についてなんとなく感覚が掴めた。
- 動くものを3日で勢いよく開発するのはなかなか楽しかった。3ヶ月に1回くらいやりたい。
疲れてるのでこれくらいにします。自分が触った部分の詳細については別の記事できっと書きます。