Top Banner
Cloud Foundry は、なぜ動くのか
96

Cloud Foundryは何故動くのか

May 24, 2015

Download

Technology

Kazuto Kusama

第18回 Cloud Foundry輪読会で発表した資料です
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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は何故動くのか

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