cloud foundryは何故動くのか

96
Cloud Foundry は、なぜ動くのか

Upload: kazuto-kusama

Post on 24-May-2015

4.119 views

Category:

Technology


1 download

DESCRIPTION

第18回 Cloud Foundry輪読会で発表した資料です

TRANSCRIPT

Page 1: Cloud Foundryは何故動くのか

Cloud Foundryは、なぜ動くのか

Page 2: Cloud Foundryは何故動くのか

@jacopen Kazuto KusamaNTT Communications !Cloudn PaaSの開発・運用をやっています

Page 3: Cloud Foundryは何故動くのか

最近

Page 4: Cloud Foundryは何故動くのか
Page 5: Cloud Foundryは何故動くのか
Page 6: Cloud Foundryは何故動くのか

質問

Page 7: Cloud Foundryは何故動くのか

はじめに

今回の発表、元々は !• Cloud Foundryのアーキテクチャ概要に軽く触れる • V2で変わったところを中心に、少し深く追ってみる

!

という予定でした

Page 8: Cloud Foundryは何故動くのか

Open Cloud Summit Japan とかで喋りました

Page 9: Cloud Foundryは何故動くのか

が、概要説明だけで100スライド近くになったので、今回は深追いするのは諦めました。 !

なので、かなり入門者向けの内容になっています。 !

深追いはまた次回!

Page 10: Cloud Foundryは何故動くのか

Cloud FoundryにSinatraアプリをデプロイ

$ lsGemfile README.md dora.rb instances.rb logging_service.rb spec stress_testers.rbGemfile.lock config.ru get_instance_cookie_jars.sh log_utils.rb scripts stress vendor!

https://github.com/cloudfoundry/cf-acceptance-tests/tree/master/assets/dora

Page 11: Cloud Foundryは何故動くのか

[23:08] jacopen@cape ~/Project/dora ✘╹◡╹✘ (master) cf push doraCreating app dora in org jacopen / space jacopen-space as admin...OK!Creating route dora.107.22.72.200.xip.io...OK!Binding dora.107.22.72.200.xip.io to dora...OK!Uploading dora...Uploading from: /Users/jacopen/Project/dora1.2M, 36 filesOK!Starting app dora in org jacopen / space jacopen-space as admin...OK(中略)1 of 1 instances running!App started!Showing health and status for app dora in org jacopen / space jacopen-space as admin...OK!requested state: startedinstances: 1/1usage: 256M x 1 instancesurls: dora.107.22.72.200.xip.io! state since cpu memory disk#0 running 2014-04-21 11:09:25 PM 0.0% 72.2M of 256M 0 of 1G

Page 12: Cloud Foundryは何故動くのか

ok![23:09] jacopen@cape ~/Project/dora ✘╹◡╹✘ (master) cf appsGetting apps in org jacopen / space jacopen-space as admin...OK!name requested state instances memory disk urlsdora started 1/1 256M 1G dora.107.22.72.200.xip.io

Page 13: Cloud Foundryは何故動くのか

cf push

Page 14: Cloud Foundryは何故動くのか

この間、CF内では何が行われていたのか?

Page 15: Cloud Foundryは何故動くのか

CFというブラックボックスの謎を解こう

Page 16: Cloud Foundryは何故動くのか

アジェンダ

Cloud Foundryの仕組みを理解するための3章立て !• Cloud Foundryを外から叩いて、中身を推測する • Cloud Foundryの各コンポーネントの役割を知る • Cloud Foundryのコンポーネント間通信を知る

Page 17: Cloud Foundryは何故動くのか

今回やらないこと!

• WardenコンテナやBuildpackなどの解説

• MySQLやPostgresなどのService系の解説

• loggregatorなどの、周辺サービスの解説

Page 18: Cloud Foundryは何故動くのか

では始めましょう

Page 19: Cloud Foundryは何故動くのか

Cloud Foundryを

外から叩いて 中身を推測しよう1

Page 20: Cloud Foundryは何故動くのか

