Kf 使用 Buildpack 将应用的源代码转换为可执行映像。Cloud Native Buildpack 使用最新的 Buildpack API v3,而 Vmware 和 Heroku 等公司正在积极向现有版本中添加 v3 支持。
Kf 支持符合 BuildBuild API 规范的 V2 和 V3 的 Buildpack。
V2 和 V3 Buildpack 的比较
| V2 Buildpack | V3 Buildpack | |
|---|---|---|
| 姓名别称 | Cloud Foundry Buildpack | Cloud Native Buildpacks (CNB),构建器映像 | 
| 状态 | 正在被替换 | 当前 | 
| 所有权 | Cloud Foundry | Buildpacks.io | 
| 栈 | 由构建器和运行时共享 | (可选)构建器和运行时不同 | 
| 本地开发 | 不可行 | 是,使用 packCLI | 
| 自定义 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 字段设置为 true 或 false 来逐个更改此选项。如果未设置,将使用 config-defaults ConfigMap 中的值。
| spaceDefaultToV3Stack的config-defaults值 | 空间的 spec.buildConfig.defaultToV3Stack | 默认堆栈 | 
|---|---|---|
| unset | unset | V2 | 
| "false" | unset | V2 | 
| "true" | unset | V3 | 
| 任意 | false | V2 | 
| 任意 | true | V3 |