CN Buildpacksが作る未来

CN Buildpacksが作る未来

builderscon 2019でトークした内容です。以下CFP抜粋

CloudNative Buildpacksは従来、HerokuやCloud Foundationを中心に利用されていたBuildpacksがCNCF Sandboxに追加され、Herokuを中心に仕様を策定したCN Buildpack v3 Lifecycleがリリースされています。

Buildpacksはアプリケーションコードを元に必要なミドルウェアやコンフィグを自動でインストールし、アプリケーションが動作する環境をアプリケーションエンジニアが意識することなく開発できる体験を提供します。
具体的にはアプリケーションリポジトリにindex.phpがあればPHPをインストールするというようにリポジトリにあるソースから必要なミドルウェア、コンフィグが判断されます。

話し手はGMOペパボにおいて、全社で利用できるBuildpacksリポジトリを開発、運用しており、アプリケーションリポジトリでmake build を実行するだけで、そのアプリケーションが動作するコンテナイメージが作成されるという仕組みを構築しています。

今後マイクロサービス化がより加速していくと、それに伴い多くの実行環境を準備する必要があるので、Buildpacksのビルドの仕組み、またはそれを構築したノウハウはこのセッションを聴いてくださる方々にとって今後必要になる知識だと思います。

Buildpacksを使ったことがない方、またCN Buildpacksを検討している方はぜひこのセッションを聞きに来てください。

1b838da2065660793d5b26f2cdc32de7?s=128

Kazuhiko Yamashita

August 30, 2019
Tweet

