比較 V2 與 V3 Buildpacks

Buildpack 可將原始碼轉換為可執行檔,並提供簡單、可靠且可重複執行的容器建立方式。Kf 支援 V2 和 V3 建構包,因此請務必瞭解兩者的差異。

V2 buildpacks

大多數 Cloud Foundry 應用程式都已使用 V2 建構包。使用 Kf 搭配 V2 建構包時,系統會從 Git 網址下載並設定生命週期二進位檔和建構包。接著,Kf 會使用 lifecycle CLI 針對原始碼執行每個建構包。

優點

  • 無須變更管道或程式碼,即可立即使用。

缺點

  • 舊版 Buildpack,已由 V3 取代。
  • 效能和穩定性較差。Kf 建構管道需要更多 I/O 才能處理 V2 建構包。
  • 社群資源較少。
  • Kf 僅支援 OSS Git 存放區。

V3 buildpacks

V3 Buildpacks 是 Cloud Native Computing Foundation (CNCF) 專案,具有明確的規格、CLI (pack),以及不斷成長的社群,專門針對不同語言和架構進行創新。 Google Cloud 也有自己的 Google Cloud Buildpacks

V3 建構包有兩個主要的 OCI 容器:

  • 建構工具映像檔
  • 執行映像檔

建構工具映像檔

在原始碼建構為可執行容器時,會使用建構工具映像檔。映像檔包含編譯原始碼所需的 detect 指令碼和其他公用程式。

執行映像檔

執行映像檔是容器建構時所用的基礎映像檔。也就是說,這是應用程式執行時會執行的基本映像檔。

資料層

V3 建構包會使用層來組合最終容器。每個建構包都會在建構期間有機會操控應用程式的檔案系統和環境變數。這種分層方法可讓建構包變得更精簡、更通用。

V3 建構包是根據 OCI 容器建構而成。這項操作要求 V3 建構工具映像檔必須儲存在 Kf 建構管道可存取的容器註冊資料庫中。建構管道會使用建構工具映像檔套用基礎指令碼,將原始碼建構為可執行的容器。

優點

缺點

  • 可能需要更新程式碼/程序。舉例來說,Java 建構包需要原始碼,而 V2 建構包則需要 JAR 檔案。
  • V3 建構包較新,可能需要額外驗證 (使用社群開發的建構包)。

Kf 堆疊

查看分疊

推送應用程式時,建構管道會根據所選堆疊 (透過 --stack 標記或資訊清單指定) 決定 Buildpack。

如要查看聊天室可用的 Stack,請先確認指定的聊天室:

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 buildpacks 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

這個新堆疊現在可以推送:

kf push myapp --stack google

本範例會設定 Ruby V2 建構包,並將建構管道預設值設為使用 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 提供 V3 堆疊,可使用名為 kf-v2-to-v3-shim 的堆疊,建構以標準 V2 Buildpacks 建構的應用程式。kf-v2-to-v3-shim 堆疊會按照 標準 V3 Buildpack API 建立。每個 Kf 版本都會按照標準 Buildpack 程序建立 Google 維護的建構工具映像檔。建構工具映像檔會匯總由 kf wrap-v2-buildpack 指令所用相同程序建立的 V3 建構包清單。系統會使用標準的 V2 建構包映像檔建立 V3 建構包映像檔。請注意,V3 建構包不包含參照的 V2 建構包的二進位檔。而是會參照 V2 建構包映像檔,並在應用程式建構期間下載位元 (執行 kf push)。

在應用程式建構期間,系統會從對應的 Git 存放區下載 V2 建構包。當 V3 偵測功能執行時,系統會將偵測工作委派給下載的 V2 偵測指令碼。對於通過偵測的第一個 Buildpack 群組,系統會繼續執行建構步驟,將建構執行作業委派給下載的 V2 建構工具指令碼。

kf-v2-to-v3-shim 堆疊支援下列 V2 建構包:

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 Buildpacks 建構的應用程式

如要使用 kf-v2-to-v3-shim 堆疊建構應用程式,請使用下列指令:

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

kf-v2-to-v3-shim 堆疊會自動偵測使用包裝的 V2 建構包的執行階段。產生的應用程式映像檔會使用 V3 標準和建構管道建立,但使用的是等效的 V2 建構包建構工具。

選項 2:遷移使用自訂 V2 Buildpacks 建構的應用程式

Kf 提供 Buildpack 遷移工具,可將 V2 Buildpack 包裝成 V3 Buildpack。這樣一來,您就能在 V3 建構包可用的任何地方使用這個包裝的建構包。

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 建構包。