V2 与 V3 Buildpack 对比

Buildpack 将源代码转换为可执行文件,用于提供简单、可靠且可重复的容器创建方式。Kf 支持 V2 和 V3 Buildpack,因此您需要了解它们之间的区别。

V2 buildpack

大多数 Cloud Foundry 应用已在使用 V2 Buildpack。将 V2 Buildpack 与 Kf 搭配使用时,系统会从相应的 Git 网址下载和配置生命周期二进制文件和 Buildpack。之后,Kf 会使用 lifecycle CLI 针对源代码执行每个 Buildpack。

优点

  • 开箱即用,无需更改流水线或代码。

缺点

  • 由 V3 代替的旧版 buildpack。
  • 性能和可靠性略低。V2 Buildpack 的 Kf 构建流水线需要更多的 IO。
  • 社区资源略少。
  • Kf 仅支持 OSS Git 代码库。

V3 buildpack

V3 Buildpack 是一个 Cloud Native Computing Foundation (CNCF) 项目,它拥有一个明确定义的规范、一个 CLI (pack) 和一个不断完善的围绕不同语言和框架进行创新的社区。Google Cloud 也有自己的一组 Google Cloud 的 Buildpack

V3 Buildpack 有两个核心 OCI 容器:

  • 构建器映像
  • 运行映像

构建器映像

您需要在将源代码构建到可运行的容器中时使用构建器映像。该映像包含编译源代码所需的 detect 脚本和其他实用程序。

运行映像

运行映像是用以构建容器的基础映像。这意味着,它是应用执行时将运行的基础映像。

V3 Buildpack 使用层来编写最终容器。构建中包含的每个 Buildpack 都有可能会操作应用的文件系统和环境变量。这种分层方法使得 Buildpack 更轻量化且更通用。

V3 Buildpack 基于 OCI 容器构建而成。这要求将 V3 构建器映像存储在 Kf 构建流水线有权访问的 Container Registry 中。构建流水线使用构建器映像来应用底层脚本,将源代码构建到可运行的容器中。

优点

缺点

  • 可能需要更新代码/进程。例如,Java Buildpack 需要源代码,而 V2 Buildpack 则需要 jar 文件。
  • V3 Buildpack 较新,可能需要进行额外的验证(使用社区开发的 Buildpack)。

kf 堆栈

查看堆栈

推送应用时,构建流水线会根据选定的堆栈(通过 --stack 标志或清单指定)确定 Buildpack。

如需查看空间中可用的堆栈,首先请确保定位空间:

kf target -s myspace

然后,您可以使用 kf stacks 子命令列出堆栈:

kf stacks

输出会同时显示 V2 和 V3 堆栈:

Getting stacks in Space: myspace
Version  Name                                Build Image                                                                                          Run Image                                                                                          Description
V2       cflinuxfs3                          cloudfoundry/cflinuxfs3@sha256:5219e9e30000e43e5da17906581127b38fa6417f297f522e332a801e737928f5      cloudfoundry/cflinuxfs3@sha256:5219e9e30000e43e5da17906581127b38fa6417f297f522e332a801e737928f5
V3       org.cloudfoundry.stacks.cflinuxfs3  cloudfoundry/cnb:cflinuxfs3@sha256:f96b6e3528185368dd6af1d9657527437cefdaa5fa135338462f68f9c9db3022  cloudfoundry/run:full-cnb@sha256:dbe17be507b1cc6ffae1e9edf02806fe0e28ffbbb89a6c7ef41f37b69156c3c2  A large Cloud Foundry stack based on Ubuntu 18.04

配置堆栈

您可以通过修改 kfsystem 自定义资源来更新堆栈配置:

kubectl edit kfsystem kfsystem

以下示例设置了 Google Cloud Buildpack V3 堆栈:

spec:
  kf:
    config:
      spaceStacksV3:
      - name: google
        description: Google buildpacks (https://github.com/GoogleCloudPlatform/buildpacks)
        buildImage: gcr.io/buildpacks/builder:v1
        runImage: gcr.io/buildpacks/gcp/run:v1

您现在可以推送此新堆栈:

kf push myapp --stack google

以下示例配置 Ruby V2 buildpack 并将构建流水线默认值设置为使用 V2 堆栈:

spec:
  kf:
    config:
      spaceDefaultToV3Stack: false
      spaceBuildpacksV2:
      - name: ruby_buildpack
        url: https://github.com/cloudfoundry/ruby-buildpack
      spaceStacksV2:
      - name: cflinuxfs3
        image: cloudfoundry/cflinuxfs3@sha256:5219e9e30000e43e5da17906581127b38fa6417f297f522e332a801e737928f5

迁移

注意:此功能目前处于实验阶段,随时可能更改。

Kf 具有可以封装 V2 Buildpack 的迁移工具。结果是可以在 V3 构建器中使用的 V3 Buildpack。之后,您便可以在任何支持 V3 Buildpack 的位置使用该封装的 Buildpack。

kf wrap-v2-buildpack gcr.io/your-project/v2-go-buildpack https://github.com/cloudfoundry/go-buildpack --publish

这将创建一个名为 gcr.io/your-project/v2-go-buildpack 的 Buildpack 映像。之后,您便可以按照创建构建器文档中的说明使用该映像来创建构建器。

此子命令以透明方式使用以下 CLI:

  • go
  • git
  • pack

建议您使用 Cloud Shell Editor 来确保每条子命令在正确的路径上可用且版本正确。

已知问题

以下是无法与 Kf 搭配使用的功能。如果某项功能对您的组织来说具有较高的优先级,请与您的销售代表联系:

  • V3 构建器映像的私有容器注册表。
  • V3 缓存。
  • 需要 Git 凭据的 V2 Buildpack。