Cloud Foundry V2を、もうちょっと深掘りしよう

6,853 views

Published on

Cloud Foundry V2はV1と比べて何が変わったのか。変わった点を深掘りします

Published in: Technology
0 Comments
24 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
6,853
On SlideShare
0
From Embeds
0
Number of Embeds
380
Actions
Shares
0
Downloads
164
Comments
0
Likes
24
Embeds 0
No embeds

No notes for slide

Cloud Foundry V2を、もうちょっと深掘りしよう

  1. 1. CloudFoundryV2 
 を、もうちょっと深掘りしよう
  2. 2. @jacopen Kazuto Kusama NTT Communications ! Cloudn PaaSの開発・運用をやっています
  3. 3. ワタシハクラウドファウンドリーチョットデキル I can develop Cloud Foundry a little
  4. 4. paas.jpっていうドメインが取れちゃいました PaaS勉強会のサイトとして使いたいです
  5. 5. 前回 http://www.slideshare.net/jacopen/cloud-foundry-33851040
  6. 6. 前回の要約 役割ごとにコンポーネントが分かれている • APIの提供や、各コンポーネントへ指示出しする
 Cloud Controller • APIやアプリへのアクセスを分配する
 Router • ユーザーアプリを動かす
 DEA • ユーザーアプリの状態監視を行う
 Health Manager Cloud Controller Router DEA Health
 Manager
  7. 7. 前回の要約 コンポーネント間は、NATSという軽量メッセージング システムを介して、疎結合に繋がっている。 V1とV2で、大まかなアーキテクチャはあまり変わって いない Cloud Controller Router DEA Health
 Manager NATS
  8. 8. じゃあ、変わったところは何よ?
  9. 9. アジェンダ Cloud Foundry V2を知るための3点 ! • Buildpackとは何か • Buildpackとアプリがどう関係して動作するようにな るのか • アプリのセキュリティを担保するWardenとは何か
  10. 10. Cloud Foundry Buildpack
1
  11. 11. Cloud Foundry Heroku Buildpack
1
  12. 12. Buildpackとは Herokuが作った、任意の言語やフレームワークを
 利用できるようにする仕組み
  13. 13. Herokuの場合 $ heroku create myapp -b https://github.com/kr/heroku-buildpack-go.git Herokuが公式提供していない言語、
 この例だとGolangを使えるようになる
  14. 14. CFの場合 $ cf push myapp -b https://github.com/dmikusa-pivotal/cf-php-build- pack.git
  15. 15. CFにおけるbuildpack • CFのBuildpackは、Herokuの仕様に準拠している • なので、的に基本は互換性があるはず • 実際には、HerokuとCFの環境の違い(OS、コンテ ナ、ネットワークなど)により、動かないHeroku Buildpackも存在する。
  16. 16. Buildpackのしくみ
  17. 17. Buildpackの必須要素 •detect •compile •release
  18. 18. 1. detect
  19. 19. detect • buildpackの実行条件を指定するスクリプト • デプロイされたアプリケーションに対してこの detectスクリプトを実行し、exit 0ならOK、exit 1なら NGとする。
  20. 20. heroku-buildpack-phpのdetect #!/usr/bin/env bash ! if [[ -f "$1/composer.json" || -f "$1/index.php" ]]; then echo "PHP" && exit 0 else exit 1 fi アプリ内にcomposer.json or index.phpがあれば、 このbuildpackが使われる
  21. 21. heroku-buildpack-rubyのdetect #!/usr/bin/env ruby ! require 'pathname' ! if Pathname.new(ARGV.first).join("Gemfile").exist? puts "Ruby" exit 0 else puts "no" exit 1 end アプリ内にGemfile あれば、
 このbuildpackが使われる
  22. 22. detect • 実行可能であれば、何で書いても良い。heroku- buildpack-phpはbash, heroku-buildpack-rubyはrubyで 書かれている。 • detect自体はbashで書いて、その中からpythonスク リプトを呼んでいるような例もある(cf-php-build- pack) • 最終的にexit 0か1を返せば良い
  23. 23. 2. compile
  24. 24. compile • 言語の実行環境をセットアップするためのスクリプ ト。buildpackのキモになる部分。 • 名前の通り、実行環境のソースを落としてきてコン パイルする・・・が、実際には時間がかかりすぎる ので、予めコンパイル済のバイナリをダウンロード してくるものが多い。
  25. 25. 3. release
  26. 26. release • 実行に必要なメタデータをyamlで返すスクリプト。 #!/bin/sh ! cat << EOF --- addons: - heroku-postgresql:dev default_process_types: web: bin/node server.js EOF
  27. 27. #!/bin/sh ! cat << EOF --- addons: - heroku-postgresql:dev default_process_types: web: bin/node server.js EOF addon: 
 buildpackが必要とするaddonを記述する。CFでは今 の所未対応 default_process_types: 
 アプリケーションの実行コマンドを記述。現在の所、 web: のみ対応。
  28. 28. Buildpackを使った Stagingの仕組み
