wtatsuruの技術方面のブログ

はてなスタッフ id:wtatsuru です。日常ブログはこちら https://tatsuru.hatenablog.com/

開発合宿でDockerとMesosを使っていい感じにリソース提供とデプロイするやつを作ってた

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 自身もまだ発展途上にある
  • リソース管理まわりのミドルウェアが揃っていない気がする。*1
    • Marathon を動かしていると mesos-slave 自身の負荷がかなり高い
    • Marathon や executor の mesos-docker もドキュメントが足りなくて、チームメンバがソースを読んで挙動を確認する感じになった。*2
    • 何もしない分、オートスケール部分は自分で管理しないといけない。
    • Flynn には期待してる。
  • (Fluentd|Sensu) + Graphite という組み合わせで可視化と監視はいい感じにできる。
    • Fluentd, Sensu 両方動かしたくはないけど、一長一短あって両方動かすことになった。気合いを入れて fluentd に寄せるといいかもしれない
      • Sensu を使うと client 一覧をちゃんと管理しないと破滅するので面倒 (作りなおすたびに増える)
    • Graphite の記法が強力で楽しい

自分がやったこと

  • Mesos + Docker をどうやって動かすかという部分。
    • Torque は触ったことあったけど PBS はサービスに向いてないのでそれっぽい Marathon でやってみた。
  • リソースプールの準備
    • OSとカーネルを入れ替えて Docker 環境を作っておく
  • Dockerfile 叩き台
    • chef は本質的ではないので Dockerfile にスクリプトを書き連ねるだけ。
  • データ収集まわり
    • Fluentd, Sensu の client/server を用意してメトリクス・ログの収集
    • Graphite に投げてアプリ単位・バージョン単位のダッシュボードに表示

総括

  • Immutable infrastructure 環境作成まわりのミドルウェアとその上で動くアプリケーションの要求についてなんとなく感覚が掴めた。
  • 動くものを3日で勢いよく開発するのはなかなか楽しかった。3ヶ月に1回くらいやりたい。

疲れてるのでこれくらいにします。自分が触った部分の詳細については別の記事できっと書きます。

*1:このへんはサーベイが少し足りないかも

*2:勝手に作ったAPIドキュメント公開してほしいなー

はてなで一緒に働きませんか?