kubeBuilder
通过kubebuilder构建的项目,最终目录结构如下:
├── apis
│ └── builder # 指令1对应生成的目录结构,否则该目录不创建
│ └── v1alpha1
│ ├── builder_types.go # 定义yaml中resource的spec
│ ├── groupversion_info.go # GV定义
│ └── zz_generated.deepcopy.go
├── bin
│ └── controller-gen
├── config
│ ├── crd # 自动生成的crd文件,无需修改,直接修改api中v1alpha1里的文件后执行make generate
│ │ ├── kustomization.yaml
│ │ ├── kustomizeconfig.yaml
│ │ └── patches
│ │ ├── cainjection_in_builders.yaml
│ │ └── webhook_in_builders.yaml
│ ├── default # 默认配置信息
│ │ ├── kustomization.yaml
│ │ ├── manager_auth_proxy_patch.yaml
│ │ └── manager_config_patch.yaml
│ ├── manager # CRD yaml信息
│ │ ├── controller_manager_config.yaml
│ │ ├── kustomization.yaml
│ │ └── manager.yaml
│ ├── prometheus # prometheus监控数据采集信息
│ │ ├── kustomization.yaml
│ │ └── monitor.yaml
│ ├── rbac # rbac相关权限
│ │ ├── auth_proxy_client_clusterrole.yaml
│ │ ├── auth_proxy_role_binding.yaml
│ │ ├── auth_proxy_role.yaml
│ │ ├── auth_proxy_service.yaml
│ │ ├── builder_editor_role.yaml
│ │ ├── builder_viewer_role.yaml
│ │ ├── kustomization.yaml
│ │ ├── leader_election_role_binding.yaml
│ │ ├── leader_election_role.yaml
│ │ ├── role_binding.yaml
│ │ └── service_account.yaml
│ └── samples # 样例文件
│ └── builder_v1alpha1_builder.yaml
├── controllers
│ └── builder
│ ├── builder_controller.go # controller逻辑
│ └── suite_test.go # 测试
├── Dockerfile
├── go.mod
├── go.sum
├── hack
│ └── boilerplate.go.txt
├── main.go
├── Makefile # go工程脚本命令
└── PROJECT # kubebuilder元数据信息
从零开始搭建
1、kubeBuilder的安装
在官网下载对应的二进制文件,地址为https://github.com/kubernetes-sigs/kubebuilder/releases,解压后放置在usr/local/bin目录下即可,也可以配置PATH环境变量。
curl -L -o kubebuilder https://github.com/kubernetes-sigs/kubebuilder/releases/download/v3.2.0/kubebuilder_linux_amd64
chmod +x kubebuilder && mv kubebuilder /usr/local/bin/
2、初始化项目
在$ g o p a t h / s r c 下 创 建 项 目 目 录 , 如 果 项 目 不 在 gopath/src下创建项目目录,如果项目不在 gopath/src下创建项目目录,如果项目不在GOPATH目录下,需运行go mod init 来告知kubeBuilder项目地址。
$ mkdir $GOPATH/src/local/builder-operator
$ go mod init local/builder-operator
通过kubeBuilder初始化项目信息:(–domain是项目的域名。)
$ kubebuilder init --domain zlqc.com
生成以下文件:
├── config
│ ├── default # 默认配置信息
│ │ ├── kustomization.yaml
│ │ ├── manager_auth_proxy_patch.yaml
│ │ └── manager_config_patch.yaml
│ ├── manager # CRD yaml信息
│ │ ├── controller_manager_config.yaml
│ │ ├── kustomization.yaml
│ │ └── manager.yaml
│ ├── prometheus # prometheus监控数据采集信息
│ │ ├── kustomization.yaml
│ │ └── monitor.yaml
│ └── rbac # rbac相关权限
│ ├── auth_proxy_client_clusterrole.yaml
│ ├── auth_proxy_role_binding.yaml
│ ├── auth_proxy_role.yaml
│ ├── auth_proxy_service.yaml
│ ├── kustomization.yaml
│ ├── leader_election_role_binding.yaml
│ ├── leader_election_role.yaml
│ ├── role_binding.yaml
│ └── service_account.yaml
├── Dockerfile
├── go.mod
├── go.sum
├── hack
│ └── boilerplate.go.txt
├── main.go
├── Makefile # go工程脚本命令
└── PROJECT # kubebuilder元数据信息
3、生成resource和manifests
创建api
$ kubebuilder edit --multigroup=true
$ kubebuilder create api --group builder --version v1alpha1 --kind Builder
指令1的目的是将指令2生成的resource将放置在apis路径下,否则放置在默认的路径下。
指令2中的group version builder分别对应上文中的GVK。
指令2输出信息如下:
Create Resource [y/n]
y
Create Controller [y/n]
y
Writing kustomize manifests for you to edit...
Writing scaffold for you to edit...
apis/builder/v1alpha1/builder_types.go
controllers/builder/builder_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
/data/gopath/src/local/builder-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
当前的目录信息如下(不含已生成的文件):
├── apis
│ └── builder # 指令1对应生成的目录结构,否则该目录不创建
│ └── v1alpha1
│ ├── builder_types.go # 定义yaml中resource的spec
│ ├── groupversion_info.go # GV定义
│ └── zz_generated.deepcopy.go
├── bin
│ └── controller-gen
├── config
│ ├── crd # 自动生成的crd文件,无需修改,直接修改api中v1alpha1里的文件后执行make generate
│ │ ├── kustomization.yaml
│ │ ├── kustomizeconfig.yaml
│ │ └── patches
│ │ ├── cainjection_in_builders.yaml
│ │ └── webhook_in_builders.yaml
│ └── default
│ └── manager
│ └── prometheus
│ ├── rbac
│ │ ├── builder_editor_role.yaml
│ │ └── builder_viewer_role.yaml
│ └── samples # 样例文件
│ └── builder_v1alpha1_builder.yaml
└── controllers
└── builder
├── builder_controller.go # controller逻辑
└── suite_test.go # 测试
至此,最小化框架内容都已完成,接着就是定义CR,编写controller等。
参考学习:链接
参考学习:链接