项目配置

概述

项目配置表示一个 KubeBuilder 项目的配置。所有通过 CLI (KubeBuilder 版本 3.0 及更高版本)搭建的项目将在项目根目录生成 PROJECT 文件。因此,它将存储生成项目和 API 所使用的所有插件和输入数据,以便更好地支持插件在搭建时做出有用的决策。

Example

以下是一个项目配置文件的示例,这是使用部署镜像插件生成的包含两个API的项目的结果。

# 工具生成的代码。请勿编辑。
# 此文件用于跟踪用于搭建您项目的信息
# 并允许插件正常工作。
# 更多信息: https://book.kubebuilder.io/reference/project-config.html
domain: testproject.org
layout:
  - go.kubebuilder.io/v4
plugins:
  部署图像.go.kubebuilder.io/v1-alpha:
    resources:
      - domain: testproject.org
        group: example.com
        kind: Memcached
        选项:
          容器命令: memcached,--memory-limit=64,-o,modern,-v
          容器端口: "11211"
          image: memcached:1.4.36-alpine
          以用户身份运行: "1001"
        version: v1alpha1
      - domain: testproject.org
        group: example.com
        kind: Busybox
        选项:
          image: busybox:1.28
        version: v1alpha1
projectName: 项目-v4-带部署镜像
repo: sigs.k8s.io/kubebuilder/testdata/project-v4-with-deploy-image
resources:
  - api:
      crdVersion: v1
      namespaced: true
    controller: true
    domain: testproject.org
    group: example.com
    kind: Memcached
    path: sigs.k8s.io/kubebuilder/testdata/project-v4-with-deploy-image/api/v1alpha1
    version: v1alpha1
    webhooks:
      validation: true
      webhookVersion: v1
  - api:
      crdVersion: v1
      namespaced: true
    controller: true
    domain: testproject.org
    group: example.com
    kind: Busybox
    path: sigs.k8s.io/kubebuilder/testdata/project-v4-with-deploy-image/api/v1alpha1
    version: v1alpha1
version: "3"

为什么我们需要存储插件和使用的数据?

以下是一些追踪使用输入的动机示例:

  • 检查一个插件是否可以在现有插件的基础上创建(即)插件兼容性,同时将多个插件连接在一起。
  • 可以进行或不能进行的操作,例如验证当前配置是否允许为不同组搭建API的布局。
  • 验证在CLI操作中可以或不能使用哪些数据,例如确保WebHooks只能为已存在的API创建。

请注意,KubeBuilder 不仅是一个 CLI 工具,还可以用作库,让用户创建他们的插件/工具,提供帮助程序和定制,以支持他们现有的项目 - 其中一个例子是 Operator-SDK。SDK 利用 KubeBuilder 创建插件,允许用户使用其他语言,并为用户提供帮助,以便他们将项目与例如 Operator Framework 解决方案/OLM 集成。您可以查看 插件文档 以了解更多关于创建自定义插件的信息。

此外,PROJECT 文件的另一个目的,是帮助我们创建一个功能,使用户能够通过提供自动重新搭建项目的辅助工具,轻松升级他们的项目。PROJECT 文件中包含了有关 API、其配置和版本的所有必要元数据。例如,它可以用于自动化在插件版本之间迁移时重新搭建的过程。 (更多信息)。

版本控制

项目配置是根据其布局进行版本控制的。欲了解更多信息,请参见 版本控制

布局定义

PROJECT 版本 3 的布局如下:

domain: testproject.org
layout:
  - go.kubebuilder.io/v4
plugins:
  部署图像.go.kubebuilder.io/v1-alpha:
    resources:
      - domain: testproject.org
        group: example.com
        kind: Memcached
        选项:
          容器命令: memcached,--memory-limit=64,-o,modern,-v
          容器端口: "11211"
          image: memcached:memcached:1.6.26-alpine3.19
          以用户身份运行: "1001"
        version: v1alpha1
      - domain: testproject.org
        group: example.com
        kind: Busybox
        选项:
          image: busybox:1.36.1
        version: v1alpha1
projectName: 项目-v4-带部署镜像
repo: sigs.k8s.io/kubebuilder/testdata/project-v4-with-deploy-image
resources:
  - api:
      crdVersion: v1
      namespaced: true
    controller: true
    domain: testproject.org
    group: example.com
    kind: Memcached
    path: sigs.k8s.io/kubebuilder/testdata/project-v4-with-deploy-image/api/v1alpha1
    version: v1alpha1
    webhooks:
      validation: true
      webhookVersion: v1
  - api:
      crdVersion: v1
      namespaced: true
    controller: true
    domain: testproject.org
    group: example.com
    kind: Busybox
    path: sigs.k8s.io/kubebuilder/testdata/project-v4-with-deploy-image/api/v1alpha1
    version: v1alpha1
version: "3"

现在让我们检查一下它的布局字段定义:

领域描述
布局定义全局插件,例如,一个项目 init 使用 --plugins="go/v4,deploy-image/v1-alpha" 意味着所使用的任何子命令将始终按顺序调用这两个插件的实现。
存储项目的域名。用户可以在使用 init 子命令和 domain 标志生成项目时提供此信息。
插件定义用于自定义脚手架的插件,例如通过命令 kubebuilder create api [options] --plugins=deploy-image/v1-alpha 使用可选的 deploy-image/v1-alpha 插件仅为特定 API 创建脚手架。
项目名称项目名称。这将用于构建管理器数据。默认情况下,它是项目目录的名称,但用户可以通过 init 子命令中的 --project-name 标志提供该名称。
代码库该项目的代码库是Golang模块,例如 github.com/example/myproject-operator
资源项目中所有搭建的资源数组。
resources.api通过子命令 create api 在项目中搭建的 API。
resources.api.crdVersion用于为 CRD 资源搭建的 Kubernetes API 版本 (apiVersion)。
resources.api.namespacedAPI RBAC 权限可以是命名空间级别或集群级别。
resources.controller指示是否为 API 构建了控制器。
resources.domain在项目初始化时通过 --domain 选项提供的资源域名,或者在为 外部类型 构建控制器时通过 --external-api-domain 选项提供的域名。
resources.group当使用子命令 create api 时,通过 --group 标志提供的资源的 GKV 组。
resources.version当使用子命令 create api 时,通过 --version 标志提供的资源的 GKV 版本。
资源.种类存储 GKV 资源类型,该类型通过执行子命令 create api 时提供的 --kind 标志来指定。
resources.pathAPI资源的导入路径。它将是<repo>/api/<kind>,除非添加到项目中的API是外部API或核心类型的API。对于核心类型的场景,使用的路径在这里进行了映射。或者,可以使用通过标志--external-api-path提供的路径。
resources.core当使用的组来自Kubernetes API并且项目中未定义API资源时,它为“真“。
resources.external当使用标志 --external-api-path 生成 外部类型 的脚手架时,它为 true
resources.webhooks当使用子命令 create webhook 时,请存储网络钩子数据。
resources.webhooks.spoke存储将作为 Spoke 的 API 版本以及用于转换 webhook 的指定 Hub 版本。
resources.webhooks.webhookVersion用于搭建 webhook 资源的 Kubernetes API 版本(apiVersion)。
resources.webhooks.conversion当 webhook 是使用 --conversion 标志搭建时,它为 true,这意味着这是一个转换 webhook。
resources.webhooks.defaulting当 webhook 使用 --defaulting 标志创建时,它是 true,这意味着这是一个默认值 webhook。
resources.webhooks.validation当使用 --programmatic-validation 标志搭建的 webhook 时,它是 true,这意味着它是一个验证 webhook。