V2 と V3 の Buildpack を比較する

Buildpack はソースコードを実行可能に変換します。これにより、信頼性の高いシンプルな方法でコンテナを繰り返し作成できます。Kf は V2 と V3 の Buildpack の両方をサポートしているため、この 2 つの違いを理解しておくことが重要です。

V2 Buildpack

ほとんどの Cloud Foundry アプリケーションでは V2 Buildpack が使用されています。Kf で V2 Buildpack を使用している場合、ライフサイクル バイナリと Buildpack が git URL からダウンロードされて構成されます。Kf は lifecycle CLI を使用して、ソースコードに各 Buildpack を実行します。

長所

  • パイプラインやコードを変更せずに、すぐに使用できる。

短所

  • V3 に置き換えられた従来の Buildpack。
  • パフォーマンスと信頼性が低い。Kf ビルド パイプラインでは、V2 Buildpack 用により多くの I/O が必要になります。
  • コミュニティ リソースが少ない。
  • Kf では OSS Git リポジトリのみがサポートされています。

V3 Buildpack

V3 Buildpack は Cloud Native Computing Foundation(CNCF)のプロジェクトで、仕様、CLI(pack)が明確に定義されています。また、さまざまな言語とフレームワークでイノベーションを推進するコミュニティが存在し、拡大しています。Google Cloud にも独自の Google Cloud の Buildpack が用意されています。

V3 Buildpack には、OCI コンテナが 2 つあります。

  • ビルダー イメージ
  • 実行イメージ

ビルダー イメージ

ビルダー イメージは、ソースコードを実行可能なコンテナにビルドする場合に使用します。イメージには、ソースコードのコンパイルに必要な detect スクリプトとその他のユーティリティが含まれています。

実行イメージ

実行イメージは、コンテナをビルドするベースイメージです。これは、アプリの実行時に使用されるベースイメージになります。

レイヤ

V3 Buildpack は、レイヤを使用して最終的なコンテナを作成します。ビルドに含まれる各 Buildpack でアプリのファイル システムと環境変数を操作できます。このレイヤ化のアプローチにより、Buildpack は細分化され、より汎用的なものとなっています。

V3 Buildpack は、OCI コンテナをベースにビルドされています。このため、Kf ビルド パイプラインからアクセスできる Container Registry に V3 ビルダー イメージを保存する必要があります。ビルド パイプラインは、ビルダー イメージを使用して基盤となるスクリプトを適用し、ソースコードを実行可能なコンテナにビルドします。

長所

短所

  • コードやプロセスの更新が必要になる場合がある。たとえば、Java Buildpack にはソースコードが必要ですが、V2 Buildpack には jar ファイルが必要です。
  • V3 Buildpack は新しいため、追加の検証が必要になることがある(コミュニティで開発された Buildpack を使用)。

Kf スタック

スタックを表示する

アプリを push すると、ビルド パイプラインは、選択したスタック(--stack フラグまたはマニフェストで指定)に基づいて Buildpack を決定します。

スペースで使用可能なスタックを確認するには、まず、スペースがターゲットに設定されていることを確認します。

kf target -s myspace

設定されていれば、kf stacks サブコマンドでスタックを一覧表示できます。

kf stacks

出力には、V2 と V3 の両方のスタックが表示されます。

