スタックと Buildpack のカスタマイズ

Kf は Buildpack を使用して、アプリケーションのソースコードを実行可能なイメージに変換します。Cloud Native Buildpack は最新の Buildpack API v3 を使用し、VMware や Heroku などの企業は既存の Buildpack に v3 のサポートを積極的に追加しています。

Kf は、Buildpack API 仕様の V2V3 の両方に準拠した Buildpack をサポートしています。

V2 と V3 の Buildpack の比較

V2 Buildpack V3 Buildpack
代替名 Cloud Foundry Buildpack Cloud Native Buildpack(CNB)、ビルダー イメージ
ステータス 置き換えられる予定 現在
オーナー権限 Cloud Foundry Buildpacks.io
Stack ビルダーとランタイムで共有 必要に応じて、ビルダーとランタイムで異なる
ローカルでの開発 なし pack CLI を使用して可能
Custom Buildpack ランタイム時に利用可能 ビルダーに組み込む必要があり

Buildpack のライフサイクル

ステップ Cloud Foundry Buildpack V2 を使用した Kf Buildpack V3 を使用した Kf
ソースの場所 BITS サービス Container Registry Container Registry
Buildpack のロケーション BOSH / HTTP HTTP Container Registry
スタックのロケーション BOSH Container Registry Container Registry
結果 Droplet(スタックのないアプリバイナリ) イメージ(スタック上の Droplet) イメージ
ランタイム Droplet がスタックに付けられ、実行される 実行で生成されるイメージ 実行で生成されるイメージ

Kf は、ビルドプロセスの結果として常に完全な実行可能イメージを生成します。一方、Cloud Foundry はビルド時に実行可能イメージの一部を生成し、残りはランタイム時に追加されます。

kf は、次の理由で完全なイメージを常に生成するモデルを採用しました。

  • イメージのエクスポート、ローカルでの実行、静的な検査が可能
  • Binary Authorization などのツールによるセキュリティと監査の向上
  • アプリのデプロイが再現可能

Kf と Buildpack

Kf は、Buildpack とスタックのグローバル リストを kf 名前空間の config-defaults ConfigMap に保存します。各空間のステータス フィールドに、これらの Buildpack が反映されます。buildpack-docs という名前の空間の場合、次のコマンドを実行して、完全な空間の構成を確認できます。

$ kf space buildpack-docs

Getting Space buildpack-docs
API Version:  kf.dev/v1alpha1
Kind:         Space
Metadata:
  Creation Timestamp:  2020-02-14T15:09:52Z
  Name:                buildpack-docs
  Self Link:           /apis/kf.dev/v1alpha1/spaces/buildpack-docs
  UID:                 0cf1e196-4f3c-11ea-91a4-42010a80008d
Status:
  Build Config:
    Buildpacks V2:
    - Name:      staticfile_buildpack
      URL:       https://github.com/cloudfoundry/staticfile-buildpack
      Disabled:  false
    - Name:      java_buildpack
      URL:       https://github.com/cloudfoundry/java-buildpack
      Disabled:  false
    Stacks V2:
    - Image:  cloudfoundry/cflinuxfs3
      Name:   cflinuxfs3
    Stacks V3:
    - Build Image:  cloudfoundry/cnb:cflinuxfs3
      Description:  A large Cloud Foundry stack based on Ubuntu 18.04
      Name:         org.cloudfoundry.stacks.cflinuxfs3
      Run Image:    cloudfoundry/run:full-cnb

Build Config セクションには、次の 3 つの項目があります。

  • Buildpack V2 には、V2 互換の Buildpack のリストが実行順に表示されます。
  • スタック V2 は、V2 Buildpack のビルドをトリガーするために選択できるスタックを示します。
  • スタック V3 は、V3 Buildpack のビルドをトリガーするために選択できるスタックを示します。

kf stacks でスタックの一覧表示も行えます。

$ kf stacks

Getting stacks in Space: buildpack-docs
Version  Name                                Build Image                  Run Image                  Description
V2       cflinuxfs3                          cloudfoundry/cflinuxfs3      cloudfoundry/cflinuxfs3
V3       org.cloudfoundry.stacks.cflinuxfs3  cloudfoundry/cnb:cflinuxfs3  cloudfoundry/run:full-cnb  A large Cloud Foundry stack based on Ubuntu 18.04

V3 ビルドイメージには Buildpack が組み込まれているため、リストを取得するには kf buildpacks を使用する必要があります。

$ kf buildpacks

Getting buildpacks in Space: buildpack-docs
Buildpacks for V2 stacks:
  Name                   Position  URL
  staticfile_buildpack   0         https://github.com/cloudfoundry/staticfile-buildpack
  java_buildpack         1         https://github.com/cloudfoundry/java-buildpack
