Slide 1

Slide 1 text

© Copyright 2017 Pivotal Software, Inc. All rights Reserved. Version 1.0 Cloud Native Buildpackで めんどうなコンテナイメージ作成を 自動化しよう

Slide 2

Slide 2 text

Pivotal Japan - Solutions Architect Kazuto Kusama @jacopen

Slide 3

Slide 3 text

普段からコンテナ使っている人?

Slide 4

Slide 4 text

Dockerfile書くなんて 造作もないっていう人?

Slide 5

Slide 5 text

Dockerの Build-Ship-Runモデル Build Ship Run $ docker build $ docker push $ docker run Dockerfile書いて イメージ作って どこかのレジストリに上げて 実行する

Slide 6

Slide 6 text

Dockerの Build-Ship-Runモデル Build Ship Run $ docker build $ docker push $ docker run Dockerfile書いて イメージ作って どこかのレジストリに上げて 実行する 特にこのへんが大変

Slide 7

Slide 7 text

ここ特化のMeetupがあるレベル https://build.connpass.com/event/98947/

Slide 8

Slide 8 text

『コンテナ疲れ』と戦う、k8s・PaaS・Serverlessの活用法 https://www.slideshare.net/jacopen/k8spaasserverless 考えることが増えて面倒くさい・・・

Slide 9

Slide 9 text

一方PaaSならこうなる

Slide 10

Slide 10 text

Demo HerokuとCFにアプリをデプロイしてみるデモをしました。動画はこちら https://youtu.be/MfzvZQeLDFU https://youtu.be/8xpr84ox8yQ

Slide 11

Slide 11 text

$ cf push PaaSの例 (Cloud Foundry) コマンド一発 あとは全部おまかせ

Slide 12

Slide 12 text

コンテナイメージ コンテナレジストリ マニフェスト $ cf push

Slide 13

Slide 13 text

なぜこんなことが出来るのか

Slide 14

Slide 14 text

Buildpack

Slide 15

Slide 15 text

Buildpackがうまいことやってくれる Buildpack 実行 $ cf push

Slide 16

Slide 16 text

Buildpackとは Herokuによって作られた、PaaS上で任意の言語や フレームワークを利用できるようにする仕組み Cloud FoundryやGitLab、Dokkuなどでも利用可能

Slide 17

Slide 17 text

Buildpackとは Herokuによって作られた、PaaS上で任意の言語や フレームワークを利用できるようにする仕組み Cloud FoundryやGitLab、Dokkuなどでも利用可能 ?

Slide 18

Slide 18 text

補足: GitLab Auto DevOpsってのがあります https://about.gitlab.com/auto-devops/

Slide 19

Slide 19 text

Buildpackのしくみ

Slide 20

Slide 20 text

Cover w/ Image 必須スクリプト Herokuで使えるBuildpackの場合、bin以下にな らず以下のスクリプトが存在します • bin/detect • bin/compile • bin/release

Slide 21

Slide 21 text

1. Detect 言語を検出するためのスクリプト

Slide 22

Slide 22 text

1. Detect #!/usr/bin/env bash BUILD_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" ]; then exit 1 fi echo Python https://github.com/heroku/heroku-buildpack-python/blob/master/bin/detect requirement.txtかsetup.pyかPipfileが無かったら exit 1 見つかった場合、Pythonと文字を出して終わる(exit 0)

Slide 23

Slide 23 text

1. Detect 言語を検出するためのスクリプト デプロイされたソースコードに対してdetectを実行し、 終了コードが0か1かで判断する。 0であれば、そのBuildpackの次のフェーズに移行する 1であれば、そのBuildpackは該当しなかったということで、 次のBuildpackのdetectに移行する

Slide 24

Slide 24 text

1. Detect $ cf push Pythonのコード Java Buildpack PHP Buildpack Ruby Buildpack Python Buildpack ① detectを実行 Javaではないのでexit 1が返る ② detectを実行 PHPではないのでexit 1が返る ③detectを実行 Rubyではないのでexit 1が返る ④ detectを実行 Pythonのファイルがあるので exit 0が返る ⇒Python Buildpackを使った次の処理へ

Slide 25

Slide 25 text

1. Detect Exit 0か1が返せればいいので、bashでなくともよい。 例: cloudfoundry/java-buildpack detectでRubyを実行している 例: cloudfoundry/php-buildpack bashの中でpythonを実行している

Slide 26

Slide 26 text

2. Compile 実行可能なイメージを作成するフェーズ 言語の実行環境の設定 • たとえばPython自体、Ruby自体の実行環境 ライブラリ類の解決 • Pythonならpip install、Rubyならbundle installなど ここでその名の通り環境のコンパイルを行うことができるが、実際のとこ ろは処理時間の都合上、コンパイル済みのバイナリを持ってくることが 多い

Slide 27

Slide 27 text

2. Compile このフェーズの処理は複雑なことが多いため、外部のスクリプトを呼ん で実行しているケースが多い 例: heroku-buildpack-ruby

Slide 28

Slide 28 text

