$30 off During Our Annual Pro Sale. View Details »

Cloud Native Buildpackで めんどうなコンテナイメージ作成を 自動化しよう

Kazuto Kusama
October 18, 2018

Cloud Native Buildpackで めんどうなコンテナイメージ作成を 自動化しよう

第39回 PaaS勉強会で発表した資料です。
Cloud Native Buildpackを使えば、Dockerfileを書くこと無くコンテナイメージを作れちゃいいます

Kazuto Kusama

October 18, 2018
Tweet

More Decks by Kazuto Kusama

Other Decks in Technology

Transcript

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

    View Slide

  2. Pivotal Japan - Solutions Architect
    Kazuto Kusama
    @jacopen

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  9. 一方PaaSならこうなる

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  14. Buildpack

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  19. Buildpackのしくみ

    View Slide

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

    View Slide

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

    View Slide

  22. 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)

    View Slide

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

    View Slide

  24. 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を使った次の処理へ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  35. あれ

    View Slide

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

    View Slide

  37. Cloud Native Buildpacks

    View Slide

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

    View Slide

  39. CNCF Sandboxプロジェクト入り

    View Slide

  40. 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コマンドを一発打つだけで、
    自動的にイメージのビルドやってくれて超らくちん というデモをしました

    View Slide

  41. 従来のBuildpackとの違い

    View Slide

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

    View Slide

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

    View Slide

  44. Platform
    Lifecycle
    Buildpack

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  56. Platform

    View Slide

  57. Platform

    View Slide

  58. View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  66. 誰もが同じようなことをやる
    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

    View Slide

  67. 誰もが同じようなことをやる
    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酷いですね(笑)
    イメージサイズでかいですよ(笑)
    詳しい人

    View Slide

  68. 誰もが同じようなことをやる
    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酷いですね(笑)
    イメージサイズでかいですよ(笑)
    詳しい人
    クソが
    クソが
    クソが

    View Slide

  69. 誰もが同じようなことをやる
    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酷いですね(笑)
    イメージサイズでかいですよ(笑)
    詳しい人
    クソが
    クソが
    クソが
    コンテナ疲れ™

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  74. もくもく会やってます

    View Slide

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

    View Slide

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

    View Slide