Getting stacks in Space: myspace
Version  Name                                Build Image                                                                                          Run Image
V2       cflinuxfs3                          cloudfoundry/cflinuxfs3@sha256:5219e9e30000e43e5da17906581127b38fa6417f297f522e332a801e737928f5      cloudfoundry/cflinuxfs3@sha256:5219e9e30000e43e5da17906581127b38fa6417f297f522e332a801e737928f5
V3       kf-v2-to-v3-shim                    gcr.io/kf-releases/v2-to-v3:v2.7.0                                                                   gcr.io/buildpacks/gcp/run:v1                                                                       This is a stack added by the integration tests to assert that v2->v3 shim works
V3       google                              gcr.io/buildpacks/builder:v1                                                                         gcr.io/buildpacks/gcp/run:v1                                                                       Google buildpacks (https://github.com/GoogleCloudPlatform/buildpacks)
V3       org.cloudfoundry.stacks.cflinuxfs3  cloudfoundry/cnb:cflinuxfs3@sha256:f96b6e3528185368dd6af1d9657527437cefdaa5fa135338462f68f9c9db3022  cloudfoundry/run:full-cnb@sha256:dbe17be507b1cc6ffae1e9edf02806fe0e28ffbbb89a6c7ef41f37b69156c3c2  A large Cloud Foundry stack based on Ubuntu 18.04

スタックを構成する

スタックの構成は、kfsystem カスタム リソースを編集することで更新できます。

kubectl edit kfsystem kfsystem

次の例では、Google Cloud Buildpack に V3 スタックを設定します。

spec:
  kf:
    config:
      spaceStacksV3:
      - name: google
        description: Google buildpacks (https://github.com/GoogleCloudPlatform/buildpacks)
        buildImage: gcr.io/buildpacks/builder:v1
        runImage: gcr.io/buildpacks/gcp/run:v1

この新しいスタックを push できるようになりました。

kf push myapp --stack google

次の例では、Ruby V2 Buildpack を構成し、ビルド パイプラインのデフォルトを V2 スタックを使用するように構成します。

spec:
  kf:
    config:
      spaceDefaultToV3Stack: false
      spaceBuildpacksV2:
      - name: ruby_buildpack
        url: https://github.com/cloudfoundry/ruby-buildpack
      spaceStacksV2:
      - name: cflinuxfs3
        image: cloudfoundry/cflinuxfs3@sha256:5219e9e30000e43e5da17906581127b38fa6417f297f522e332a801e737928f5

V2 から V3 への Buildpack の移行

Kf には、標準の V2 Buildpack でビルドされたアプリケーションをビルドできるように V3 スタックが用意されています。このビルドでは、kf-v2-to-v3-shim という名前のスタックが使用されます。kf-v2-to-v3-shim スタックは、標準の V3 Buildpacks API に従って作成されます。Google が維持するビルダー イメージは、標準の Buildpack プロセスに従い、Kf の各リリースを使用して作成されます。ビルダー イメージは、kf wrap-v2-buildpack コマンドと同じプロセスで作成された V3 Buildpack のリストを集約します。V3 Buildpack イメージは、標準の V2 Buildpack イメージを使用して作成されます。ただし、V3 Buildpack には、参照される V2 Buildpack のバイナリが含まれていません。代わりに、V2 Buildpack イメージが参照され、バイナリは(kf push を実行して)アプリのビルド時にダウンロードされます。

V2 Buildpack は、アプリのビルド時に、対応する git リポジトリからダウンロードされます。V3 の検出が動作すると、ダウンロードした V2 検出スクリプトに実行が移ります。検出に成功した最初の Buildpack グループはビルドステップに進み、ダウンロードした V2 ビルダー スクリプトに実行が移ります。

kf-v2-to-v3-shim スタックでは、次に挙げる V2 Buildpack がサポートされています。

Buildpack Git リポジトリ
java_buildpack https://github.com/cloudfoundry/java-buildpack
dotnet_core_buildpack https://github.com/cloudfoundry/dotnet-core-buildpack
nodejs_buildpack https://github.com/cloudfoundry/nodejs-buildpack
go_buildpack https://github.com/cloudfoundry/go-buildpack
python_buildpack https://github.com/cloudfoundry/python-buildpack
binary_buildpack https://github.com/cloudfoundry/binary-buildpack
nginx_buildpack https://github.com/cloudfoundry/nginx-buildpack

オプション 1: 標準の V2 Buildpack を使用してビルドされたアプリを移行する

kf-v2-to-v3-shim スタックを使用してアプリをビルドするには、次のコマンドを使用します。

kf push myapp --stack kf-v2-to-v3-shim

kf-v2-to-v3-shim スタックは、ラップされた V2 Buildpack を使用してランタイムを自動的に検出します。結果として生成されるアプリイメージは、V3 標準ビルドとビルド パイプラインを使用して作成されますが、これは同等の V2 Buildpack のビルダーとなります。

オプション 2: カスタム V2 Buildpack を使用してビルドされたアプリを移行する

Kf には Buildpack 移行ツールが用意されています。このツールを使用すると、V2 Buildpack を V3 Buildpack でラップできます。ラップされた Buildpack は、V3 Buildpack が利用可能な場所であればどこでも使用できます。

kf wrap-v2-buildpack gcr.io/your-project/v2-go-buildpack https://github.com/cloudfoundry/go-buildpack --publish

これにより、gcr.io/your-project/v2-go-buildpack という名前の Buildpack イメージが作成されます。その後、ビルダーの作成に関するドキュメントの手順に沿ってビルダーを作成できます。

このサブコマンドは、次の CLI を透過的に使用します。

  • go
  • git
  • pack
  • unzip

Cloud Shell エディタで、各サブコマンドが正しいパスで利用可能であり、正しいバージョンであることを確認することをおすすめします。

既知の問題

次の機能は Kf でまだ使用できません。この中に組織で優先度が高いものがある場合は、営業担当者にお問い合わせください。

  • V3 ビルダー イメージの非公開コンテナ レジストリ。
  • V3 キャッシュ。
  • git 認証情報が必要な V2 Buildpack。