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 |
堆栈 | 由构建器和运行时共享 | (可选)构建器和运行时不同 |
本地开发 | 不可行 | 是,使用 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
字段设置为 true
或 false
来逐个更改此选项。如果未设置,将使用 config-defaults
ConfigMap 中的值。
spaceDefaultToV3Stack 的 config-defaults 值 |
空间的 spec.buildConfig.defaultToV3Stack |
默认堆栈 |
---|---|---|
unset | unset | V2 |
"false" |
unset | V2 |
"true" |
unset | V3 |
任何 | false |
V2 |
任何 | true |
V3 |