Transcript

  1. 5.

    -JOVY MJCOTTTUOT JEFYBNQMF VJE FYBNQMF HJE FYBNQMF HSPVQT FYBNQMF VTFS

    OBNFFYBNQMF <\ OBNFFYBNQMF  JE   ^> γϯϓϧͰࣗ༝౓ͷߴ͍ઃܭ αʔό࣮૷΋͍ΘΏΔ3&45GVM෩ɺMJCOTTTUOT͔Β೚ҙͷίϚϯυΛ࣮ߦͨ͠ ݁ՌΛར༻Ͱ͖Δ࢓૊Έ΋͋ΔͷͰΫϥΠΞϯτଆͷ֦ு΋ࣗ༝ࣗࡏ <VTFSTFYBNQMF> JE LFZT<TTI> HSPVQ@JE TUOTDPOG
  2. 6.

    EPDLFSSVOOBNFTUOTETUOTTUOTMBUFTU EPDLFSFYFDJUTUOTCJOCBTI JEFYBNQMF VJE FYBNQMF HJE FYBNQMF HSPVQT FYBNQMF ͙͢ʹࢼͤ·͢

    DVSMGT4-IUUQTSFQPTUOTKQTDSJQUTZVNSFQPTIcTI DVSMGT4-IUUQTSFQPTUOTKQTDSJQUTBQUSFQPTIcTI %PDLFS $FOU04 VCVOUVEFCJBO
  3. 20.
  4. 21.

    ϏϧυͷྲྀΕ "QQMJDBUJPO $PEF #VJMEFS*NBHF SVCZDOC OPEFDOC 3VO*NBHF "QQMJDBUJPO $PEF SVCZMBZFS

    QBDLCVJME QIQDOC CVJME CVJME FYQPSU #VJMEFS*NBHFͰ"TTFUTΛ#VJME͠ɺ ࡞੒͞ΕͨMBZFSΛ3VO*NBHFʹॏͶΔ
  5. 22.
  6. 23.

    % pack create-builder <builder name> \ --builder-config builder.toml $ docker

    push <builder name> #VJMEFSͷCVJME #VJMEFSࣗ਎΋Πϝʔδͱͯ͠
 CVJMEͰ͖Δ͔ΒՄൖੑ͕ߴ͍
  7. 24.
  8. 30.

    w ίϯςφΠϝʔδʹอଘ͞Ε͍ͯΔϝλσʔλ͔Βࠩ෼Λ ݕग़͠ɺݱࡏͷࢿ࢈ͱൺֱ͠ɺ#VJMEͷ࠷దԽΛߦ͏ "OBMZ[F % docker inspect <image_id> | jq

    -r '.[].Config.Labels' # snip "buildpacks": [ { "key": "com.examples.buildpacks.ruby", "version": "0.0.1", "layers": { "ruby": { "sha": "sha256:xxxxxxxxxx", ]
  9. 32.

    #VJMEόΠφϦɺ"TTFUT MBZFST SVCZDOC QIQDOC 3VCZΛల։͍ͨ͠ྫ SVCZ # rubyΛμ΢ϯϩʔυ͢Δ % wget

    -q -O - "$ruby_url" | tar -xzf - -C "/layers/ ruby-cnb/ruby" # /layers/<layer>/<layerͱͯ͠࢒͍ͨ͠σΟϨΫτϦ໊>.toml % echo -e 'launch = true' > /layers/ruby-cnb/ruby.toml
  10. 33.

    Launch Layers A buildpack MAY specify that a <layers>/<layer>/ directory

    is a launch layer by placing launch = true in <layers>/ <layer>.toml. The lifecycle MUST include each launch layer in the built OCI image. The lifecycle MUST also store the Layer Content Metadata associated with each layer so that it can be recovered using the layer Diff ID. IUUQTHJUIVCDPNCVJMEQBDLTQFDCMPCNBTUFSCVJMEQBDLNEFOWJSPONFOU
  11. 34.

    Build Layers A buildpack MAY specify that a <layers>/<layer>/ directory

    is a build layer by placing build = true in <layers>/ <layer>.toml. The lifecycle MUST make all build layers accessible to subsequent buildpacks as described in the Environment section. IUUQTHJUIVCDPNCVJMEQBDLTQFDCMPCNBTUFSCVJMEQBDLNEFOWJSPONFOU
  12. 36.

    #VJME؀ڥม਺ͷఆٛ MBZFST SVCZDOC QIQDOC ؀ڥม਺Λ௥Ճ͍ͨ͠έʔε SVCZ % echo $PATH /layers/ruby-cnb/ruby/bin

    % echo $LD_LIBRARY_PATH /layers/ruby-cnb/ruby/lib % echo "/ruby/bin:" > /layers/ruby-cnb/ruby/env/PATH.append
  13. 38.

    #VJMEىಈίϚϯυͷઃఆ ෳ਺ͷ$/#Λ࣮ߦ͠ಉ͡<UZQF>ͳΒ͹ޙউͪ [[processes]] type = "web" command = "bundle exec

    ruby app.rb" SVCZDOC [[processes]] type = "web" command = "npm start" OQNDOC SVCZDOCͷޙʹ OQNDOCΛ࣮ߦ ⊗ ʮOQNTUBSUʯ͕ ىಈίϚϯυͱͳΔ
  14. 39.

    &YQPSU ݱঢ়ͷMJGFDZDMF࣮૷ͩͱ %PDLFSͷ"1*ʹґଘ͍ͯ͠Δ % docker save test-ruby-app > test-rb.tar %

    tar zxv test-rb.tar % cd f831edb4ae8ed... % tar zxvf layer.tar tar: Removing leading '/' from member names x workspace x workspace/Gemfile x workspace/Gemfile.lock x workspace/app.rb
  15. 40.

    &YQPSU ࢀߟ % docker inspect test-ruby-app | jq . |

    grep RootFS -A10 "RootFS": { "Type": "", "Layers": [ "sha256:f831edb4ae8ed4e9c87d8ec195d98334191fd772c40d7375be1df51443dcf0df", "sha256:ce430ae9aaef0810265eb37e374ec448af547fbf0b391a3879140faaf45391fd", "sha256:0670c818350e963326b7655c0ae7fd2e2438a50a46feb2ffd9b4ae05841c1126", "sha256:b0d2839a2e054261cafa3d694db5e548342785313a282020e3b19704b8995328", "sha256:c8a8ddb80dd9923057bd12f9f69c6b093925a8925f3c37550a88b90f02699aa9", "sha256:512ae48a9f9d01cc9eb6a822660ce2cf3ad5a9c6c6fddc315cdcbb191e3b59a3" ] },
  16. 44.

     ૬ޓʹґଘղܾΛߦ͍ͳ͕ΒɺΞϓ ϦέʔγϣϯΛݩʹϓϩάϥϚϒϧ ʹίϯςφΠϝʔδΛ࡞੒͢Δࣄ͕ Ͱ͖Δ  ىಈίϚϯυ΍؀ڥม਺ͷఆٛ͸ UPNMͰఆΊΒΕͨϑΥʔϚοτʹ ΑͬͯఆٛͰ͖Δ 

    ݴޠͷ$/#ͳͲ͸$MPVE'PVOESZ ͳͲͷઌߦऀ͕044ͱͯ͠ఏڙͯ͠ ͍Δ ͜͜·Ͱͷ·ͱΊ #VJMEFS*NBHF SVCZDOC OPEFDOC QIQDOC CVJME CVJME
  17. 49.

    FROM ubuntu:latest RUN apt install libssl-dev openssl %PDLFSʹ͓͚Δ#BTF*NBHFӡ༻ FYBNQMFCBTFMBUFTU FROM

    example/base:latest(X.X.X) RUN apt install php httpd FYBNQMFPSJHJOMBUFTU 7FSTJPOॻ͍ͪΌ͏ͱɺ CBTF͕ߋ৽͞ΕͨΒશ ෦ͷ%PDLFSpMFॻ͍ͯճ Βͳ͍ͱߦ͚ͳ͍ CBTFͰ0QFO44- ߋ৽͞Ε͚ͨͲपลϥΠϒ ϥϦಈ͘ʁ
  18. 51.

    %PDLFSpMF #VJMEҙࢥܾఆͷҧ͍ $/# %PDLFSpMFʹ0QFO44-Λ ࢖͏ͱॻ͘ EPDLFSCVJME˞ $/#ʹɺ؀ڥʹΑͬͯ 0QFO44-ɺΛ࢖͏
 ίʔυΛॻ͘ QBDLCVJE

    0QFO44-Λ࢖͏Πϝʔδ ര஀ 0QFO44-ɺͷར༻͕ΞϓϦ έʔγϣϯίʔυΛج४ͱͨ͠Ͱҙࢥ ܾఆʹΑͬͯબ͹Εͨϝʔδര஀ ˞ɹϏϧυ࣌ʹ؀ڥม਺ͳͲͰڍಈΛมߋ͢Δ͜ͱ͸΍Ζ͏ͱࢥ͑͹Ͱ͖Δ
  19. 59.
  20. 63.

    ίϚϯυͰΠϝʔδ͕ര஀ PSHBQJ QIQ PSHXXX 1)1 PSHJOGSB 1)1 PSHCMPH 1)1 %

    pack build <image name> --builder xxxx/tech-php-builder:0.0.1 #VJMEFS*NBHFΛϓϥΠϕʔτϨδετϦͰ؅ཧ͍ͯ͠ΔͨΊ ίϚϯυҰͭͰɺͲͷ1)1ϦϙδτϦͰ࣮ߦͯ͠΋࠷దͳΠϝʔδ͕Ͱ͖Δ
  21. 74.
  22. 79.