第39回 PaaS勉強会で発表した資料です。 Cloud Native Buildpackを使えば、Dockerfileを書くこと無くコンテナイメージを作れちゃいいます
© Copyright 2017 Pivotal Software, Inc. All rights Reserved. Version 1.0Cloud Native Buildpackでめんどうなコンテナイメージ作成を自動化しよう
View Slide
Pivotal Japan - Solutions ArchitectKazuto Kusama@jacopen
普段からコンテナ使っている人?
Dockerfile書くなんて造作もないっていう人?
Dockerの Build-Ship-RunモデルBuild Ship Run$ docker build $ docker push $ docker runDockerfile書いてイメージ作ってどこかのレジストリに上げて 実行する
Dockerの Build-Ship-RunモデルBuild Ship Run$ docker build $ docker push $ docker runDockerfile書いてイメージ作ってどこかのレジストリに上げて 実行する特にこのへんが大変
ここ特化のMeetupがあるレベルhttps://build.connpass.com/event/98947/
『コンテナ疲れ』と戦う、k8s・PaaS・Serverlessの活用法https://www.slideshare.net/jacopen/k8spaasserverless考えることが増えて面倒くさい・・・
一方PaaSならこうなる
DemoHerokuとCFにアプリをデプロイしてみるデモをしました。動画はこちらhttps://youtu.be/MfzvZQeLDFUhttps://youtu.be/8xpr84ox8yQ
$ cf pushPaaSの例 (Cloud Foundry)コマンド一発あとは全部おまかせ
コンテナイメージ コンテナレジストリ マニフェスト$ cf push
なぜこんなことが出来るのか
Buildpack
BuildpackがうまいことやってくれるBuildpack実行$ cf push
BuildpackとはHerokuによって作られた、PaaS上で任意の言語やフレームワークを利用できるようにする仕組みCloud FoundryやGitLab、Dokkuなどでも利用可能
BuildpackとはHerokuによって作られた、PaaS上で任意の言語やフレームワークを利用できるようにする仕組みCloud FoundryやGitLab、Dokkuなどでも利用可能?
補足: GitLab Auto DevOpsってのがありますhttps://about.gitlab.com/auto-devops/
Buildpackのしくみ
Cover w/ Image必須スクリプトHerokuで使えるBuildpackの場合、bin以下にならず以下のスクリプトが存在します• bin/detect• bin/compile• bin/release
1. Detect言語を検出するためのスクリプト
1. Detect#!/usr/bin/env bashBUILD_DIR=$1# Exit early if app is clearly not Python.if [ ! -f "$BUILD_DIR/requirements.txt" ] && [ ! -f "$BUILD_DIR/setup.py" ] && [ ! -f "$BUILD_DIR/Pipfile" ];thenexit 1fiecho Pythonhttps://github.com/heroku/heroku-buildpack-python/blob/master/bin/detectrequirement.txtかsetup.pyかPipfileが無かったら exit 1見つかった場合、Pythonと文字を出して終わる(exit 0)
1. Detect言語を検出するためのスクリプトデプロイされたソースコードに対してdetectを実行し、終了コードが0か1かで判断する。0であれば、そのBuildpackの次のフェーズに移行する1であれば、そのBuildpackは該当しなかったということで、次のBuildpackのdetectに移行する
1. Detect$ cf pushPythonのコードJava BuildpackPHP BuildpackRuby BuildpackPythonBuildpack① detectを実行Javaではないのでexit 1が返る② detectを実行PHPではないのでexit 1が返る③detectを実行Rubyではないのでexit 1が返る④ detectを実行Pythonのファイルがあるので exit 0が返る⇒Python Buildpackを使った次の処理へ
1. DetectExit 0か1が返せればいいので、bashでなくともよい。例: cloudfoundry/java-buildpackdetectでRubyを実行している例: cloudfoundry/php-buildpackbashの中でpythonを実行している
2. Compile実行可能なイメージを作成するフェーズ言語の実行環境の設定• たとえばPython自体、Ruby自体の実行環境ライブラリ類の解決• Pythonならpip install、Rubyならbundle installなどここでその名の通り環境のコンパイルを行うことができるが、実際のところは処理時間の都合上、コンパイル済みのバイナリを持ってくることが多い
2. Compileこのフェーズの処理は複雑なことが多いため、外部のスクリプトを呼んで実行しているケースが多い例: heroku-buildpack-ruby
$ cf pushPythonのコードcompilescriptApplicationLibraryRuntime2. Compile
2. Compileなお、Cloud FoundryにおいてはCompileはDeprecatedとされ、Supplyとfinalizeの2スクリプトに細分化されている(仕様が分裂している)
3. Release実行時に必要なメタデータを生成するスクリプト
Buildpack適用後デプロイされたアプリは何か?(detect)アプリ向けの準備(compile)コンテナイメージBuildpackdeploySlug (Heroku)Droplet (Cloud Foundry)
Diego CellrunCGardenDiego Cell•内部ではコンテナを活用•Buildpackを使ってDropletを作成し、Diego Cellで実行•開発者はコンテナについて意識する必要なしCloud Foundryの場合
ここまでの話で重要なポイント
• HerokuやCloud Foundryは、開発者が楽になるような仕組みをBuildpackによって実現している• BuildpackのDetectで、アプリがどんな言語・フレームワークかを自動検出している• Compileなどを通じ、最終的にはアプリやランタイムがセットになったコンテナイメージが生成される
あれ
これでDocker image作ればいいんでは・・・
Cloud Native Buildpacks
The Cloud Native Buildpacks projectPivotalとHerokuにより、2018年の1月から開始されたプロジェクトCloud FoundryとHerokuのBuildpackの仕様を統一。ソースコードからOCIイメージを作成できる仕組みに
CNCF Sandboxプロジェクト入り
Demo$ lsREADME.md app manifest.yml node_modules package.json public server.js views$ pack build jacopen/testapp2018/11/19 17:14:31 Pulling builder image 'packs/samples' (use --no-pull flag to skip this step)2018/11/19 17:14:33 Selected run image 'packs/run' from stack 'io.buildpacks.stacks.bionic'2018/11/19 17:14:33 Pulling run image 'packs/run' (use --no-pull flag to skip this step)*** DETECTING:2018/11/19 08:14:43 Group: Sample Node.js Buildpack: pass*** ANALYZING: Reading information from previous image for possible re-use2018/11/19 17:14:44 WARNING: skipping analyze, image not found中略---> 170c76d2c366Successfully built 170c76d2c366Successfully tagged jacopen/testapp:latestDockerfileすら無いnode.jsアプリのディレクトリで pack buildコマンドを一発打つだけで、自動的にイメージのビルドやってくれて超らくちん というデモをしました
従来のBuildpackとの違い
仕様がみっちり決められたhttps://github.com/buildpack/spec
内部的にはV3扱いBuildpack API v2a - HerokuBuildpack API v2b - Cloud FoundryBuildpack API v3 - Cloud Native Buildpackshttps://github.com/buildpack/resources
PlatformLifecycleBuildpack
PlatformLifecycleBuildpackアプリケーションのソースコードを実行可能なアーティファクトに変換するソフトウェア
Buildpack• 考え方はこれまでのBuildpackとあまり変わらない• DetectとBuildの2コマンドが必須• Releaseは無くなったhttps://github.com/buildpack/samples/tree/master/nodejs-buildpack/bin
PlatformLifecycleBuildpackBuildpackを利用し、アーティファクトをOCIイメージに変換するソフトウェア
Lifecycle• 4つのフェーズを経てOCIイメージを作成• 最後に実行https://github.com/buildpack/spec/blob/master/buildpack.md#launchDetection Analysis Build Export Launch
Lifecyclehttps://github.com/buildpack/spec/blob/master/buildpack.md#launchDetection Analysis Build Export LaunchBuildpackの/bin/detectを実行してDetect
Lifecyclehttps://github.com/buildpack/spec/blob/master/buildpack.md#launchDetection Analysis Build Export Launch既存イメージを解析して、変更点を検出
Lifecyclehttps://github.com/buildpack/spec/blob/master/buildpack.md#launchDetection Analysis Build Export Launch変更点があった部分に対し、Buildpackの/bin/buildを実行
Lifecyclehttps://github.com/buildpack/spec/blob/master/buildpack.md#launchDetection Analysis Build Export Launch変更されたレイヤーをイメージに反映
Implementationbuildpack/lifecycle には、Lifecycleのリファレンス実装があるhttps://github.com/buildpack/lifecycle
pack CLIコマンドラインからBuildpackを利用したイメージ作成ができるツール。今回のデモで利用Lifecycleリファレンス実装を利用しているhttps://github.com/buildpack/pack
PlatformLifecycleBuildpackアプリ開発者(エンドユーザー)にBuildpackを利用した機能を提供するソフトウェア
Platform
Cloud Native Buildpackによってもたらされるもの● 開発者の生産性向上○ アプリケーション開発に注力できる■ どうやってDockerfile書くかとか気にしなくていい○ 一貫した操作でデプロイできる■ cf push / git push■ packコマンド叩けば様々な言語で同様にイメージ作成できる● 持続可能な運用○ Opsのガードレールの元で開発者の生産性を高める○ スケーラブルなセキュリティ
これまでのCaaSのワークフローDockerfileの作成docker builddocker pushKubernetes manifestの作成kubectl apply
これまでのCaaSのワークフローDockerfileの作成docker builddocker pushKubernetes manifestの作成kubectl applyどのbase imageにするかDockerfileの書き方の知識イメージビルドの環境プライベートレジストリへのpush
これまでのCaaSのワークフローDockerfileの作成docker builddocker pushKubernetes manifestの作成kubectl applyどのbase imageにするかDockerfileの書き方の知識イメージビルドの環境プライベートレジストリへのpush詳しい人
これまでのCaaSのワークフローDockerfileの作成docker builddocker pushKubernetes manifestの作成kubectl applyどのbase imageにするかDockerfileの書き方の知識イメージビルドの環境プライベートレジストリへのpushこのDockerfile酷いですね(笑)イメージサイズでかいですよ(笑)詳しい人
これまでのCaaSのワークフローDockerfileの作成docker builddocker pushKubernetes manifestの作成kubectl applyこのDockerfile酷いですね(笑)イメージサイズでかいですよ(笑)詳しい人クソが
これまでのCaaSのワークフローDockerfileの作成docker builddocker pushKubernetes manifestの作成kubectl applyこのDockerfile酷いですね(笑)イメージサイズでかいですよ(笑)詳しい人クソがコンテナ疲れ™
誰もが同じようなことをやるDockerfileの作成docker builddockerpushKubernetes manifestの作成kubectl applyDockerfileの作成docker builddockerpushKubernetes manifestの作成kubectl applyDockerfileの作成docker builddockerpushKubernetes manifestの作成kubectl apply
誰もが同じようなことをやるDockerfileの作成docker builddockerpushKubernetes manifestの作成kubectl applyDockerfileの作成docker builddockerpushKubernetes manifestの作成kubectl applyDockerfileの作成docker builddockerpushKubernetes manifestの作成kubectl applyこのDockerfile酷いですね(笑)イメージサイズでかいですよ(笑)詳しい人
誰もが同じようなことをやるDockerfileの作成docker builddockerpushKubernetes manifestの作成kubectl applyDockerfileの作成docker builddockerpushKubernetes manifestの作成kubectl applyDockerfileの作成docker builddockerpushKubernetes manifestの作成kubectl applyこのDockerfile酷いですね(笑)イメージサイズでかいですよ(笑)詳しい人クソがクソがクソが
誰もが同じようなことをやるDockerfileの作成docker builddockerpushKubernetes manifestの作成kubectl applyDockerfileの作成docker builddockerpushKubernetes manifestの作成kubectl applyDockerfileの作成docker builddockerpushKubernetes manifestの作成kubectl applyこのDockerfile酷いですね(笑)イメージサイズでかいですよ(笑)詳しい人クソがクソがクソがコンテナ疲れ™
Cloud Native Buildpacksのときのワークフローpack buildBuildpackの管理とbuilderの提供DevOpsKubernetes manifestの作成kubectl apply
Cloud Native BuildpacksのときのワークフローDevcf push / git push
Cloud Native BuildpacksのときのワークフローDevkubectl apply
今後のCloud Native Buildpack● Cloud FoundryのBuildpackは、順次V3 API対応が行われる○ 現時点ではNodeJS Buildpackが対応完了○ https://github.com/cloudfoundry/nodejs-cnb.git
もくもく会やってます
その他詳しい情報buildpacks.iohttps://buildpacks.io/spechttps://github.com/buildpack/specsampleshttps://github.com/buildpack/samplesまずは試そう仕様を詳しく知るならBuildpackのサンプルを見るなら
Transforming How The World Builds Software© Copyright 2017 Pivotal Software, Inc. All rights Reserved.