Kf 使用 Buildpack 将应用的源代码转换为可执行映像。Cloud Native Buildpack 使用最新的 Buildpack API v3。公司正在积极向现有 Buildpack 中添加 v3 支持。
Kf 支持同时符合 V2 和 V3 Buildpack API 规范的 Buildpack。
比较 V2 和 V3 Buildpack
V2 buildpack | V3 buildpack | |
---|---|---|
姓名别称 | Cloud Foundry Buildpack | Cloud Native Buildpack (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 和堆栈属性的修改应在 kfsystem
自定义资源中完成,Kf 运算符会根据在 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兼容的 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 发布的堆栈,请修改 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
来处理构建器文档来创建您自己的构建器映像。创建完成后,将其推送到 Container Registry,并将其添加到 kfsystem
自定义资源中。
设置默认堆栈
如果应用未在其清单中提供,则系统会为其分配一个默认堆栈。默认堆栈是 V2 或 V3 堆栈列表中的第一个堆栈。除非被替换,否则系统会选择 V2 堆栈与 Cloud Foundry 兼容。
您可以通过将 kfsystem
自定义资源中的 spaceDefaultToV3Stack
字段设置为 "true"
(kfsystem
会自动更新 config-defaults
ConfigMap 中相应的 spaceDefaultToV3Stack
),来强制 Kf 使用 V3 堆栈而不是 V2:
kubectl edit kfsystem kfsystem
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 |