51
田中諒介 / GMO Pepabo, Inc. 2017.09.07 GMO HosCon 10 ロリポップ!マネージドクラウド FastContainerの裏側

ロリポップ!マネージドクラウド FastContainerの裏側

  • Upload
    -

  • View
    647

  • Download
    1

Embed Size (px)

Citation preview

Page 1: ロリポップ!マネージドクラウド FastContainerの裏側

田中諒介 / GMO Pepabo, Inc.

2017.09.07 GMO HosCon 10

ロリポップ!マネージドクラウドFastContainerの裏側

Page 2: ロリポップ!マネージドクラウド FastContainerの裏側

エンジニア

田中諒介 @ry_023

ホスティング事業部インフラチー

2016年3月熊本大学大学院情報電気電子工学専攻修了

同年4月 GMOペパボに新卒エンジニアとして入社

2017年1月からインフラチーム配属

Page 3: ロリポップ!マネージドクラウド FastContainerの裏側

目次

• 1. ロリポップ!マネージドクラウドについて

• 2. FastContainerとは?

• 3. マネクラの構成を通して解説

•リクエスト制御フロー、コンテナ停止、オートスケール

• 4. 統括・FastContainerの良さふりかえり

Page 4: ロリポップ!マネージドクラウド FastContainerの裏側

ペパボのホスティングサービス

Page 5: ロリポップ!マネージドクラウド FastContainerの裏側

ロリポップ!の新プラン

αテスト実施中!

Page 6: ロリポップ!マネージドクラウド FastContainerの裏側

一般的なWebホスティング

•ユーザのコンテンツ・プロセスが特定のサーバに紐づく

•負荷分散の難しさ…

•急なアクセス増へのスケールの難しさ…

•他サーバへの移行の難しさ…

Page 7: ロリポップ!マネージドクラウド FastContainerの裏側

ロリポップ!マネージドクラウド

•ロリポのプランの一つだが、バックエンド・フロントエンド共に一新

•コンテナ型ホスティングサービス

• FastContainerアーキテクチャを採用

•コンテナエンジンにhaconiwa

Page 8: ロリポップ!マネージドクラウド FastContainerの裏側

ロリポップ!マネージドクラウド

オートスケールで

急なアクセスにも対応

自動で最新の

セキュリティ

様々なWebアプリを

すぐに開始

Page 9: ロリポップ!マネージドクラウド FastContainerの裏側

使いたいアプリ選んで プロジェクト名入力するだけ できる!

すぐにWebアプリを提供!

Page 10: ロリポップ!マネージドクラウド FastContainerの裏側

すぐにWebアプリを提供!

Page 11: ロリポップ!マネージドクラウド FastContainerの裏側

オートスケール

アクセスが増えると

複数台のコンテナでアクセスを受ける

オートスケールを有効に

Page 12: ロリポップ!マネージドクラウド FastContainerの裏側

今日はロリポ!マネクラがどういうように動いているか

というお話を

Page 13: ロリポップ!マネージドクラウド FastContainerの裏側

FastContainer

Page 14: ロリポップ!マネージドクラウド FastContainerの裏側

FastContainerとは? ざっくり概要

• FastCGIのコンテナ版といったイメージ

• CGIのプロセスを終了せずに使い回す

•リクエスト契機でWebアプリのコンテナが起動

•一度起動したコンテナはその後使い回す

•一定時間経過すると自ら停止する

Page 15: ロリポップ!マネージドクラウド FastContainerの裏側

FastContainerの良さ

•オートスケール

•リクエストがないとコンテナは停止するのでリソースの節約

•色んなコンテナを用意することで色々なアプリを提供

•生まれ代わり続けるので常に最新

•他ホストへのコンテナ載せ替えも簡単

•負荷が少ないホストにコンテナを起動させるようにする等も

• compute母艦の無停止メンテもできそう

Page 16: ロリポップ!マネージドクラウド FastContainerの裏側

ロリポの構成を通してFastContainerを見ていきます

Page 17: ロリポップ!マネージドクラウド FastContainerの裏側

マネージドクラウド全体構成

Page 18: ロリポップ!マネージドクラウド FastContainerの裏側

compute1

CMDBCoreAPI

LBClient

datapool

container1

compute2

nfs

nfscontainer2

container1 status:

enabled

host: compute1

container2 status:

enabled

host: compute2

コンテナの情報

Webproxy

実際コンテナが起動するホスト

コンテナの情報を管理→

FastContainer関連の構成

ユーザの

コンテンツ(/var/www/ 配下)

Page 19: ロリポップ!マネージドクラウド FastContainerの裏側

ngx_mruby

•弊社@matsumotory開発 nginx拡張 (mod_mrubyもあります)

• Nginxの各イベントにhookしてmrubyを実行できる

•ロリポ!マネージドクラウドではプロキシ時にCoreAPIに問い合わせ

たり、haconiwaを実行したりするのに活用

