Kf は Buildpack を使用して、アプリケーションのソースコードを実行可能なイメージに変換します。Cloud Native Buildpack は最新の Buildpack API v3 を使用し、VMware や Heroku などの企業は既存の Buildpack に v3 のサポートを積極的に追加しています。
Kf は、Buildpack API 仕様の V2 と V3 の両方に準拠した 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 を使用して独自のビルダー イメージを作成します。pack の create-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 の値が使用されます。
spaceDefaultToV3Stack の config-defaults 値 | 
スペースの spec.buildConfig.defaultToV3Stack | 
デフォルトのスタック | 
|---|---|---|
| 未設定 | 未設定 | V2 | 
"false" | 
未設定 | V2 | 
"true" | 
未設定 | V3 | 
| 任意 | false | 
V2 | 
| 任意 | true | 
V3 |