SlideShare a Scribd company logo
Submit Search
Upload
Login
Signup
PaaSの作り方 Sqaleの場合
Report
hiboma
Follow
Oct. 6, 2013
•
0 likes
•
14,094 views
1
of
55
PaaSの作り方 Sqaleの場合
Oct. 6, 2013
•
0 likes
•
14,094 views
Download Now
Download to read offline
Report
hiboma
Follow
Recommended
コンテナ情報交換会2
Masahide Yamamoto
5.6K views
•
28 slides
Walter ファミリーの紹介 at Shibuya.go#1
Gosuke Miyashita
5.2K views
•
28 slides
Docker+CoreOS+GCEで自動スケール分散レイトレ
peryaudo
15.1K views
•
14 slides
Dive into dockerネットワーク
Kazuyuki Mori
21.7K views
•
38 slides
Dockerと継続的インテグレーション
Yahoo!デベロッパーネットワーク
14.6K views
•
35 slides
Yesod on Heroku
Takahiro Himura
1.3K views
•
20 slides
More Related Content
What's hot
Openresty
ogawatti
1K views
•
41 slides
社内勉強会資料(Varnish Module)
Iwana Chan
7K views
•
35 slides
Docker Swarm入門
Masahito Zembutsu
42.7K views
•
85 slides
VagrantユーザのためのDocker入門
Masashi Shinbara
57.7K views
•
48 slides
OpenShift from Easy way to Hard ? Way
ロフト くん
1.7K views
•
29 slides
Lagopus 0.2
Masaru Oki
3.1K views
•
38 slides
What's hot
(20)
Openresty
ogawatti
•
1K views
社内勉強会資料(Varnish Module)
Iwana Chan
•
7K views
Docker Swarm入門
Masahito Zembutsu
•
42.7K views
VagrantユーザのためのDocker入門
Masashi Shinbara
•
57.7K views
OpenShift from Easy way to Hard ? Way
ロフト くん
•
1.7K views
Lagopus 0.2
Masaru Oki
•
3.1K views
Lagopus 0.2.2
Masaru Oki
•
1.1K views
第一回コンテナ情報交換会@関西
Masahide Yamamoto
•
1.8K views
serverspecを使用したサーバ設定テストの実例
Koichi Shimozono
•
1.8K views
GUI&基本操作、CLI編
Go Chiba
•
1.9K views
Hive undocumented feature
tamtam180
•
7.9K views
Building production server on docker
Hiroshi Miura
•
52 views
Building production server on docker
Hiroshi Miura
•
1.2K views
Tottoruby 20110903
Takashi SAKAGUCHI
•
805 views
ROP Illmatic: Exploring Universal ROP on glibc x86-64 (ja)
inaz2
•
6.8K views
Docker handson
koda3
•
424 views
【dots. IT勉強会】開発環境のDocker化
Yuki Kanazawa
•
8.1K views
VarnishではじめるESI
Iwana Chan
•
11.4K views
Nuxt.js + microCMS + netlify
ogawatti
•
151 views
[Container Runtime Meetup] runc & User Namespaces
Akihiro Suda
•
7.2K views
Viewers also liked
cassandra 100 node cluster admin operation
oranie Narut
8.5K views
•
112 slides
OpenVZ - Linux Containers:第2回 コンテナ型仮想化の情報交換会@東京
Kentaro Ebisawa
9.2K views
•
69 slides
Inside Sqale's Backend at Sapporo Ruby Kaigi 2012
Gosuke Miyashita
18.5K views
•
65 slides
Seastar:高スループットなサーバアプリケーションの為の新しいフレームワーク
Takuya ASADA
5K views
•
46 slides
Intel DPDK Step by Step instructions
Hisaki Ohara
56.8K views
•
12 slides
Nosqlの基礎知識(2013年7月講義資料)
CLOUDIAN KK
22.9K views
•
79 slides
Viewers also liked
(7)
cassandra 100 node cluster admin operation
oranie Narut
•
8.5K views
OpenVZ - Linux Containers:第2回 コンテナ型仮想化の情報交換会@東京
Kentaro Ebisawa
•
9.2K views
Inside Sqale's Backend at Sapporo Ruby Kaigi 2012
Gosuke Miyashita
•
18.5K views
Seastar:高スループットなサーバアプリケーションの為の新しいフレームワーク
Takuya ASADA
•
5K views
Intel DPDK Step by Step instructions
Hisaki Ohara
•
56.8K views
Nosqlの基礎知識(2013年7月講義資料)
CLOUDIAN KK
•
22.9K views
Understanding DPDK
Denys Haryachyy
•
102.1K views
Similar to PaaSの作り方 Sqaleの場合
成長を加速する minne の技術基盤戦略
Hiroshi SHIBATA
9.4K views
•
40 slides
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
Ryo Nakamaru
30.6K views
•
119 slides
Cloudstack user group meeting in osaka
Naotaka Jay HOTTA
948 views
•
39 slides
Lxc on cloud
Yukihiko SAWANOBORI
1.5K views
•
25 slides
Node予備校 vol.1 名古屋
Mori Shingo
2.9K views
•
46 slides
恋に落ちるデプロイツール
totty jp
5.1K views
•
49 slides
Similar to PaaSの作り方 Sqaleの場合
(20)
成長を加速する minne の技術基盤戦略
Hiroshi SHIBATA
•
9.4K views
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
Ryo Nakamaru
•
30.6K views
Cloudstack user group meeting in osaka
Naotaka Jay HOTTA
•
948 views
Lxc on cloud
Yukihiko SAWANOBORI
•
1.5K views
Node予備校 vol.1 名古屋
Mori Shingo
•
2.9K views
恋に落ちるデプロイツール
totty jp
•
5.1K views
Dockerイメージ構築 実践テクニック
Emma Haruka Iwao
•
23K views
RoRとAWSで100,000Req/Minを処理する
aktsk
•
8.7K views
Web Operations and Perl kansai.pm#14
Masahiro Nagano
•
2.1K views
いまさら聞けないDocker - 第5回コンテナ型仮想化の情報交換会@大阪
Kunihiro TANAKA
•
14.3K views
How to use Ceph RBD as CloudStack Primary Storage
Kimihiko Kitase
•
5.4K views
Circle ci and docker+serverspec
Tsuyoshi Yamada
•
8.1K views
20120423 hbase勉強会
Toshiaki Toyama
•
2.8K views
OpenStack + Common Lisp
irix_jp
•
4.6K views
Hadoop on LXC
俊夫 森
•
3.4K views
Seastar in 歌舞伎座.tech#8「C++初心者会」
Takuya ASADA
•
7.8K views
No SSH (@nojima; KMC関東例会)
京大 マイコンクラブ
•
2K views
今日から使い始めるChef
Masahiro NAKAYAMA
•
7.6K views
マイクロサービス時代の生存戦略 with HashiCorp
Masahito Zembutsu
•
5.8K views
FluentdとRedshiftの素敵な関係
moai kids
•
5.7K views
PaaSの作り方 Sqaleの場合
1.
PaaSの作り方 Sqaleの場合 @hiboma paperboy&co. 1
2.
• 名前 • 伊藤洋也
(いとう ひろや) • 所属 • 株式会社 paperboy&co. 6年目 • 技術基盤チーム • いろいろやる人 • 新卒研修の面倒見 etc @hiboma 2
3.
3
4.
• Perl, Ruby,
PHP • Apache, Nginx, MySQL, ... • C ( ミドルウェア ... Apache 成分多い) • トラブル調査などで触れてます • カーネル周りは拾い読み • 開発はさっぱりできません !!! 業務 4
5.
• ゲーム厨の兄がいます @hiboma 5
6.
ブログ http://d.hatena.ne.jp/hiboma 6
7.
ひゃっはー !!! 7
8.
アジェンダ • LXCを使ったPaaSの作り方 :
Sqale の場合 • サービスの概要 • コンテナの構築 • HTTP, SSHのルーティング • Sqaleで遭遇したカーネルのバグ話 • Xenのバグ • cgroupのバグ 8
9.
LXCを使ったPaaSの作り方 Sqale の場合 9
10.
PaaS? • Platform as
a Service 何を持って 「PaaS」を定義するか各論あるかと思いますが ... • 本トークでは 「git pushしたらRuby on Railsがいい感じに動いてくれる」 「でもミドルウェアの管理はわからんのでお任せしたい」 「 heroku っぽいの」 といった意味でお話します ... 10
11.
Sqale 11
12.
12
13.
13
14.
14
15.
15
16.
environment • Sqale は
AWSを全面利用しています • EC2 • EBS (ユーザ領域、Git等のストレージ) • Route53 (ドメイン管理) • ELB ( HTTP,SSHDのリバースプロキシの前段, SSL) • RDS (共有MySQL) 16
17.
ホストOS • EC2 Amazon
Linux • CentOS6, SL6 相当 * Q. Ubuntuとか使わないの? A. RedHat系の運用に長けた人が多いので • いろいろ大変 !!! • Patched Kernel • grsecurity patch • restrcit bind(2) patch ( mizzy ) • fork bomb patch ( mizzy ) * 厳密な意味では全然違うと思いますが ... 17
18.
EC2を利用 • EC2インスタンス内に LXC
をいっぱい生やす • Ruby環境のコンテナ • PHP環境のコンテナ * 厳密な意味では全然違うと思いますが ... 18
19.
Rubyコンテナ • Nginx +
Ruby(Rackアプリ)を動かせるLXC環境 • Ruby 1.9.3 ∼ 2.0.0 の最新パッチレベルを提供 • supervisord で Nginx と Rackアプリを監視 • SSH, Cron 使用可 • デプロイすると bundle install, assets:precompile などを 自動で行い Rackアプリを再起動する 19
20.
Rubyコンテナ • Nginx は
port 8000 + n で listen(2) • sshd は port 2000 + n で listen(2) • n は コンテナごとに一意の数値 • network namespace は使用していない • コンテナ内で TCP port の bind(2) を制限するパッチ当てた 20
21.
PHPコンテナ • Apache2.4 +
phpfpm を動かせるLXC環境 • 5.3, 5.4 系を提供 • supervisord で Apache と php-fpm を監視 • SSH, Cron 使用可 21
22.
rootfs • コンテナ用のファイルツリーを rootfs
と呼んでいます • 全てのコンテナで mount するディレクトリツリー 22
23.
$ sudo yum
--releasever=$ver --installroot=/var/rootfs/$role/ groupinstall Base rootfs の構築 • Ruby, PHP それぞれ用の rootfs ( chroot 環境) を作る 1. yum --installroot でベースを作る 2. ruby や chef-solo も入れる 3. chroot して chef-solo でペチペチして構築 ・Nginx とか Apache とか Ruby, PHP をいれてく • 構築時に lxc のテンプレートは使ってない • お手本として何度も参照しました :) 23
24.
rootfs • rootfs を
lxc-start 起動時に '/' として mount --bind (ro) 更に ユーザ領域 (EBS) を mount --bind • ユーザ領域以外は read only ( errno is EROFS) 24
25.
rootfsの共有 • pros: 管理の一元化 ディスクスペースの節約 • cons: 個別カスタマイズの自由度は低い 25
26.
コンテナ作成 26
27.
コンテナ作成 • lxc-start の設定ファイル作成、起動 •
ユーザ領域のディレクトリの作成 • 監視設定の更新 など • Resque + chef-solo app (Rails) Redis https://sqale.jp/projects/new からアプリ作成 Redis に job を enqueue する Resque dequeue enqueue Resque が job を dequeue chef-solo で LXCの設定をセットアップして lxc-start を起動する chef-solo 27
28.
UIDの統一 • アプリ実行ユーザは全てのLXCで sqale
(uid:1000) で統一 28
29.
UIDの統一: プロセス数制限 • Q.
uid が統一されている。 プロセス数上限 どうする? setrlimit(2) の RLIMIT_NPROC はシステムワイドで 各コンテナごとに sqaleユーザ(uid:1000) がいる • A. id:mizzy の cgroup form bomb パッチで対応 uid:1000 の RLIMIT_NPROC は上限まであげとく 29
30.
UIDの統一 : クォータ •
Q. uid が統一されている。 uidベースのディスククォータ使えないけどどうする? • A. XFS のプロジェクトクォータで解決 ディレクトリ単位でクォータを設定可能 /var/sqale/<ユーザ名>/<アプリ名>/<id> 30
31.
リソース制限 • Q. コンテナの
CPU, メモリのリソース制限は? • A. cgroup.cpuset, cgroup.memory で基本通り • lxc-start の設定ファイルに記述 • 動的に変更する運用は(まだ)していない 31
32.
lxc-start の監視 • lxc-start
は monit で監視 lxc-start がバグで止まったことは今ん所観測して無い :) • ごく初期に supervisord で監視してたが ... supervisord を停止すると lxc-start が orphaned になって厄介なので monit にした 32
33.
ルーティング • コンテナを作って次に考えないといけないこと • ドメイン管理どうする? •
HTTP, SSH, Git ( over SSH) でどうアクセスさせる? • ロードバランサやリバースプロキシを介してアクセスさせたい • HTTP Reverse Proxy • SSH Reverse Proxy 33
34.
ドメイン管理 • Route53で sqale.jp
ドメインを管理 • CNAME を ELB に向けている • • コンテナ作成/破棄のタイミングで Route53 の API を叩く ELB Proxy CNAME: ruby-hiboma.sqale.jp ruby-hiboma.sqale.jp. 0 IN CNAME proxy-lb001-******.ap-northeast-1.elb.amazonaws.com. Route53 HTTP DNS 34
35.
HTTPのルーティング • HTTPのリバースプロキシどうしよう • うーん
Nginx ? ELB Nginx 35
36.
HTTPのルーティング • Q. リバースプロキシ(upstream)設定をどう管理する
? • 都度設定ファイル足す? • コンテナが増える/削除する度に? • 設定のリロード大変そう • プロキシが複数いたら atomic な変更できない • DBとの不整合出たらやだなー ... 心配種は尽きない ELB Nginx 36
37.
HTTPのルーティング • Q. リバースプロキシ先をどう設定する
? • いい感じに扱いたい • Nginx に DB, KVS を参照させて解決したい • そこで Lua ですよ ! • ( or ngx_mruby ! ) 37
38.
HTTPのルーティング 実装 • OpenResty
(aka. ngx_openresty) • 便利モジュールが詰め込まれた Nginx • 継続的にリリースされてて安心++ 38
39.
HTTPのルーティング 実装 • Redis,
MySQL, memcached と連携できる • Lua で upstream (プロキシ設定) をいじれる 39
40.
HTTPの動的ルーティング Redis ELB Nginx + Lua CNAME: ruby-hiboma.sqale.jp Hostヘッダ (CNAME)
内部ホスト ruby-hiboma.sqale.jp users001.sqale.lan:8000 php-sushi.sqale.jp users002.sqale.lan:8100 users001.sqale.lan:8001 Hostヘッダ(CNAME) を Redis に投げて 内部ホストに変換 CNAME を ELB に向けてる (Route53管理) ① ② ③ ④ 40
41.
HTTPの動的ルーティング http { server { listen
8888; server_name localhost; location / { set $upstream ""; rewrite_by_lua ' local res = ngx.location.capture("/redis") if res.status == ngx.HTTP_OK then ngx.var.upstream = res.body else ngx.exit(ngx.HTTP_FORBIDDEN) end '; proxy_pass http://$upstream; } # HostヘッダをキーにしてRedisに問い合わせ location /redis { internal; set $redis_key $host; redis_pass 127.0.0.1:6379; default_type text/html; } } location / { set $upstream ""; rewrite_by_lua ' local res = ngx.location.capture("/redis") if res.status == ngx.HTTP_OK then ngx.var.upstream = res.body else ngx.exit(ngx.HTTP_FORBIDDEN) end '; proxy_pass http://$upstream; } # HostヘッダをキーにしてRedisに問い合わせ location /redis { internal; set $redis_key $host; redis_pass 127.0.0.1:6379; default_type text/html; } 41
42.
HTTPのルーティング 実装 42
43.
SSH Router の実装 •
Q. SSHのリバースプロキシ、どうしよう ... • A. OpenSSH にパッチ • "AuthorizedKeysScript" を追加 • 公開 認証を任意のスクリプトに委譲できる • 公開 をDBで照合 => 接続ユーザと収容コンテナを判別 43
44.
SSHのルーティング ELB SSH Router Patched OpenSSH SSH Git SFTP Git Server File server DB
(MySQL) 公開 認証 ・ユーザが登録した公開 と照合する ・収容されているコンテナを問い合わせる SSH Git SFTP Git SFTP SSH ① ② ③ ④ 44
45.
git push のルーティング ELB SSH Router Patched OpenSSH git
push Build Server Git Server DB (MySQL) ... ... ① ② ③ ④ bundle install assets:precompile etc ... git の hook スクリプト でキューにjob追加 git clone rsync Rackアプリの再起動 45
46.
独自ドメインSSL • 1SSLごとにELBを割り当て • SSL証明書をアップロードしてもらいELBにアタッチ Redis ELB Nginx + Lua ELB 独自ドメイン HTTPS +SSL HTTP 46
47.
今日の発表の技術的な詳細 http://slidesha.re/R4Kjjo 47
48.
Sqaleで遭遇した カーネルのバグ話 48
49.
バグその1 • リリース後に悩まされたバグ • 現象 •
稀にホストダウン • oops メッセージ取れてない • 特定のコンテナが OOM Killer を連発していた • 再現 • コンテナで OOM を連続させることで稀に再現 • EC2インスタンスでのみ再現 • 社内のKVMの開発環境だと再現しない • カーネルのバージョンをいろいろ変えてやっと oops 取れた 49
50.
Jun 26 20:14:48
users900 kernel: [71494876.304224] ------------[ cut here ]------------ Jun 26 20:14:48 users900 kernel: [71494876.304225] kernel BUG at drivers/tty/hvc/hvc_xen.c:101! Jun 26 20:14:48 users900 kernel: [71494876.304227] invalid opcode: 0000 [#1] SMP Jun 26 20:14:48 users900 kernel: [71494876.304381] Modules linked in: ipv6 binfmt_misc xfs libcrc32c dm_mirror dm_region_hash dm_log dm_mod crc32c_intel pcspkr microcode ext4 jbd2 mbcache crc16 Jun 26 20:14:48 users900 kernel: [71494876.304384] CPU 0 Jun 26 20:14:48 users900 kernel: [71494876.304384] CPU 0 Jun 26 20:14:48 users900 kernel: [71494876.304385] Pid: 7746, comm: perl Not tainted 3.9.7 #2 Jun 26 20:14:48 users900 kernel: [71494876.304389] RIP: e030:[<ffffffff81285bac>] [<ffffffff81285bac>] domU_write_console +0x13c/0x180 Jun 26 20:14:48 users900 kernel: [71494876.304390] RSP: e02b:ffff8808502f9898 EFLAGS: 00010002 Jun 26 20:14:48 users900 kernel: [71494876.304391] RAX: 00000000004a62c6 RBX: 0000000000000000 RCX: 0000000000000010 Jun 26 20:14:48 users900 kernel: [71494876.304392] RDX: 0000000000000823 RSI: 0000000000000000 RDI: 0000000000000000 Jun 26 20:14:48 users900 kernel: [71494876.304393] RBP: ffff8808502f98e8 R08: ffff8800076fc000 R09: 00000000004a5aa3 Jun 26 20:14:48 users900 kernel: [71494876.304393] R10: 0000000000000000 R11: 00000000000061df R12: 0000000000000010 Jun 26 20:14:48 users900 kernel: [71494876.304394] R13: 0000000000000000 R14: ffff8808502f9910 R15: ffff88085fc09000 Jun 26 20:14:48 users900 kernel: [71494876.304398] FS: 00007fecd7312720(0000) GS:ffff880887000000(0000) knlGS:0000000000000000 Jun 26 20:14:48 users900 kernel: [71494876.304399] CS: e033 DS: 0000 ES: 0000 CR0: 000000008005003b Jun 26 20:14:48 users900 kernel: [71494876.304400] CR2: 00007fecb1e15000 CR3: 000000084edf0000 CR4: 0000000000002660 Jun 26 20:14:48 users900 kernel: [71494876.304400] CR2: 00007fecb1e15000 CR3: 000000084edf0000 CR4: 0000000000002660 Jun 26 20:14:48 users900 kernel: [71494876.304401] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 Jun 26 20:14:48 users900 kernel: [71494876.304402] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 Jun 26 20:14:48 users900 kernel: [71494876.304403] Process perl (pid: 7746, threadinfo ffff8808502f8000, task ffff88084f1016d0) Jun 26 20:14:48 users900 kernel: [71494876.304403] Process perl (pid: 7746, threadinfo ffff8808502f8000, task ffff88084f1016d0) Jun 26 20:14:48 users900 kernel: [71494876.304403] Stack: Jun 26 20:14:48 users900 kernel: [71494876.304405] ffff8808502f98e8 ffff8808502f98a8 0000000000000007 000000020000000a Jun 26 20:14:48 users900 kernel: [71494876.304406] 000000000442ecdc 0000000000000010 000000000000003c 0000000000000020 Jun 26 20:14:48 users900 kernel: [71494876.304407] 0000000000000000 ffffffff817cd1e0 ffff8808502f9958 ffffffff8128437c Jun 26 20:14:48 users900 kernel: [71494876.304408] Call Trace: Jun 26 20:14:48 users900 kernel: [71494876.304410] [<ffffffff8128437c>] hvc_console_print+0xdc/0x130 Jun 26 20:14:48 users900 kernel: [71494876.304414] [<ffffffff81044683>] call_console_drivers.constprop.10+0x93/0xb0 Jun 26 20:14:48 users900 kernel: [71494876.304416] [<ffffffff8104548d>] console_unlock+0x1fd/0x3e0 Jun 26 20:14:48 users900 kernel: [71494876.304416] [<ffffffff8104548d>] console_unlock+0x1fd/0x3e0 Jun 26 20:14:48 users900 kernel: [71494876.304418] [<ffffffff81045ad5>] vprintk_emit+0x245/0x480 Jun 26 20:14:48 users900 kernel: [71494876.304420] [<ffffffff810da519>] ? find_lock_task_mm+0x29/0x70 Jun 26 20:14:48 users900 kernel: [71494876.304422] [<ffffffff813bae75>] printk+0x5c/0x5e Jun 26 20:14:48 users900 kernel: [71494876.304423] [<ffffffff813bbd78>] dump_header+0x18d/0x1ce Jun 26 20:14:48 users900 kernel: [71494876.304425] [<ffffffff810da906>] oom_kill_process+0x1b6/0x320 Jun 26 20:14:48 users900 kernel: [71494876.304427] [<ffffffff8111eeb1>] ? mem_cgroup_iter+0x1a1/0x1f0 Jun 26 20:14:48 users900 kernel: [71494876.304429] [<ffffffff8104e630>] ? has_ns_capability_noaudit+0x10/0x20 Jun 26 20:14:48 users900 kernel: [71494876.304430] [<ffffffff811216b6>] __mem_cgroup_try_charge+0xb16/0xb40 Jun 26 20:14:48 users900 kernel: [71494876.304432] [<ffffffff81121c40>] ? mem_cgroup_charge_common+0x60/0x60 Jun 26 20:14:48 users900 kernel: [71494876.304434] [<ffffffff81121c12>] mem_cgroup_charge_common+0x32/0x60 Jun 26 20:14:48 users900 kernel: [71494876.304435] [<ffffffff81123372>] mem_cgroup_newpage_charge+0x22/0x30 Jun 26 20:14:48 users900 kernel: [71494876.304437] [<ffffffff810f8124>] handle_pte_fault+0x6c4/0xa10 Jun 26 20:14:48 users900 kernel: [71494876.304439] [<ffffffff81007373>] ? pte_mfn_to_pfn+0x93/0x110 Jun 26 20:14:48 users900 kernel: [71494876.304440] [<ffffffff81004859>] ? __raw_callee_save_xen_pmd_val+0x11/0x1e 50
51.
バグその1 • Xenのttyドライバ?のバグぽい • workaround •
klogctl(2) で コンソールへの printk を無効にすることで回避 • OOMを連発させる負荷テスト必須 /* 6 -- コンソールへの printk を無効にする */ klogctl(6, NULL, 0); 51
52.
バグその2 52
53.
バグその2 53
54.
バグその2 54
55.
終わり 55