$ cf push Pythonのコード compile script Application Library Runtime 2. Compile

Slide 29

Slide 29 text

2. Compile なお、Cloud FoundryにおいてはCompileはDeprecatedとされ、 Supplyとfinalizeの2スクリプトに細分化されている (仕様が分裂している)

Slide 30

Slide 30 text

3. Release 実行時に必要なメタデータを生成するスクリプト

Slide 31

Slide 31 text

Buildpack適用後 デプロイされた アプリは何か? (detect) アプリ向けの 準備 (compile) コンテナイメージ Buildpack deploy Slug (Heroku) Droplet (Cloud Foundry)

Slide 32

Slide 32 text

Diego Cell runC Garden Diego Cell •内部ではコンテナを活用 •Buildpackを使ってDropletを作 成し、Diego Cellで実行 •開発者はコンテナについて 意識する必要なし Cloud Foundryの場合

Slide 33

Slide 33 text

ここまでの話で 重要なポイント

Slide 34

Slide 34 text

• HerokuやCloud Foundryは、開発者が楽になるような仕組みを Buildpackによって実現している • BuildpackのDetectで、アプリがどんな 言語・フレームワークかを自動検出している • Compileなどを通じ、最終的にはアプリやランタイムがセットになっ たコンテナイメージが生成される

Slide 35

Slide 35 text

あれ

Slide 36

Slide 36 text

これでDocker image作れば いいんでは・・・

Slide 37

Slide 37 text

Cloud Native Buildpacks

Slide 38

Slide 38 text

The Cloud Native Buildpacks project PivotalとHerokuにより、2018年の1月から開始されたプロジェクト Cloud FoundryとHerokuのBuildpackの仕様を統一。 ソースコードからOCIイメージを作成できる仕組みに

Slide 39

Slide 39 text

CNCF Sandboxプロジェクト入り

Slide 40

Slide 40 text

Demo $ ls README.md app manifest.yml node_modules package.json public server.js views $ pack build jacopen/testapp 2018/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-use 2018/11/19 17:14:44 WARNING: skipping analyze, image not found 中略 ---> 170c76d2c366 Successfully built 170c76d2c366 Successfully tagged jacopen/testapp:latest Dockerfileすら無いnode.jsアプリのディレクトリで pack buildコマンドを一発打つだけで、 自動的にイメージのビルドやってくれて超らくちん というデモをしました

Slide 41

Slide 41 text

従来のBuildpackとの違い

Slide 42

Slide 42 text

仕様がみっちり決められた https://github.com/buildpack/spec

Slide 43

Slide 43 text

内部的にはV3扱い Buildpack API v2a - Heroku Buildpack API v2b - Cloud Foundry Buildpack API v3 - Cloud Native Buildpacks https://github.com/buildpack/resources

Slide 44

Slide 44 text

Platform Lifecycle Buildpack

Slide 45

Slide 45 text

Platform Lifecycle Buildpack アプリケーションのソースコードを実行 可能なアーティファクトに変換するソフト ウェア

Slide 46

Slide 46 text

Buildpack • 考え方はこれまでのBuildpackとあまり変わらない • DetectとBuildの2コマンドが必須 • Releaseは無くなった https://github.com/buildpack/samples/tree/master/nodejs-buildpack/bin

Slide 47

Slide 47 text

Platform Lifecycle Buildpack Buildpackを利用し、アーティファクトを OCIイメージに変換するソフトウェア

Slide 48

Slide 48 text

Lifecycle • 4つのフェーズを経てOCIイメージを作成 • 最後に実行 https://github.com/buildpack/spec/blob/master/buildpack.md#launch Detection Analysis Build Export Launch

Slide 49

Slide 49 text

Lifecycle https://github.com/buildpack/spec/blob/master/buildpack.md#launch Detection Analysis Build Export Launch Buildpackの/bin/detectを 実行してDetect

Slide 50

Slide 50 text

Lifecycle https://github.com/buildpack/spec/blob/master/buildpack.md#launch Detection Analysis Build Export Launch 既存イメージを解析して、変 更点を検出

Slide 51

Slide 51 text

Lifecycle https://github.com/buildpack/spec/blob/master/buildpack.md#launch Detection Analysis Build Export Launch 変更点があった部分に対し、 Buildpackの/bin/buildを実行

Slide 52

Slide 52 text

Lifecycle https://github.com/buildpack/spec/blob/master/buildpack.md#launch Detection Analysis Build Export Launch 変更されたレイヤーを イメージに反映

Slide 53

Slide 53 text

Implementation buildpack/lifecycle には、Lifecycleのリファレンス実装がある https://github.com/buildpack/lifecycle

Slide 54

Slide 54 text

pack CLI コマンドラインからBuildpackを利用したイメージ作成ができるツール。 今回のデモで利用 Lifecycleリファレンス実装を利用している https://github.com/buildpack/pack

Slide 55

Slide 55 text

Platform Lifecycle Buildpack アプリ開発者(エンドユーザー)に Buildpackを利用した機能を提供するソ フトウェア

Slide 56

Slide 56 text

Platform