2
  29. 29. CFv2における”Staging”とは • Golden package Dropletを作る作業。 • Dropletは、実行可能になったアプリケーションの一式 • CFv2では • ユーザーがデプロイしたアプリケーションを、 • Buildpackの記述に従って処理し、 • Dropletを作る までの流れをStagingと言う。
  30. 30. 前回使った図 (staging.start) Cloud Controller Router DEA Health
 Manager cf push Gemfile lib/ bin/ config.ru app.rb Gemfile Gemfile.lock vendor/ lib/ bin/ config.ru
  31. 31. 1.cf pushで、ユーザーはCloud Controllerにアプリ ケーションをアップロードする 2.Cloud Controllerは、DEAにstaging.startメッセージ を送り、Staging作業を依頼する 3.DEAはStaging作業を行い、Dropletを作成する 4.Dropletが完成したら、Cloud Controllerに送り返す
  32. 32. これをもうちょっと深掘り
  33. 33. { "app_id": "65bf0610-fb24-4756-a49a-b64edbe456ed", "task_id": "3b638a01c39b4187a64c76e3ae89a5dd", "properties": { "services": [ ], "resources": { "memory": 256, "disk": 1024, "fds": 16384 }, "environment": [ ], "meta": { "console": false } }, "download_uri": "http://upload-user:upload-password@10.244.0.138:9022/staging/apps/65bf0610-fb24-4756-a49a-b64edbe456ed", "upload_uri": "http://upload-user:upload-password@10.244.0.138:9022/staging/droplets/65bf0610-fb24-4756-a49a-b64edbe456ed/upload", "buildpack_cache_download_uri": null, "buildpack_cache_upload_uri": "http://upload-user:upload-password@10.244.0.138:9022/staging/buildpack_cache/65bf0610-fb24-4756-a49a-b64edbe456ed/upload", "start_message": { "droplet": "65bf0610-fb24-4756-a49a-b64edbe456ed", "name": "dora", "uris": [ "dora.107.22.72.200.xip.io" ], "prod": false, "sha1": null, "executableFile": "deprecated", "executableUri": null, "version": "32395f10-ce09-40c1-99c2-e0f317d66e51", "services": [ ], "limits": { "mem": 256, "disk": 1024, "fds": 16384 }, "cc_partition": "default", "env": [ ], "console": false, "debug": null, "start_command": null, "health_check_timeout": null, "vcap_application": { "limits": { "mem": 256, "disk": 1024, "fds": 16384 }, "application_version": "32395f10-ce09-40c1-99c2-e0f317d66e51", "application_name": "dora", "application_uris": [ "dora.107.22.72.200.xip.io" ], "version": "32395f10-ce09-40c1-99c2-e0f317d66e51", "name": "dora", "space_name": "jacopen-space", "space_id": "33ab8f3b-1a1f-40a7-933d-d2f55a1c80c4", "uris": [ "dora.107.22.72.200.xip.io" ], "users": null }, "index": 0 }, "admin_buildpacks": [ { "key": "9130b02f-9938-4994-9d95-3c864eb1f7b2_f05a183eea56c23f90d8fd616694d8e6a1627ddf", "url": "http://upload-user:upload-password@10.244.0.138:9022/v2/buildpacks/9130b02f-9938-4994-9d95-3c864eb1f7b2/download" }, { "key": "c23f44c8-16e4-44bf-a4ed-b228bd05c9a9_ea13962fc6930f2b0d82be4d87ba8222cd3fab6a", "url": "http://upload-user:upload-password@10.244.0.138:9022/v2/buildpacks/c23f44c8-16e4-44bf-a4ed-b228bd05c9a9/download" }, { "key": "42d73ff8-20a2-4ff3-bb52-c36444186c84_e6c7c383baf52d8e9cfbee8042cd62ac1dc5798a", "url": "http://upload-user:upload-password@10.244.0.138:9022/v2/buildpacks/42d73ff8-20a2-4ff3-bb52-c36444186c84/download" } ] } staging.startの実物
  34. 34. 拡大
  35. 35. { "app_id": "65bf0610-fb24-4756-a49a-b64edbe456ed", "task_id": "3b638a01c39b4187a64c76e3ae89a5dd", "properties": { "services": [ ], "resources": { "memory": 256, "disk": 1024, "fds": 16384 }, "environment": [ ], "meta": { "console": false } }, アプリケーションの基本情報
  36. 36. "download_uri": "http://upload-user:upload-password@10.244.0.138:9022/staging/apps/65bf0610- fb24-4756-a49a-b64edbe456ed", "upload_uri": "http://upload-user:upload-password@10.244.0.138:9022/staging/droplets/ 65bf0610-fb24-4756-a49a-b64edbe456ed/upload", "buildpack_cache_download_uri": null, "buildpack_cache_upload_uri": "http://upload-user:upload-password@10.244.0.138:9022/staging/ buildpack_cache/65bf0610-fb24-4756-a49a-b64edbe456ed/upload", ユーザーアプリのダウンロードURL 出来上がったDropletのアップロード先 Buildpack cacheのダウンロードURL Buildpack cacheのアップロード先
  37. 37. "start_message": { "droplet": "65bf0610-fb24-4756-a49a-b64edbe456ed", "name": "dora", "uris": [ "dora.107.22.72.200.xip.io" ], "prod": false, "sha1": null, "executableFile": "deprecated", "executableUri": null, "version": "32395f10-ce09-40c1-99c2-e0f317d66e51", "services": [ ], "limits": { "mem": 256, "disk": 1024, "fds": 16384 }, "cc_partition": "default", "env": [ ], "console": false, "debug": null, "start_command": null, "health_check_timeout": null, "vcap_application": { "limits": { "mem": 256, "disk": 1024, "fds": 16384 }, "application_version": "32395f10-ce09-40c1-99c2-e0f317d66e51", "application_name": "dora", "application_uris": [ "dora.107.22.72.200.xip.io" ], "version": "32395f10-ce09-40c1-99c2-e0f317d66e51", "name": "dora", "space_name": "jacopen-space", "space_id": "33ab8f3b-1a1f-40a7-933d-d2f55a1c80c4", "uris": [ "dora.107.22.72.200.xip.io" ], "users": null }, "index": 0 }, アプリケーションの起動方法など
  38. 38. "admin_buildpacks": [ { "key": "9130b02f-9938-4994-9d95-3c864eb1f7b2_f05a183eea56c23f90d8fd616694d8e6a1627ddf", "url": "http://upload-user:upload-password@10.244.0.138:9022/v2/buildpacks/ 9130b02f-9938-4994-9d95-3c864eb1f7b2/download" }, { "key": "c23f44c8-16e4-44bf-a4ed-b228bd05c9a9_ea13962fc6930f2b0d82be4d87ba8222cd3fab6a", "url": "http://upload-user:upload-password@10.244.0.138:9022/v2/buildpacks/ c23f44c8-16e4-44bf-a4ed-b228bd05c9a9/download" }, { "key": "42d73ff8-20a2-4ff3-bb52-c36444186c84_e6c7c383baf52d8e9cfbee8042cd62ac1dc5798a", "url": "http://upload-user:upload-password@10.244.0.138:9022/v2/buildpacks/ 42d73ff8-20a2-4ff3-bb52-c36444186c84/download" } ] } admin_buildpackの一覧
  39. 39. Cloud Controller DEA ここからアプリ持っていって。 出来上がったらココにおいて※ あ、Stagingできたら、ついでに
 アプリ起動もやっておいて Stagingに使えるBuildpackは
 こいつらだから。 ※NATSで大きなバイナリの受け渡しは好ましくないため、実際はHTTP経由で行う つまり、staging.startとは
  40. 40. admin buildpack • Cloud Foundryに直接インストールされているbuildpack • ユーザーがbuildpackを指定しなかった場合、admin buildpackから適したものが選ばれる • 管理者コマンド create-buildpackで追加可能 • つまり、admin buildpackを用いることで、サービス 提供者は「標準対応言語」を増やすことができる
  41. 41. DEA staging.startを受け取ったDEA
  42. 42. DEA CCからアプリをダウンロード CC Gemfile lib/ bin/ config.ru app.rb
  43. 43. DEA admin buildpackのdetectを
 優先度の高い順に実行 Gemfile lib/ bin/ config.ru app.rb Ruby Java node Gemfileがあるから
 Rubyだ!
  44. 44. DEA マッチしたBuildpackの compileを実行 Gemfile lib/ bin/ config.ru app.rb Ruby • Rubyのバイナリのダウンロード • バイナリの設置 • bundle installの実行 • database.ymlの書き換え(Railsの場合) • 等々
  45. 45. DEA releaseを実行し、必要な情報を抽出。 Gemfile lib/ bin/ config.ru app.rb --- buildpack_path: /var/vcap/data/dea_next/admin_buildpacks/c23f44c8-16e4-44bf- a4ed-b228bd05c9a9_ea13962fc6930f2b0d82be4d87ba8222cd3fab6a detected_buildpack: Ruby/Rack start_command: bundle exec rackup config.ru -p $PORT staging_info.yml
  46. 46. DEA Dropletのできあがり ! "## app $   "## bin $   $   "## erb -> ../vendor/ruby-1.9.3/bin/erb $   $   "## gem -> ../vendor/ruby-1.9.3/bin/gem $   $   "## irb -> ../vendor/ruby-1.9.3/bin/irb $   $   "## rake -> ../vendor/ruby-1.9.3/bin/rake $   $   "## rdoc -> ../vendor/ruby-1.9.3/bin/rdoc $   $   "## ri -> ../vendor/ruby-1.9.3/bin/ri $   $   "## ruby -> ../vendor/ruby-1.9.3/bin/ruby $   $   &## testrb -> ../vendor/ruby-1.9.3/bin/testrb $   "## config.ru $   "## dora.rb $   "## Gemfile $   "## Gemfile.lock $   "## get_instance_cookie_jars.sh $   "## instances.rb $   "## loop.sh $   "## README.md $   "## routes.txt $   "## spec $   $   "## instances_spec.rb $   $   "## spec_helper.rb $   $   &## stress_testers_spec.rb $   "## stress $   "## stress_testers.rb $   &## vendor $   "## bundle $   "## cache $   "## heroku $   &## ruby-1.9.3 "## logs $   &## staging_task.log "## staging_info.yml &## tmp buildpackで作られた
 Rubyの実行バイナリ アップロードされたアプリ bundle installで入ったもの Start commandなどの記述
  47. 47. custom buildpack • デプロイ時にユーザーがbuildpackを指定できる。これ をcustom buildpackという。 • custom buildpackが指定された場合、detectは実行され ず、いきなりcompileの実行から始まる。 $ cf push myapp -b https://github.com/dmikusa-pivotal/cf-php-build- pack.git
  48. 48. buildpackがアップデート された場合
  49. 49. buildpackのアップデート • たとえばRuby buildpackの場合、そのバージョンの最 新のパッチレベルでデプロイされる。Ruby 2.0.0であれ ば、本日時点でp481 • デプロイ後、新しいパッチレベルが公開されたらどう なる?

  50. 50. 実験しよう https://github.com/jacopen/debug-buildpack
  51. 51. DEMO
  52. 52. デモまとめ • アプリの起動・停止ではbuildpackの更新は行われな い。 • 作成済みのDropletが用いられるため • 再Staging(再度cf pushするなど)することで、新しい buildpackでデプロイされる。 • 最近出たv171で、restaging APIが実装された • ただしcfコマンドは未対応

  53. 53. アプリを動かすコンテナ Wardenの仕組み
