自訂堆疊和建構套件

Kf 會使用 Buildpacks 將應用程式的原始碼轉換為可執行的映像檔。Cloud Native Buildpacks 使用最新的 Buildpack API v3,而 VMware 和 Heroku 等公司也積極為現有 Buildpack 新增 v3 支援。

Kf 支援符合 Buildpack API 規格的 V2V3 的 Buildpack。

比較 V2 和 V3 buildpacks

V2 Buildpacks V3 Buildpacks
其他名稱 Cloud Foundry Buildpack 雲端原生 Buildpacks (CNB)、建構工具映像檔
狀態 正在取代 目前
成本 Cloud Foundry Buildpacks.io
堆疊 由建構工具和執行階段共用 可選為建構工具和執行階段提供不同的值
本機開發 不可行 可以,只要使用 pack CLI
自訂建構套件 可在執行階段使用 必須建構至建構工具

Buildpack 生命週期

步驟 Cloud Foundry Kf 與 Buildpacks V2 Kf 與 Buildpacks V3
來源位置 BITS 服務 Container Registry Container Registry
Buildpack 位置 BOSH/HTTP HTTP Container Registry
堆疊位置 BOSH Container Registry Container Registry
結果 滴流 (沒有堆疊的應用程式二進位檔) 圖片 (Droplet 在堆疊上) 圖片
執行階段 水滴黏在堆疊上方並執行 執行產生的映像檔 執行產生的映像檔

在建構程序中,Kf 一律會產生完整的可執行映像檔。另一方面,Cloud Foundry 會在建構期間產生可執行映像檔的部分,其餘部分則會在執行階段新增。

Kf 選擇採用一律產生完整圖片的模型,原因如下:

  • 您可以匯出映像檔、在本機上執行,並靜態檢查
  • 運用二進位授權等工具,提升安全性和稽核功能
  • 可重現應用程式部署作業

Kf 和 Buildpacks

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 部分下方,有三個欄位可供查看:

  • Buildpacks V2 包含 V2 相容的 Buildpacks 清單,並按照執行順序列出
  • 堆疊 V2 會指出可用來觸發 V2 建構包建構作業的堆疊
  • 堆疊 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 建構映像檔已內建建構包,因此您必須使用 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 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

如要修改 Kf 以使用 Heroku 發布的堆疊,請編輯 kf 命名空間中的 config-defaults ConfigMap。在 spaceStacksV3 索引鍵中新增項目,如下所示:

kubectl edit kfsystem kfsystem
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 的建構工具」說明文件建立自己的建構工具映像檔。建立後,請將其推送至容器登錄檔,並使用該檔案新增至 config-defaults ConfigMap。

設定預設堆疊

如果應用程式未在資訊清單中提供預設堆疊,系統會為其指派預設堆疊。預設堆疊是 V2 或 V3 堆疊清單中的第一個堆疊。除非覆寫,否則會選擇 V2 堆疊,以便與 Cloud Foundry 相容。

您可以強制 Kf 使用 V3 堆疊,而非 V2,方法是在 kf 命名空間的 config-defaults ConfigMap 中,將 spaceDefaultToV3Stack 欄位設為 "true"

kubectl edit configmap config-defaults -n kf
spaceDefaultToV3Stack: "true"

您也可以針對每個聊天室修改這個選項,方法是將 spec.buildConfig.defaultToV3Stack 欄位設為 truefalse。如果未設定,系統會使用 config-defaults ConfigMap 中的值。

spaceDefaultToV3Stackconfig-defaults 聊天室的 spec.buildConfig.defaultToV3Stack 預設堆疊
未設定 未設定 V2
"false" 未設定 V2
"true" 未設定 V3
any false V2
any true V3