location / {

...

mruby_set $backend /var/lib/mruby/hook.rb cache; # script実行

proxy_pass http://$backend:80;

}

Page 20: ロリポップ!マネージドクラウド FastContainerの裏側

haconiwa

•弊社@udzura開発コンテナエンジン

• mrubyのDSLで設定(hacofile)を記述可能

•コンテナのリソース制限も(cgroupによる制限)

Haconiwa.define do |config|

config.chroot_to Pathname.new("/var/lib/haconiwa/rootfs/php")

...

config.cgroup["cpu.cfs_period_us"] = 1000000 # cpu使用率を制限(20%)

config.cgroup["cpu.cfs_quota_us"] = 200000 #

config.cgroup["pids.max"] = 128 # プロセス数を制限

end

Page 21: ロリポップ!マネージドクラウド FastContainerの裏側

マネクラのコンテナ

• haconiwaにより起動, hacofileで設定

•コンテナ種別毎に母艦(compute)上にrootfsを用意してsymlink

• container:/ → compute:/var/lib/haconiwa/rootfs/php/

• /var/www などのユーザ領域はdatapoolをmount

• initプロセスにミドルウェアを指定して起動

•アプリ種別ごとにhacofileを用意することで色んなコンテナ作れる

Page 22: ロリポップ!マネージドクラウド FastContainerの裏側

なんでもコンテナ

•基本は1コンテナに1プロセス

• apacheコンテナ

• sshdコンテナ

• postfixコンテナ?

Page 23: ロリポップ!マネージドクラウド FastContainerの裏側

FastContainerリクエスト制御のフロー

Page 24: ロリポップ!マネージドクラウド FastContainerの裏側

compute1

CMDBCoreAPI

LBClient

datapool

compute2

nfs

nfs

container1 status:

ready

host: compute1

コンテナの情報

Webproxy

プロジェクト開始直後

ready=待機中

Page 25: ロリポップ!マネージドクラウド FastContainerの裏側

compute1 datapool

compute2

nfs

nfs

コンテナの情報

プロジェクト開始直後

container1 status:

booting

host: compute1

CoreAPI

LBClient Webproxy

CMDB

プロキシ可能な

コンテナ情報を取得

クライアントから

リクエスト

Page 26: ロリポップ!マネージドクラウド FastContainerの裏側

compute1

CMDBCoreAPI

LBClient

datapool

compute2

nfs

nfs

container1 status:

booting

host: compute1

コンテナの情報

プロジェクト開始直後

クライアントから

リクエスト

コンテナのIP等を

ヘッダに負荷しプロキシ

Webproxy

Page 27: ロリポップ!マネージドクラウド FastContainerの裏側

compute1

CMDBCoreAPI

LBClient

datapool

compute2

nfs

nfs

container1 status:

booting

host: compute1

コンテナの情報

Webproxy

プロジェクト開始直後

クライアントから

リクエスト

コンテナのIP等を

ヘッダに負荷しプロキシ

目的のコンテナのIP:80が

LISTENしてない

Page 28: ロリポップ!マネージドクラウド FastContainerの裏側

compute1

CMDBCoreAPI

LBClient

datapool

compute2

nfs

nfs

コンテナの情報

Webproxy

プロジェクト開始直後

クライアントから

リクエスト

container1

コンテナ起動!!

container1 status:

enabled

host: compute1

enabled=稼働中

Page 29: ロリポップ!マネージドクラウド FastContainerの裏側

container1 status:

enabled

host: compute1

compute1

CMDBCoreAPI

LBClient

datapool

compute2

nfs

nfs

コンテナの情報

Webproxy

プロジェクト開始直後

クライアントから

リクエスト

container1

コンテナ起動!!

enabled=稼働中

Page 30: ロリポップ!マネージドクラウド FastContainerの裏側

compute1

CMDBCoreAPI

LBClient

datapool

compute2

nfs

nfs

container1 status:

enabled

host: compute1

コンテナの情報

Webproxy

プロジェクト開始直後

container1

2回目以降のリクエストは

コンテナ起動済みなので高速

Page 31: ロリポップ!マネージドクラウド FastContainerの裏側

コンテナの死

Page 32: ロリポップ!マネージドクラウド FastContainerの裏側

コンテナの寿命

•コンテナにはLifetimeが設定されており、一定時間経過で自動停止

• haconiwa のhookでコンテナのプロセスをKILL

•利用中のコンテナが停止する際はコンテナを待機中として登録し直す

•次のリクエストでまた新しいコンテナが起動する

Page 33: ロリポップ!マネージドクラウド FastContainerの裏側

compute1

CMDBCoreAPI

datapool

compute2

nfs

nfs

container1 status:

enabled

host: compute1

コンテナの情報

コンテナの寿命

\寿命きた/

container1

Page 34: ロリポップ!マネージドクラウド FastContainerの裏側

compute1

CMDBCoreAPI

datapool

compute2

nfs

nfs

container2 status:

ready

host: compute1

コンテナの情報

コンテナの寿命

