从 go/v3 迁移到 go/v4

在继续之前,请确保您了解 Kubebuilder go/v3 和 go/v4 之间的区别

请确保您已经按照安装指南安装了所需的组件。

迁移 go/v3 项目的推荐方法是创建一个新的 go/v4 项目,并将 API 和调整代码复制过去。转换后的项目将呈现出原生 go/v4 项目布局的样子(最新版本)。

然而,在某些情况下,可以进行就地升级(即重用 go/v3 项目布局,手动升级 PROJECT 文件和脚手架)。有关更多信息,请参见 通过手动更新文件从 go/v3 迁移到 go/v4

初始化一个 go/v4 项目

创建一个新目录,使用你的项目名称。请注意,这个名称在脚手架中用于创建你的管理器 Pod 的名称以及管理器默认部署的命名空间。

$ mkdir migration-project-name
$ cd migration-project-name

现在,我们需要初始化一个 go/v4 项目。在此之前,如果我们不在 GOPATH 中,我们需要初始化一个新的 go 模块。虽然从技术上讲,在 GOPATH 内部并不需要,但仍然推荐这样做。

go mod init tutorial.kubebuilder.io/migration-project

现在,我们可以使用 kubebuilder 完成项目的初始化。

kubebuilder init --domain tutorial.kubebuilder.io --plugins=go/v4

迁移 API 和控制器

接下来,我们将重新搭建 API 类型和控制器。

kubebuilder create api --group batch --version v1 --kind CronJob

迁移API

现在,让我们将旧项目中的 api/v1/<kind>_types.go 文件中的 API 定义复制到新项目中。

这些文件没有被新的插件修改,所以您应该可以用旧的文件替换新生成的文件。可能会有一些外观上的变化。因此,您可以选择仅复制类型本身。

迁移控制器

现在,让我们将旧项目中 controllers/cronjob_controller.go 的控制器代码迁移到新项目中的 internal/controller/cronjob_controller.go

迁移 Webhooks

现在让我们为我们的 CRD(CronJob)搭建 Webhook。我们需要使用 --defaulting--programmatic-validation 标志运行以下命令(因为我们的测试项目使用了默认值和验证 Webhook):

kubebuilder create webhook --group batch --version v1 --kind CronJob --defaulting --programmatic-validation

现在,让我们将旧项目中的 api/v1/<kind>_webhook.go 的 webhook 定义复制到新项目中。

其他人

如果在 v3 的 main.go 中有任何手动更新,我们需要将这些更改迁移到新的 main.go 中。我们还需要确保所有需要的 controller-runtime schemes 都已注册。

如果在配置目录下添加了其他清单,请一并移植。请注意,新版本的 go/v4 使用 Kustomize v5.x,而不再是 Kustomize v4。因此,如果在配置中添加了自定义实现,您需要确保它们能够与 Kustomize v5 一起使用,如果不能,则需要更新/升级您可能遇到的任何破坏性更改。

在 v4 中,Kustomize 的安装方式已经从 bash 脚本更改为 go get。请将 Makefile 中的 kustomize 依赖更改为

``如果需要,请在Makefile中更改图像名称。

验证

最后,我们可以运行 makemake docker-build 来确保一切正常。