CF_TRACE=true[23:49] jacopen@cape ~/Project/dora ✘╹◡╹✘ export CF_TRACE=true[23:49] jacopen@cape ~/Project/dora ✘╹◡╹✘ cf push dora!REQUEST:GET /v2/spaces/dbf6ed0a-3108-45d8-9c78-a512d5071358/apps?q=name%3Adora&inline-relations-depth=1 HTTP/1.1Host: api.107.22.72.200.xip.ioAccept: application/jsonAuthorization: [PRIVATE DATA HIDDEN]Content-Type: application/jsonUser-Agent: go-cli 6.0.0-90db382 / darwin!!!RESPONSE:HTTP/1.1 200 OKContent-Length: 107Content-Type: application/json;charset=utf-8Date: Mon, 21 Apr 2014 14:49:13 GMTServer: nginxX-Content-Type-Options: nosniffX-Vcap-Request-Id: 18dcd4aefdd000506e49c4b5cf739aaa::65195823-dac9-410a-855a-4ef5ba249198!{ "total_results": 0, "total_pages": 0, "prev_url": null, "next_url": null, "resources": [! ]}Creating app dora in org jacopen / space jacopen-space as admin...

Page 21: Cloud Foundryは何故動くのか

調査の鍵 CF_TRACE=true

CF_TRACE=trueにすると、cf コマンドが

裏で行っているリクエストを見ることができる。

Page 22: Cloud Foundryは何故動くのか

cf pushを覗いてみよう

Page 23: Cloud Foundryは何故動くのか

GET /v2/spaces/dbf6ed0a-3108-45d8-9c78-a512d5071358/apps?q=name%3Adora&inline-relations-depth=1 HTTP/1.1HTTP/1.1 200 OK!POST /v2/apps?async=true HTTP/1.1{"name":"dora","space_guid":"dbf6ed0a-3108-45d8-9c78-a512d5071358"}HTTP/1.1 201 Created!GET /v2/shared_domains HTTP/1.1HTTP/1.1 200 OK!GET /v2/domains?inline-relations-depth=1&q=name%3A107.22.72.200.xip.io HTTP/1.1HTTP/1.1 200 OK!GET /v2/routes?inline-relations-depth=1&q=host%3Adora%3Bdomain_guid%3A524ba14d-4d3f-495f-a2c7-a5ed25a70e81 HTTP/1.1HTTP/1.1 200 OK!POST /v2/routes?async=true&inline-relations-depth=1 HTTP/1.1{"host":"dora","domain_guid":"524ba14d-4d3f-495f-a2c7-a5ed25a70e81","space_guid":"dbf6ed0a-3108-45d8-9c78-a512d5071358"}HTTP/1.1 201 Created!PUT /v2/apps/0e948568-aa90-47e9-a128-9ff3cc680600/routes/ed912294-be29-4013-8b1c-735851acee24 HTTP/1.1HTTP/1.1 201 Created!PUT /v2/apps/0e948568-aa90-47e9-a128-9ff3cc680600/bits?async=true HTTP/1.1Content-Type: multipart/form-data;HTTP/1.1 201 Created!GET /v2/jobs/6dd46fe7-40b0-41d1-94aa-dd2ee80fd3b2 HTTP/1.1HTTP/1.1 200 OK(queued)!GET /v2/jobs/6dd46fe7-40b0-41d1-94aa-dd2ee80fd3b2 HTTP/1.1HTTP/1.1 200 OK(finished)!CONNECTING TO WEBSOCKET: wss://loggregator.107.22.72.200.xip.io:443/tail/?app=0e948568-aa90-47e9-a128-9ff3cc680600!PUT /v2/apps/0e948568-aa90-47e9-a128-9ff3cc680600?async=true&inline-relations-depth=1 HTTP/1.1{"state":"STARTED"}!GET /v2/apps/0e948568-aa90-47e9-a128-9ff3cc680600/instances HTTP/1.1HTTP/1.1 400 Bad Request{"code":170002,"description":"App has not finished staging","error_code":"CF-NotStaged"}!GET /v2/apps/0e948568-aa90-47e9-a128-9ff3cc680600/instances HTTP/1.1

api.107.22.72.200.xip.io と何かやりとりしてる

Page 24: Cloud Foundryは何故動くのか

分かったこと

Page 25: Cloud Foundryは何故動くのか

cf push

Cloud Foundryは、APIを提供している

APIを提供してくれる何か

Page 26: Cloud Foundryは何故動くのか

cf push

cf pushは、APIをいろいろ叩いてデプロイする

