从 go/v3 迁移到 go/v4

在继续之前,请先了解 Kubebuilder go/v3 与 go/v4 的差异

请确保已按安装指南安装所需组件。

推荐的迁移方式是:新建一个 go/v4 项目,然后将 API 与调谐(reconciliation)代码拷贝过去。这样最终得到的项目就是原生的 go/v4 布局(最新版本)。

不过在某些场景下,也可以“就地升级”(复用 go/v3 的项目布局,手动升级 PROJECT 与脚手架)。详见手动更新文件从 go/v3 迁移到 go/v4

初始化 go/v4 项目

新建一个以项目名命名的目录。注意该名称会用于脚手架中,默认影响 manager Pod 的名称以及其部署的 Namespace:

$ 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 与 Controller

接下来,重新脚手架 API 类型与控制器。

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

迁移 API

现在,把旧项目中的 api/v1/<kind>_types.go 拷贝到新项目中。

这些文件在新插件中没有功能性修改,因此可以直接用旧文件覆盖新生成的文件。若存在格式差异,也可以只拷贝类型定义本身。

迁移 Controller

将旧项目的 controllers/cronjob_controller.go 迁移到新项目的 internal/controller/cronjob_controller.go

迁移 Webhook

为 CRD(CronJob)脚手架 Webhook。需要带上 --defaulting--programmatic-validation(示例项目用到了默认化与校验 Webhook):

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

然后,将旧项目中的 api/v1/<kind>_webhook.go 拷贝到新项目中。

其他

如果 v3 的 main.go 有手工改动,需要将其迁移到新项目的 main.go 中。同时确保所需的 controller-runtime schemes 全部完成注册。

config 目录下存在新增清单,同步迁移它们。注意 go/v4 使用 Kustomize v5 而非 v4,因此你若在 config 中做过定制,需要确认其兼容 v5,必要时按新版本修复不兼容之处。

在 v4 中,Kustomize 的安装方式由 bash 脚本改为 go install。请在 Makefile 中将 kustomize 依赖改为:

.PHONY: kustomize
kustomize: $(KUSTOMIZE) ## Download kustomize locally if necessary. If wrong version is installed, it will be removed before downloading.
$(KUSTOMIZE): $(LOCALBIN)
	@if test -x $(LOCALBIN)/kustomize && ! $(LOCALBIN)/kustomize version | grep -q $(KUSTOMIZE_VERSION); then \
		echo "$(LOCALBIN)/kustomize version is not expected $(KUSTOMIZE_VERSION). Removing it before installing."; \
		rm -rf $(LOCALBIN)/kustomize; \
	fi
	test -s $(LOCALBIN)/kustomize || GOBIN=$(LOCALBIN) GO111MODULE=on go install sigs.k8s.io/kustomize/kustomize/v5@$(KUSTOMIZE_VERSION)

如有需要,请同步更新 Makefile 中的镜像名等配置。

验证

最后,运行 makemake docker-build 以确认一切正常。