自定义堆栈和 Buildpack

Kf 使用 Buildpack 将应用的源代码转换为可执行映像。Cloud Native Buildpack 使用最新的 Buildpack API v3,而 Vmware 和 Heroku 等公司正在积极向现有版本中添加 v3 支持。

Kf 支持同时符合 BuildBuild API 规范的 V2V3 的 Buildpack。

V2 和 V3 Buildpack 的比较

V2 Buildpack V3 Buildpack
姓名别称 Cloud Foundry Buildpack Cloud Native Buildpacks (CNB),构建器映像
状态 正在被替换 当前
所有权 Cloud Foundry Buildpacks.io
堆栈 由构建器和运行时共享 (可选)构建器和运行时不同
本地开发 不可行 是,使用 pack CLI
自定义 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 选择遵循始终生成完整映像的模型,原因如下:

  • 映像可以导出、在本地运行以及静态检查
  • 利用二进制授权等工具提高安全性和审核质量
  • 应用部署可重现

Kf 和 Buildpack

Kf 将其 Buildpack 和堆栈的全局列表存储在 config-defaults ConfigMap 的 kf Namespace 中。每个空间都在其状态字段中反映这些 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兼容的 Buildpack 的运行顺序列表。
  • Stacks V2 指示可以选择用于触发 V2 Buildpack 版本的堆栈
  • Stacks 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。您还可以使用其他作者发布的构建器映像。

使用第三方构建器映像

发布的 CNB 堆栈列表可在 Buildpack CLI pack 中找到。截止到撰写本文之时,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 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 并使用它添加到 config-defaults ConfigMap。

设置默认堆栈

如果应用未在其清单中提供,则系统会为其分配一个默认堆栈。默认堆栈是 V2 或 V3 堆栈列表中的第一个堆栈。除非被替换,否则系统会选择 V2 堆栈与 Cloud Foundry 兼容。

您可以通过将 kf 命名空间的 config-defaults ConfigMap 中的 spaceDefaultToV3Stack 字段设置为 "true" 来强制 Kf 使用 V3 堆栈,而不是 V2 堆栈:

$ kubectl edit configmap config-defaults -n kf

spaceDefaultToV3Stack: "true"

也可以通过将 spec.buildConfig.defaultToV3Stack 字段设置为 truefalse 来逐个更改此选项。如果未设置,将使用 config-defaults ConfigMap 中的值。

spaceDefaultToV3Stackconfig-defaults 空间的 spec.buildConfig.defaultToV3Stack 默认堆栈
unset unset V2
"false" unset V2
"true" unset V3
任何 false V2
任何 true V3