APIを提供してくれる何か

GET xxxx

PUT xxxx

POST xxxx

GET xxxx

アプリを動かす何か

Page 27: Cloud Foundryは何故動くのか

アクセス先を調べよう

Page 28: Cloud Foundryは何故動くのか

API

api.107.22.72.200.xip.io

Page 29: Cloud Foundryは何故動くのか

Application

dora.107.22.72.200.xip.io

Page 30: Cloud Foundryは何故動くのか

あれ?

Page 31: Cloud Foundryは何故動くのか

APIも、Appも、同じIPアドレス

$ nslookup api.107.22.72.200.xip.ioServer: 192.168.11.1Address: 192.168.11.1#53!Non-authoritative answer:api.107.22.72.200.xip.io canonical name = api.1jkk1uz.xip.io.Name: api.1jkk1uz.xip.ioAddress: 107.22.72.200!$ nslookup dora.107.22.72.200.xip.ioServer: 192.168.11.1Address: 192.168.11.1#53!Non-authoritative answer:dora.107.22.72.200.xip.io canonical name = dora.1jkk1uz.xip.io.Name: dora.1jkk1uz.xip.ioAddress: 107.22.72.200

Page 32: Cloud Foundryは何故動くのか

cf push

アドレスを元にアクセスを分配する何者かが居る

APIを提供してくれる何か

アクセスを分ける 何かブラウザ

アプリを動かす何か

Page 33: Cloud Foundryは何故動くのか

cf scale

$ cf scale -i 3 -m 256M doraScaling app dora in org jacopen / space jacopen-space as admin...OK

cf scaleコマンドで、稼働する「インスタンス数」「メモリサイズ」などを変更できる

Page 34: Cloud Foundryは何故動くのか
Page 35: Cloud Foundryは何故動くのか

cf push

アドレスを元にアクセスを分配する何者かが居る

APIを提供してくれる何か

アクセスを分ける 何かブラウザ

Page 36: Cloud Foundryは何故動くのか

アプリが死ぬとどうなる?

Page 37: Cloud Foundryは何故動くのか

dora/sigterm/KILL

sigterm/KILLで、自分自身のプロセスを終了

Page 38: Cloud Foundryは何故動くのか

ポートが変わった

Page 39: Cloud Foundryは何故動くのか

アプリの死活監視をしている何かが居る

APIを提供してくれる何か

アクセスを分ける 何か

死活 監視

Page 40: Cloud Foundryは何故動くのか

結果

Page 41: Cloud Foundryは何故動くのか

外から見えるCloud Foundry

APIを提供してくれる何か

アクセスを分ける 何か

アプリを動かす何か

死活 監視

Page 42: Cloud Foundryは何故動くのか

Cloud Foundryの中身(の一部)

Cloud Controller

Router

DEA HealthManager

Page 43: Cloud Foundryは何故動くのか

Cloud Foundryにおける

コンポーネントの 役割を知ろう2

Page 44: Cloud Foundryは何故動くのか

コンポーネント=?

Cloud Controller

Router

DEA HealthManager

Page 45: Cloud Foundryは何故動くのか

コンポーネント=アプリケーション

Cloud Controller (Ruby)

Router (Golang)

DEA (Ruby)

HealthManager (Golang)

Page 46: Cloud Foundryは何故動くのか

全コンポーネントを1VMに集約できる

Cloud Controller (Ruby)

Router (Golang)

DEA (Ruby)

HealthManager (Golang)

VM

Page 47: Cloud Foundryは何故動くのか

(一般的に)実運用では、 コンポーネントごとにVMを分ける

Cloud Controller (Ruby)

Router (Golang)

DEA (Ruby)

HealthManager (Golang)

VM

VM

VM VM

Page 48: Cloud Foundryは何故動くのか

それぞれのコンポーネントを見ていこう

Page 49: Cloud Foundryは何故動くのか

Router

Cloud Controller

Router

DEA HealthManager

Page 50: Cloud Foundryは何故動くのか

Routerとは

URLによって、適切なコンポーネントにアクセスを振り分けるL7ロードバランサー(のようなもの)

ネットワーク機器の「ルーター」とは違う点に注意。

実体は、Ubuntu上で動く、Goで書かれたアプリケーション。(Gorouterという)

