从单 Group 迁移到多 Group(Multi-Group)

下面以 CronJob 示例 进行迁移演示。

将项目切换为多 Group 布局: 运行 kubebuilder edit --multigroup=true。切换后,新建的 Kind 会按多 Group 布局生成;但已有的 API 组需手动迁移到新布局。

通常我们以 API 组前缀作为目录名。可查看 api/v1/groupversion_info.go 获取组名:

// +groupName=batch.tutorial.kubebuilder.io
package v1

然后,将现有 API 移动到以组名命名的子目录下。以 CronJob 示例 为例,子目录为 “batch”:

mkdir api/batch
mv api/* api/batch

API 移动后,Controller 也需按相同规则迁移(以 go/v4 为例):

mkdir internal/controller/batch
mv internal/controller/* internal/controller/batch/

已有的 Webhook 亦需同样处理:

mkdir internal/webhook/batch
mv internal/webhook/* internal/webhook/batch/

后续为新组创建的 Webhook,会生成在 internal/webhook/<group>/ 下。

接着,更新对旧包路径的所有引用。以 CronJob 为例,需调整 main.gocontrollers/batch/cronjob_controller.go 中的导入路径,指向新结构下的位置。

如果项目中还有其它自定义文件,也需要同步修正导入路径。

最后手动修正 PROJECT 文件。kubebuilder edit --multigroup=true 仅开启多 Group,不会修复已存在 API 的 path。需要为每个资源更新其路径。

例如,原文件:

# Code generated by tool. DO NOT EDIT.
# This file is used to track the info used to scaffold your project
# and allow the plugins properly work.
# More info: https://book.kubebuilder.io/reference/project-config.html
domain: tutorial.kubebuilder.io
layout:
- go.kubebuilder.io/v4
multigroup: true
projectName: test
repo: tutorial.kubebuilder.io/project
resources:
- api:
    crdVersion: v1
    namespaced: true
  controller: true
  domain: tutorial.kubebuilder.io
  group: batch
  kind: CronJob
  path: tutorial.kubebuilder.io/project/api/v1beta1
  version: v1beta1
version: "3"

需将 path: tutorial.kubebuilder.io/project/api/v1beta1 替换为 path: tutorial.kubebuilder.io/project/api/batch/v1beta1

对于非新建项目,已实现的旧 API 也需按需调整。 注意在多 Group 布局下,Kind 的 API 文件位置为 api/<group>/<version>(而非 api/<version>);控制器位置为 internal/controller/<group>(而非 internal/controller)。

这就是我们需要把既有 API/Controller 移动到新结构对应位置的原因。别忘了同步更新导入路径。

为使 envtest 能正确安装 CRD 到测试环境,需要在每个 internal/controller/<group>/suite_test.go 中更新 CRD 目录的相对路径,多加一层 "..",例如:

    By("bootstrapping test environment")
    testEnv = &envtest.Environment{
        CRDDirectoryPaths: []string{filepath.Join("..", "..", "config", "crd", "bases")},
    }

CronJob 教程对上述变更有更详细的说明(针对单 Group 项目的自动生成情况)。