$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

本番環境のBlue-Green Deploymentの仕組みのプロトタイプを作っていた

 最近Dockerとか、serfとかその辺りのツールが流行ってる。その中でとりあえずDockerはテスト環境やCIでは使えるかもしれないけど、実際にwebサービスが動いているものに使えるかどうかはまだわかんないねーという流れになっていた。

 まあでもとりあえず動いているwebサービスをDockerでやったらどうなるかというのを知りたいというのがあって、いろいろ機会があったので4人で3日くらいやってプロトタイプ実装というのをしてみて試した。

結局出来たこと

 結局以下の様なものが実際に動くところまで行った。

  • AWSのような環境がなくてもDockerさえ動けばブルーグリーンデプロイ出来る
    • VPSだろうが自宅サーバだろうがなんでも
    • ボタンだけで「本番用環境構築」「本番前の確認」「本番切替」が出来る
  • web n台くらいを一セットとみなした環境をボタンひとつで簡単に作れる
    • Docker imageのビルドが終わっていれば10秒程度
    • アプリケーションコードの変更のみを使って差分image buildしたかったら2分くらいで
    • 全体docker buildし直しなら30分程度
    • もちろんサーバのスペックにもよります
  • docker imageのbuildはjenkinsが勝手にやってくれる
    • 全buildし直し、アプリケーションコードの差分buildだけで分けてやってくれる
  • 本番用docker imageそのものに対して、アプリケーションのテスト、インフラのテストを行う
    • 本当にそのものに対して行った、テストが終わったコンテナは捨てる
  • 実際にdocker containerをどこに立てるかはリソース制御しているところが勝手に決めてくれる
    • docker container一つはweb 1台に相当します
  • docker containerの状態や一つの環境の状態は中央にログが送られてグラフ化される
    • アクセス数・アクセスのステータスコード比率・CPU使用率・メモリ使用量・etc
    • ログ転送はfluentdなどで
    • サーバのmetrics収集はsensuなどで
    • グラフ化はgraphiteなどで行われた

 今回はサンプルwebアプリをデプロイしまくっただけだったけど、概ね動いていて、とりあえずプロトタイプ実装としては成功したかなという感じだった。大体遊びでデプロイしまくってたらすぐに100デプロイくらい行った。

結局どうだったか

 僕の感想としては以下の様なものだった。

  • 社内用やテスト用途には普通に使えそう
  • 本番のwebサービスではまだまだ使えない

 例えば僕が感じた問題だけで以下の様な問題があった。

  • Dockerがまだまだ安定していない
    • commitすると前のimageが持っていたCMDやEXPOSEなどの情報が消える https://github.com/dotcloud/docker/issues/1141
    • AUFSの層を42以上作れない https://github.com/dotcloud/docker/issues/1171
      • DockerfileでRUNなどを42回以上使えない
    • Dockerを動かしているサーバのkernel processが無駄に増えていた?
    • dockerのimageをおいているストレージの容量がかなり大きくなる
    • docker-registryにpingが通らなくなる時がある(loopで何回かやってるとつながる)
  • アプリケーションレイヤーのテストを本番と同等の環境でやるのが難しい
    • 外にテスト用mysqlサーバなどがあり、それに接続するだけなら難しくない
    • Test::mysqldやTest::TCPなどを使ってテストごとにlocalにmysqldサーバを立てるとかしていると出来ない
      • 本番用imageは普通は内部にmysql-serverやmemcached-serverを持っていないため
  • リソースの最適な配置を決めてくれるツールがまだ安定していない
    • marathon, mesos, mesos-dockerなど
    • 普通にうまく動かない時があり、コードを読んでドキュメントを作ったり、軽いパッチを当ててなんとか動いたという感じ

まとめ

 まあこういうことをやってみましたという感じです。今回はとりあえずやったことと問題のリストアップだけしましたが、もうちょっと詳しく書いて欲しい要望があればなんか書きます。

詳しいエントリ書きました Docker, Mesos, Sensu等を利用したBlue-Green Deploymentの仕組み - $shibayu36->blog;