V3 Stack: org.cloudfoundry.stacks.cflinuxfs3:
  Name                                        Position  Version     Latest
  org.cloudfoundry.jdbc                       0         v1.0.179    true
  org.cloudfoundry.jmx                        1         v1.0.180    true
  org.cloudfoundry.go                         2         v0.0.2      true
  org.cloudfoundry.tomcat                     3         v1.1.102    true
  org.cloudfoundry.distzip                    4         v1.0.171    true
  org.cloudfoundry.springboot                 5         v1.1.2      true
  ...

V3 Buildpack のカスタマイズ

デベロッパーがアクセスできる Buildpack をカスタマイズするには、デベロッパーがアクセスできる Buildpack のみを使用して独自のビルダー イメージを作成します。他の作成者が公開したビルダー イメージを使用することもできます。

サードパーティのビルダー イメージを使用する

Buildpack CLI pack から、公開された CNB スタックのリストを利用できます。現時点で、pack suggest-stacks の出力は次のようになります。

$ pack suggest-stacks

Stacks maintained by the community:

    Stack ID: heroku-18
    Description: The official Heroku stack based on Ubuntu 18.04
    Maintainer: Heroku
    Build Image: heroku/pack:18-build
    Run Image: heroku/pack:18

    Stack ID: io.buildpacks.stacks.bionic
    Description: A minimal Cloud Foundry stack based on Ubuntu 18.04
    Maintainer: Cloud Foundry
    Build Image: cloudfoundry/build:base-cnb
    Run Image: cloudfoundry/run:base-cnb

    Stack ID: org.cloudfoundry.stacks.cflinuxfs3
    Description: A large Cloud Foundry stack based on Ubuntu 18.04
    Maintainer: Cloud Foundry
    Build Image: cloudfoundry/build:full-cnb
    Run Image: cloudfoundry/run:full-cnb

    Stack ID: org.cloudfoundry.stacks.tiny
    Description: A tiny Cloud Foundry stack based on Ubuntu 18.04, similar to distroless
    Maintainer: Cloud Foundry
    Build Image: cloudfoundry/build:tiny-cnb
    Run Image: cloudfoundry/run:tiny-cnb

Heroku によって公開されたスタックを使用するように Kf を変更するには、kf 名前空間の config-defaults ConfigMap を編集します。次のようなエントリを spaceStacksV3 キーに追加します。

$ kubectl edit configmap config-defaults -n kf

spaceStacksV3: |
  - name: org.cloudfoundry.stacks.cflinuxfs3
    description: A large Cloud Foundry stack based on Ubuntu 18.04
    buildImage: cloudfoundry/cnb:cflinuxfs3
    runImage: cloudfoundry/run:full-cnb
  - name: heroku-18
    description: The official Heroku stack based on Ubuntu 18.04
    buildImage: heroku/pack:18-build
    runImage: heroku/pack:18

その後、stacks を再度実行します。

$ kf stacks

Getting stacks in Space: buildpack-docs
Version  Name                                Build Image                  Run Image                  Description
V2       cflinuxfs3                          cloudfoundry/cflinuxfs3      cloudfoundry/cflinuxfs3
V3       org.cloudfoundry.stacks.cflinuxfs3  cloudfoundry/cnb:cflinuxfs3  cloudfoundry/run:full-cnb  A large Cloud Foundry stack based on Ubuntu 18.04
V3       heroku-18                           heroku/pack:18-build         heroku/pack:18             The official Heroku stack based on Ubuntu 18.04

独自のビルダー イメージを作成する

Buildpack CLI pack を使用して独自のビルダー イメージを作成します。packcreate-builder を使用したビルダーの操作ドキュメントに従って、独自のビルダー イメージを作成できます。作成したら、Container Registry に push して、config-defaults ConfigMap に追加します。

デフォルト スタックの設定

マニフェストで指定されていない場合、アプリにはデフォルト スタックが割り当てられます。デフォルト スタックは、V2 または V3 スタックリストの先頭にあるものです。オーバーライドされない限り、Cloud Foundry との互換性のために V2 スタックが選択されます。

kf 名前空間の config-defaults ConfigMap の spaceDefaultToV3Stack フィールドを "true" に設定することで、V2 ではなく V3 スタックの使用を Kf に強制できます。

$ kubectl edit configmap config-defaults -n kf

spaceDefaultToV3Stack: "true"

このオプションは、spec.buildConfig.defaultToV3Stack フィールドを true または false に変更することで、スペースごとに変更できます。設定しない場合は、config-defaults ConfigMap の値が使用されます。

spaceDefaultToV3Stackconfig-defaults スペースの spec.buildConfig.defaultToV3Stack デフォルトのスタック
未設定 未設定 V2
"false" 未設定 V2
"true" 未設定 V3
任意 false V2
任意 true V3