Page 51: Cloud Foundryは何故動くのか

Cloud Controller

Router

DEA HealthManager

api.107.22.72.200.xip.io

dora.107.22.72.200.xip.io

Page 52: Cloud Foundryは何故動くのか

Cloud Controller

Router

DEA HealthManager

api.107.22.72.200.xip.io

dora.107.22.72.200.xip.io

なぜRouterはリクエストの振り先を知っているのか?

Page 53: Cloud Foundryは何故動くのか

Cloud Controller

Router

DEA HealthManager

router.register

各コンポーネントが、router.registerというメッセージをRouterに送る

api.107.22.72.200.xip.ioは10.244.0.138:9022に送って

dora.107.22.72.200.xip.ioは10.244.0.26:61032に送って

Page 54: Cloud Foundryは何故動くのか

Cloud Controller

Router

DEA HealthManager

router.register

Routerは、収集した情報を元にアクセスを分配する

dora.107.22.72.200.xip.io => 10.244.0.26:61032 api.107.22.72.200.xip.io => 10.244.0.138:9022

api.107.22.72.200.xip.io

dora.107.22.72.200.xip.io

Page 55: Cloud Foundryは何故動くのか

Cloud Controller

Router

DEA HealthManager

router.register

同一URLに複数の振り先でも大丈夫

dora.107.22.72.200.xip.io => 10.244.0.26:61032 dora.107.22.72.200.xip.io => 10.244.0.27:58719 api.107.22.72.200.xip.io => 10.244.0.138:9022 api.107.22.72.200.xip.io => 10.244.0.139:9022

api.107.22.72.200.xip.io

dora.107.22.72.200.xip.io

Cloud Controller

DEA

Page 56: Cloud Foundryは何故動くのか

Cloud Controller

Cloud Controller

Router

DEA HealthManager

Page 57: Cloud Foundryは何故動くのか

Cloud Controllerとは APIを提供するコンポーネント。

!

• cfコマンド等からアプリケーションの受け取り

• DEAに対してアプリの起動・停止の指示

• Service(データベース等)の作成の指示

!

などなど、Cloud Foundry全体に対しての

コントロールを行う。

Page 58: Cloud Foundryは何故動くのか

POST /v2/apps?async=true HTTP/1.1{"name":"dora","space_guid":"dbf6ed0a-3108-45d8-9c78-a512d5071358"}HTTP/1.1 201 Created!GET /v2/shared_domains HTTP/1.1HTTP/1.1 200 OK!GET /v2/domains?inline-relations-depth=1&q=name%3A107.22.72.200.xip.io HTTP/1.1HTTP/1.1 200 OK!GET /v2/routes?inline-relations-depth=1&q=host%3Adora%3Bdomain_guid%3A524ba14d-4d3f-495f-a2c7-a5ed25a70e81 HTTP/1.1HTTP/1.1 200 OK!POST /v2/routes?async=true&inline-relations-depth=1 HTTP/1.1{"host":"dora","domain_guid":"524ba14d-4d3f-495f-a2c7-a5ed25a70e81","space_guid":"dbf6ed0a-3108-45d8-9c78-a512d5071358"}HTTP/1.1 201 Created!PUT /v2/apps/0e948568-aa90-47e9-a128-9ff3cc680600/routes/ed912294-be29-4013-8b1c-735851acee24 HTTP/1.1HTTP/1.1 201 Created!PUT /v2/apps/0e948568-aa90-47e9-a128-9ff3cc680600/bits?async=true HTTP/1.1Content-Type: multipart/form-data;HTTP/1.1 201 Created!GET /v2/jobs/6dd46fe7-40b0-41d1-94aa-dd2ee80fd3b2 HTTP/1.1HTTP/1.1 200 OK(queued)!GET /v2/jobs/6dd46fe7-40b0-41d1-94aa-dd2ee80fd3b2 HTTP/1.1HTTP/1.1 200 OK(finished)!CONNECTING TO WEBSOCKET: wss://loggregator.107.22.72.200.xip.io:443/tail/?app=0e948568-aa90-47e9-a128-9ff3cc680600!PUT /v2/apps/0e948568-aa90-47e9-a128-9ff3cc680600?async=true&inline-relations-depth=1 HTTP/1.1{"state":"STARTED"}!GET /v2/apps/0e948568-aa90-47e9-a128-9ff3cc680600/instances HTTP/1.1HTTP/1.1 400 Bad Request{"code":170002,"description":"App has not finished staging","error_code":"CF-NotStaged"}!GET /v2/apps/0e948568-aa90-47e9-a128-9ff3cc680600/instances HTTP/1.1