待機中(ready)

コンテナを再登録

HALT

Page 35: ロリポップ!マネージドクラウド FastContainerの裏側

compute1

CMDBCoreAPI

datapool

compute2

nfs

nfs

container2 status:

enabled

host: compute1

コンテナの情報

コンテナの寿命

LBClient Webproxy

リクエスト契機で

新しいコンテナ起動

container2

Page 36: ロリポップ!マネージドクラウド FastContainerの裏側

コンテナに寿命があることで…

•リクエストがないコンテナは勝手に停止し、リソースを食わずエコ!

•定期的にコンテナが新しく生まれ変わる

•新しくなるタイミングでライブラリ等も更新されセキュア

•コンテナを別ホストに移行したい時もCMDBをいじるだけでOK

•コンテナは明示的に停止させずとも勝手に死ぬ

• compute(コンテナの母艦)のメンテしたい時も簡単

Page 37: ロリポップ!マネージドクラウド FastContainerの裏側

オートスケール

Page 38: ロリポップ!マネージドクラウド FastContainerの裏側

オートスケール

•コンテナの負荷に応じて、コンテナ数を増減

• haconiwa がcgroupから各コンテナのcpu・i/o負荷を計測・監視

•ユーザはコンテナの予約枠を設定可能

•コンテナが何台まで起動するか、それぞれのコンテナでリソースを

どれぐらい使うかなど事前に決定しておく

Page 39: ロリポップ!マネージドクラウド FastContainerの裏側

compute1

CMDBCoreAPI

datapool

compute2

nfs

nfs

container1 status:

enabled

host: compute1

コンテナの情報

スケールアウト

container1

container2 status:

disabled

host: compute1

予約枠を登録

Page 40: ロリポップ!マネージドクラウド FastContainerの裏側

compute1

CMDBCoreAPI

datapool

compute2

nfs

nfs

container1 status:

enabled

host: compute1

コンテナの情報

スケールアウト

container1

container2 status:

disabled

host: compute1

予約枠を登録

\負荷やばい/

コンテナ増やして!

Page 41: ロリポップ!マネージドクラウド FastContainerの裏側

compute1

CMDBCoreAPI

datapool

compute2

nfs

nfs

container1 status:

enabled

host: compute1

コンテナの情報

スケールアウト

container1

待機コンテナに

変更container2

status: ready

host: compute1

LBClient Webproxy

リクエスト契機で

新しいコンテナ起動

container2

Page 42: ロリポップ!マネージドクラウド FastContainerの裏側

compute1

CMDBCoreAPI

datapool

compute2

nfs

nfs

container1 status:

enabled

host: compute1

コンテナの情報

スケールイン

container1

container2

status: ready

host: compute1

container2

\さほどでもない/

コンテナ減らして!

Page 43: ロリポップ!マネージドクラウド FastContainerの裏側

compute1

CMDBCoreAPI

datapool

compute2

nfs

nfs

container1 status:

enabled

host: compute1

コンテナの情報

スケールイン

container1

container2

\さほどでもない/

コンテナ減らして!

container2 status:

disabled

host: compute1

再びdisabledへ

Page 44: ロリポップ!マネージドクラウド FastContainerの裏側

compute1

CMDBCoreAPI

datapool

compute2

nfs

nfs

container1 status:

enabled

host: compute1

コンテナの情報

スケールイン

container1

container2

container2 status:

disabled

host: compute1

LBClient Webproxy

container2には

ルーティングされない

Page 45: ロリポップ!マネージドクラウド FastContainerの裏側

compute1

CMDBCoreAPI

datapool

compute2

nfs

nfs

container1 status:

enabled

host: compute1

コンテナの情報

スケールイン

container1

container2

container2 status:

disabled

host: compute1

LBClient Webproxy

container2には

ルーティングされない

これは放っておけば

勝手に停止する

Page 46: ロリポップ!マネージドクラウド FastContainerの裏側

予約枠をとるだけでオートスケール

Page 47: ロリポップ!マネージドクラウド FastContainerの裏側

FastContainerの良さ

•オートスケール

•リクエストがないとコンテナは停止するのでリソースの節約

•色んなコンテナを用意することで色々なアプリを提供

•生まれ代わり続けるので常に最新

•他ホストへのコンテナ載せ替えも簡単

•負荷が少ないホストにコンテナを起動させるようにする等も

• compute母艦の無停止メンテもできそう

Page 48: ロリポップ!マネージドクラウド FastContainerの裏側

コンテナの種類も増やしていきたい

Page 49: ロリポップ!マネージドクラウド FastContainerの裏側

アプリの調整など進捗

αで提供中!

調整中! 間もなく

その他続々……?

Page 50: ロリポップ!マネージドクラウド FastContainerの裏側

ロリポ!マネージドクラウドをよろしくお願いします!

Page 51: ロリポップ!マネージドクラウド FastContainerの裏側

君もペパボで働かないか?

最新の採用情報をチェック→ @pb_recruit