创建API和Controller
根据以上设计的CR,在项目工程中创建对应的CRD类型:
$ kubebuilder create api --group osctest --version v1 --kind Hwfka Create Resource [y/n] y Create Controller [y/n] y Writing kustomize manifests for you to edit... Writing scaffold for you to edit... api/v1/hwfka_types.go controllers/hwfka_controller.go Update dependencies: go mod tidy Running make: make generate go: creating new go.mod: module tmp Downloading sigs.k8s.io/controller-tools/cmd/controller-gen@v0.7.0 go get: added sigs.k8s.io/controller-tools v0.7.0 /mnt/d/repository/Go/GOPATH/src/hwfka-operator/bin/controller-gen object:headerFile="hack/boilerplate.go.txt" paths="./..." Next: implement your new API and generate the manifests (e.g. CRDs,CRs) with: make manifests
通过kubebuilder create api命令,可以发现在重复下载controller-gen的二进制文件,包括后续使用Makefile去编译operator的二进制文件及打包镜像时,都可能会重复下载使用controller-gen二进制文件,建议提前安装controller-gen二进制,并修改Makefile中有关这个命令为使用系统命令,而非每次通过go get下载并编译后使用。
该命令主要执行以下动作:
- 在PROJECT文件中增加API资源声明。
domain: huawei.com layout: - go.kubebuilder.io/v3 projectName: hwfka-operator repo: hwfka-operator resources: - api: crdVersion: v1 namespaced: true controller: true domain: huawei.com group: osctest kind: Hwfka path: hwfka-operator/api/v1 version: v1 version: "3"
- 新增CRD及CR的描述文件。
hwfka-operator └── config ├── crd │ ├── kustomization.yaml │ ├── kustomizeconfig.yaml │ └── patches │ ├── cainjection_in_hwfkas.yaml │ └── webhook_in_hwfkas.yaml ├── rbac # 增加文件 │ ├── hwfka_editor_role.yaml │ └── hwfka_viewer_role.yaml └── samples └── osctest_v1_hwfka.yaml
- 新增api目录,包含CRD的类型定义。
hwfka-operator └── api └── v1 ├── groupversion_info.go ├── hwfka_types.go └── zz_generated.deepcopy.go
- 新增controllers目录,包含控制器的业务逻辑。
hwfka-operator └── controllers ├── hwfka_controller.go └── suite_test.go
- 在main.go的Manager启动时,创建Controller。
if err = (&controllers.HwfkaReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), }).SetupWithManager(mgr); err != nil { setupLog.Error(err, "unable to create controller", "controller", "Hwfka") os.Exit(1) }