⇐appの作成⇐domainの取得

⇐routesの確認⇐routesの作成⇐appとroutesの紐付け⇐ソースのアップロード

⇐appを起動

Page 59: Cloud Foundryは何故動くのか

DEA

Cloud Controller

Router

DEA HealthManager

Page 60: Cloud Foundryは何故動くのか

DEAとは ユーザーアプリを動かすためのコンポーネント。

Droplet Execution Agentの略。

!

CF v2では、ユーザーアプリのStaging作業(Rubyのbundle installなど)も担当する。

!

DEAはWardenというLinuxコンテナを使い、ユーザーアプリを動かす(が、今回は触れない)

Page 61: Cloud Foundryは何故動くのか

Clientからのソース受け取り

Cloud Controller

Router

DEA HealthManager

cf push

Gemfile lib/ bin/ config.ru app.rb

Page 62: Cloud Foundryは何故動くのか

Staging依頼 (staging.start)

Cloud Controller

Router

DEA HealthManager

cf push

Gemfile lib/ bin/ config.ru app.rb

Gemfile Gemfile.lock vendor/ lib/ bin/ config.ru

Page 63: Cloud Foundryは何故動くのか

Golden Packageの保存

Cloud Controller

Router

DEA HealthManager

cf push

Gemfile Gemfile.lock vendor/ lib/ bin/ config.ru

Page 64: Cloud Foundryは何故動くのか

Start依頼 (dea.start)

Cloud Controller

Router

DEA HealthManager

cf push

Gemfile Gemfile.lock vendor/ lib/ bin/ config.ru

Gemfile Gemfile.lock vendor/ lib/ bin/ config.ru

Page 65: Cloud Foundryは何故動くのか

Start依頼 (dea.start)

Cloud Controller

Router

DEA HealthManager

cf push

Gemfile Gemfile.lock vendor/ lib/ bin/ config.ru

Page 66: Cloud Foundryは何故動くのか

Cloud Controller

Router

DEA HealthManager

cf scale -i 3

Gemfile Gemfile.lock vendor/ lib/ bin/ config.ru

DEA

Page 67: Cloud Foundryは何故動くのか

Start依頼 (dea.start)

Cloud Controller

Router

DEA HealthManager

cf scale -i 3

Gemfile Gemfile.lock vendor/ lib/ bin/ config.ru

DEA

Page 68: Cloud Foundryは何故動くのか

Start依頼 (dea.start)

Cloud Controller

Router

DEA HealthManager

cf scale -i 3

Gemfile Gemfile.lock vendor/ lib/ bin/ config.ru

DEA

Page 69: Cloud Foundryは何故動くのか

Health Manager

Cloud Controller

Router

DEA HealthManager

DEA

Page 70: Cloud Foundryは何故動くのか

Health Managerとは !

ユーザーアプリが、「あるべき姿」になっているかどうか、監視を行うコンポーネント。 !

最新版は、Goで書かれた「hm9000」

Page 71: Cloud Foundryは何故動くのか

インスタンスの突然死

Cloud Controller

Router

DEA HealthManager

DEA

Page 72: Cloud Foundryは何故動くのか

droplet.exited

Cloud Controller

Router

DEA HealthManager

DEA

Page 73: Cloud Foundryは何故動くのか

hm9000.start

Cloud Controller

Router

DEA HealthManager

DEA

Page 74: Cloud Foundryは何故動くのか

dea.start

Cloud Controller

Router

DEA HealthManager

DEA

Page 75: Cloud Foundryは何故動くのか

dea.start

Cloud Controller

Router

DEA HealthManager

DEA

Page 76: Cloud Foundryは何故動くのか

何故かインスタンスが多い場合

Cloud Controller

Router

DEA HealthManager

DEA

Page 77: Cloud Foundryは何故動くのか

dea.heartbeat

Cloud Controller

Router

DEA HealthManager

