### make go workdir
go mod init gitee.com/dmcca/kafka-operator
### init project
kubebuilder init --domain dameng.com --repo gitee.com/dmcca/kafka-operator
### create an api
kubebuilder create api --group kafka --version v1 --kind Kafka
需要在api目录下创建code-generator所需的文件,并添加相关注释。
-
新增
api/v1/doc.go
**注意:**修改groupName,package与api的version保持一致。
// +k8s:deepcopy-gen=package // Package v1 is the v1alpha1 version of the API. // +groupName=example.my.domain package v1
-
新增
api/v1/register.go
**注意:**package与api的version保持一致。
package v1 import ( "k8s.io/apimachinery/pkg/runtime/schema" ) // SchemeGroupVersion is group version used to register these objects. var SchemeGroupVersion = GroupVersion // Resource takes an unqualified resource and returns a Group qualified GroupResource func Resource(resource string) schema.GroupResource { return SchemeGroupVersion.WithResource(resource).GroupResource() }
-
修改
api/v1/{crd}_types.go
文件,添加注释// +genclient
// +genclient // +kubebuilder:object:root=true // Guestbook is the Schema for the guestbooks API type Guestbook struct {
3.3.4 准备脚本
在项目 hack
目录下准备以下文件:
-
新建
hack/tools.go
文件// +build tools package tools import _ "k8s.io/code-generator"
-
新建
hack/update-codegen.sh
,注意根据项目修改相应变量:-
MODULE
和go.mod
保持一致 -
API_PKG=api
,和api
目录保持一致 -
OUTPUT_PKG=generated/example
,与生成Resource时指定的group保持一致 -
GROUP=example
, 和生成Resource时指定的group 保持一致 -
VERSION=v1
, 和生成Resource时指定的version保持一致 -
#!/usr/bin/env bash set -o errexit set -o nounset set -o pipefail # 注意: # 1. kubebuilder2.3.2版本生成的api目录结构code-generator无法直接使用(将api由api/${VERSION}移动至api/${GROUP}/${VERSION}即可) # corresponding to go mod init <module> MODULE=gitee.com/dmcca/kafka-operator # api package APIS_PKG=api # generated output package OUTPUT_PKG=generated/kafka # group-version such as foo:v1alpha1 GROUP=kafka VERSION=v1 GROUP_VERSION=${GROUP}:${VERSION} SCRIPT_ROOT=$(dirname "${BASH_SOURCE[0]}")/.. CODEGEN_PKG=${CODEGEN_PKG:-$(cd "${SCRIPT_ROOT}"; ls -d -1 ./vendor/k8s.io/code-generator 2>/dev/null || echo ../code-generator)} rm -rf ${OUTPUT_PKG}/{clientset,informers,listers} # generate the code with: # --output-base because this script should also be able to run inside the vendor dir of # k8s.io/kubernetes. The output-base is needed for the generators to output into the vendor dir # instead of the $GOPATH directly. For normal projects this can be dropped. #bash "${CODEGEN_PKG}"/generate-groups.sh "client,informer,lister" \ bash "${CODEGEN_PKG}"/generate-groups.sh all \ ${MODULE}/${OUTPUT_PKG} ${MODULE}/${APIS_PKG} \ ${GROUP_VERSION} \ --go-header-file "${SCRIPT_ROOT}"/hack/boilerplate.go.txt # --output-base "${SCRIPT_ROOT}" # --output-base "${SCRIPT_ROOT}/../../.."
-
注意:
- kubebuilder2.3.2版本生成的api目录结构code-generator无法直接使用(将api由
api/${VERSION}
移动至api/${GROUP}/${VERSION}
即可)
-
修改
Makefile
,添加生成命令update-codegen: chmod +x ./hack/update-codegen.sh ./hack/update-codegen.sh
3.3.5 生成代码
项目根目录下执行make update-codegen
即可,将生成如下代码结构:
.
├── api
│ ├── kafka
│ │ └── v1
│ │ ├── doc.go
│ │ ├── groupversion_info.go
│ │ ├── kafka_types.go
│ │ ├── register.go
│ │ └── zz_generated.deepcopy.go
├── generated
│ └── kafka
│ ├── clientset
│ ├── informers
│ └── listers
之后便可以通过clientset等包对自定义资源对象进行操作。
注意事项:
kubebuilder2.3.2版本生成的api目录结构为 api/v1
,而code-generator需要的api目录结构为 api/kafka/v1
,相比较增加了group这一层。