Slide 57

Slide 57 text

Platform

Slide 58

Slide 58 text

No content

Slide 59

Slide 59 text

Cloud Native Buildpackによってもたらされるもの ● 開発者の生産性向上 ○ アプリケーション開発に注力できる ■ どうやってDockerfile書くかとか気にしなくていい ○ 一貫した操作でデプロイできる ■ cf push / git push ■ packコマンド叩けば様々な言語で同様にイメージ作成できる ● 持続可能な運用 ○ Opsのガードレールの元で開発者の生産性を高める ○ スケーラブルなセキュリティ

Slide 60

Slide 60 text

これまでのCaaSのワークフロー Dockerfileの作成 docker build docker push Kubernetes manifestの作成 kubectl apply

Slide 61

Slide 61 text

これまでのCaaSのワークフロー Dockerfileの作成 docker build docker push Kubernetes manifestの作成 kubectl apply どのbase imageにするか Dockerfileの書き方の知識 イメージビルドの環境 プライベートレジストリへの push

Slide 62

Slide 62 text

これまでのCaaSのワークフロー Dockerfileの作成 docker build docker push Kubernetes manifestの作成 kubectl apply どのbase imageにするか Dockerfileの書き方の知識 イメージビルドの環境 プライベートレジストリへの push 詳しい人

Slide 63

Slide 63 text

これまでのCaaSのワークフロー Dockerfileの作成 docker build docker push Kubernetes manifestの作成 kubectl apply どのbase imageにするか Dockerfileの書き方の知識 イメージビルドの環境 プライベートレジストリへの push このDockerfile酷いですね(笑) イメージサイズでかいですよ(笑) 詳しい人

Slide 64

Slide 64 text

これまでのCaaSのワークフロー Dockerfileの作成 docker build docker push Kubernetes manifestの作成 kubectl apply このDockerfile酷いですね(笑) イメージサイズでかいですよ(笑) 詳しい人 クソが

Slide 65

Slide 65 text

これまでのCaaSのワークフロー Dockerfileの作成 docker build docker push Kubernetes manifestの作成 kubectl apply このDockerfile酷いですね(笑) イメージサイズでかいですよ(笑) 詳しい人 クソが コンテナ疲れ™

Slide 66

Slide 66 text

誰もが同じようなことをやる Dockerfileの作成 docker build docker push Kubernetes manifestの作成 kubectl apply Dockerfileの作成 docker build docker push Kubernetes manifestの作成 kubectl apply Dockerfileの作成 docker build docker push Kubernetes manifestの作成 kubectl apply

Slide 67

Slide 67 text

誰もが同じようなことをやる Dockerfileの作成 docker build docker push Kubernetes manifestの作成 kubectl apply Dockerfileの作成 docker build docker push Kubernetes manifestの作成 kubectl apply Dockerfileの作成 docker build docker push Kubernetes manifestの作成 kubectl apply このDockerfile酷いですね(笑) イメージサイズでかいですよ(笑) 詳しい人

Slide 68

Slide 68 text

誰もが同じようなことをやる Dockerfileの作成 docker build docker push Kubernetes manifestの作成 kubectl apply Dockerfileの作成 docker build docker push Kubernetes manifestの作成 kubectl apply Dockerfileの作成 docker build docker push Kubernetes manifestの作成 kubectl apply このDockerfile酷いですね(笑) イメージサイズでかいですよ(笑) 詳しい人 クソが クソが クソが

Slide 69

Slide 69 text

誰もが同じようなことをやる Dockerfileの作成 docker build docker push Kubernetes manifestの作成 kubectl apply Dockerfileの作成 docker build docker push Kubernetes manifestの作成 kubectl apply Dockerfileの作成 docker build docker push Kubernetes manifestの作成 kubectl apply このDockerfile酷いですね(笑) イメージサイズでかいですよ(笑) 詳しい人 クソが クソが クソが コンテナ疲れ™

Slide 70

Slide 70 text

Cloud Native Buildpacksのときのワークフロー pack build Buildpackの管理と builderの提供 Dev Ops Kubernetes manifestの作成 kubectl apply

Slide 71

Slide 71 text

Cloud Native Buildpacksのときのワークフロー Dev cf push / git push

Slide 72

Slide 72 text

Cloud Native Buildpacksのときのワークフロー Dev kubectl apply

Slide 73

Slide 73 text

今後のCloud Native Buildpack ● Cloud FoundryのBuildpackは、順次V3 API対応が行われる ○ 現時点ではNodeJS Buildpackが対応完了 ○ https://github.com/cloudfoundry/nodejs-cnb.git

Slide 74

Slide 74 text

もくもく会やってます

Slide 75

Slide 75 text

その他詳しい情報 buildpacks.io https://buildpacks.io/ spec https://github.com/buildpack/spec samples https://github.com/buildpack/samples まずは試そう 仕様を詳しく知るなら Buildpackのサンプルを 見るなら

Slide 76

Slide 76 text

Transforming How The World Builds Software © Copyright 2017 Pivotal Software, Inc. All rights Reserved.