DEA3インスタンスのはずなのに、4つ来た・・・

Page 78: Cloud Foundryは何故動くのか

hm9000.stop

Cloud Controller

Router

DEA HealthManager

DEA

Page 79: Cloud Foundryは何故動くのか

dea.stop

Cloud Controller

Router

DEA HealthManager

DEA

Page 80: Cloud Foundryは何故動くのか

dea.stop

Cloud Controller

Router

DEA HealthManager

DEA

Page 81: Cloud Foundryは何故動くのか

それぞれの関係、分かりましたか?

Cloud Controller

Router

DEA HealthManager

内部通信

外部からのアクセス

Page 82: Cloud Foundryは何故動くのか

Cloud Foundryにおける

コンポーネント間 通信を知ろう3

Page 83: Cloud Foundryは何故動くのか

さっきのこの図

Cloud Controller

Router

DEA HealthManager

内部通信

外部からのアクセス

Page 84: Cloud Foundryは何故動くのか
Page 85: Cloud Foundryは何故動くのか

Cloud Controller

Router

DEA HealthManager

NATS

Page 86: Cloud Foundryは何故動くのか

NATSとは !

Publish-Subscribeモデルの軽量メッセージングシステム

!

Cloud Foundryの生みの親、Derek Collison氏が開発。

Cloud Foundry登場時から存在する、アーキテクチャの

キモになるシステム。 !

元々はRubyで、EventMachineを使って実装されていた。

現在はGoで実装された、gnatsdになっている

Page 87: Cloud Foundryは何故動くのか

Publish-Subscribeモデル

Publisher Subscriber

NATS

Subject: foo.bar

Subject: foo.bar

Page 88: Cloud Foundryは何故動くのか

Publish-Subscribeモデル

Publisher Subscriber

NATS

Subject: foo.bar{“message”: “hogefuga”}

{“message”: “hogefuga”}

{“message”: “hogefuga”}

Page 89: Cloud Foundryは何故動くのか

Publish-Subscribeモデル

Publisher Subscriber

NATS

Cloud Controller

DEA

Router

Subject: router.register {“host":"10.244.0.138","port":9022,"uris":

["api.107.22.72.200.xip.io"]}

Subject: router.register {“host":"10.244.0.111","port":37902,"uris":

["dora.107.22.72.200.xip.io"]}

Page 90: Cloud Foundryは何故動くのか

全Subscriberが同じメッセージを受け取れる

NATS

Cloud Controller

DEA

Router

Subject: router.register {“host":"10.244.0.138","port":9022,"uris":

["api.107.22.72.200.xip.io"]}

Subject: router.register {“host":"10.244.0.111","port":37902,"uris":

["dora.107.22.72.200.xip.io"]}

Router

Router

Publisher Subscriber

Page 91: Cloud Foundryは何故動くのか

もしNATSが無かったら・・・

NATSあり 直接通信

1.Routerを起動

2.Routerはrouter.registerをsubscribe

1.新Routerを管理DBに登録

2.Routerを起動

3.DEA, CCは管理DBを参照し、Routerリストを取得

4.各Routerに対してメッセージ送信

Page 92: Cloud Foundryは何故動くのか

Cloud Controller

Router

DEA HealthManager

NATSRouter

Router

Cloud Controller

DEA

DEA

DEA

Cloud Controller

Cloud Controller

Page 93: Cloud Foundryは何故動くのか

Cloud Foundryのアーキテクチャ !

• NATSを中心とした、疎結合なコンポーネント間連携

• スケールしやすい! • 自律分散型システム

• 管理する情報は必要最低限 • セルフヒーリング

• 要は勝手に治る

• SPoF(単一障害点)は排除

• ただし最近までのNATSを除く

Page 94: Cloud Foundryは何故動くのか

Cloud Foundry V1と 変わってない?

Page 95: Cloud Foundryは何故動くのか

CF v1 と v2 の違い

• 大まかなアーキテクチャは変わっていない

• DEAがDEAngになり、WardenというLinuxコンテナでアプリを動かすように

• いろんなコンポーネントがGoに書き換えられた

• HerokuのBuildpackが使えるように

• APIの互換性は一切無し!

Page 96: Cloud Foundryは何故動くのか

次回はもうちょっと踏み込んだ内容をやるよ