自訂堆疊和建構套件

Kf 會使用 Buildpacks 將應用程式的原始碼轉換為可執行的映像檔。Cloud Native 建構包會使用最新的 Buildpack API v3。各家公司正積極為現有的 Buildpack 新增 v3 支援。

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

比較 V2 和 V3 buildpacks

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

Buildpack 生命週期

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

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

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

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

Kf 和 Buildpack

Kf 會將全域 Buildpack 和堆疊清單儲存在 kf 命名空間的 config-defaults ConfigMap 中。請在 kfsystem 自訂資源中修改 buildpack 和堆疊屬性,K8s 運算子會根據 kfsystem 中設定的值自動更新 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 發布的堆疊,請編輯 kfsystem 自訂資源,這會自動更新 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 建構工具說明文件建立自己的建構工具映像檔。建立後,請將其推送至容器登錄檔,並新增至 kfsystem 自訂資源。

設定預設堆疊

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

您可以強制 Kf 使用 V3 堆疊,而非 V2,方法是將 kfsystem 自訂資源中的 spaceDefaultToV3Stack 欄位設為 "true" (kfsystem 會自動更新 config-defaults ConfigMap 中的對應 spaceDefaultToV3Stack 欄位):

kubectl edit kfsystem kfsystem
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

後續步驟