3
  54. 54. Warden • うぉーどん! • Cloud Foundryでユーザーアプリを隔離するために作 られたコンテナ • ユーザーアプリはWardenコンテナ内で実行。アプリ が終了するとコンテナも破棄される • 現在はアプリを動かす他に、Staging処理やBosh-liteで 構築したCFコンポーネントを動かすのにも使われて いる
  55. 55. なぜコンテナにするのか http://www.slideshare.net/i_yudai/warden
  56. 56. DEAのVM上でpstreeすると
  57. 57. DEA(ng) = dea_next + warden DEA dea_next
 (Ruby) warden
 (Ruby) ※正確には他にもいるけど、ここでは気にしない
  58. 58. DEA(ng) = dea_next + warden DEA dea_next
 (Ruby) warden server
 (Ruby) container wshd (C) Warden Protocol Warden Client Start Request
  59. 59. Warden • dea_nextはwarden clientを使って、warden serverのAPI を叩く。 • wardenとの通信はwarden protocolで定められている • warden serverはRubyで書かれている。warden server が起動するコンテナはCで書かれている。
  60. 60. Wardenが利用する技術 • Namespaces(空間の分離) • NET • MNT • PID • UTS • IPC • Cgroups(CPU, メモリの制限) • aufs(10.04), overlayfs(12.04)によるコピーオンライト
  61. 61. ネットワーク周り • コンテナに仮想NICが作られる • 仮想NICに対してiptablesでNATする
  62. 62. だいたい一緒 • LXC • Docker
  63. 63. 最近よく聞かれる話
  64. 64. なぜWardenなのか (vs LXC) • 実は初期のCFはLXCを使っていた • LXCはLinux前提に作られているが、CFは将来的に Linux以外もカバーしていきたいから、マルチプラッ トフォームな仕組みが欲しかった • LXCはCFの要求に対して過剰性能すぎた。Cで1000行 以下で、最低限の機能さえあればよかった。(その 分、シンプルで透明性がほしい) https://github.com/cloudfoundry/warden/tree/master/warden
  65. 65. なぜWardenなのか (vs Docker) • Dockerは1プロセス前提なので、CFの仕組みに合わな い • コンテナ作成後に、動的に制限をコントロールした り出来ない • ディスク制限や帯域の制限ができない https://docs.google.com/document/d/ 1DDBJlLJ7rrsM1J54MBldgQhrJdPS_xpc9zPdtuqHCTI/edit
  66. 66. なぜWardenなのか (vs Docker) • Dockerは1プロセス前提なので、CFの仕組みに合わな い • コンテナ作成後に、動的に制限をコントロールした り出来ない • ディスク制限や帯域の制限ができない https://docs.google.com/document/d/ 1DDBJlLJ7rrsM1J54MBldgQhrJdPS_xpc9zPdtuqHCTI/edit 赤字はjacopenツッコミ (Supervisor使えばできるけど・・・一手間いるのは確か) (確かにそうなんだけど、そもそもCFが  動的に変えるなんてオペレーションしてない) (今のDockerだと出来るんじゃない?(未確認))
  67. 67. Infrastructure as Code Heroku Buildpackで記述 LXCで稼働 ! Cloud Foundry Buildpackで記述 Wardenで稼働 ! Docker Dockerfileで記述 Dockerで稼働
  68. 68. 個人的な気持ち • DockerでもHerokuでもCFでも、最終的に達成される ものは一緒。WardenをDockerに置き換えるのはあま り意味がない。 • 個人的にはDockerfileよりもBuildpackのほうが書きや すい • とはいえ、手元で動くDocker imageをそのままデプロ イっていうのはやってみたい。
  69. 69. 参考 • CloudCredoというところが、CFでDockerfileを使った デプロイを可能にした、Deckerというものを作って いる • ActiveStateは、CFをベースにしたStackato 3.0でDocker を取り入れた。(それ以前は、LXCを導入していた) • DEAの次期アーキテクチャであるDiegoでは、Docker を何らかの方法でサポートするオプションがあるら しい(基本はWardenのGo実装であるGardenを使う)
  70. 70. 質問?

×