(2)项目初始化
接下来,我们使用代码清单 1-6中的 Kubebuilder 命令进行项目初始化工作。
$mkdirdemo
$cddemo
$gomodinitwelcome_demo.domain
$kubebuilderinit--domaindemo.welcome.domain
初始化项目后,Kubebuilder会自动生成main.go 文件等一系列配置和代码框架(见代码清单1-7)。
.
├──bin
│ └──manager
├──config
│ ├──certmanager
│ │ ├──certificate.yaml
│ │ ├──kustomization.yaml
│ │ └──kustomizeconfig.yaml
│ ├──default
│ │ ├──kustomization.yaml
│ │ ├──manager_auth_proxy_patch.yaml
│ │ ├──manager_webhook_patch.yaml
│ │ └──webhookcainjection_patch.yaml
│ ├──manager
│ │ ├──kustomization.yaml
│ │ └──manager.yaml
│ ├──prometheus
│ │ ├──kustomization.yaml
│ │ └──monitor.yaml
│ ├──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
│ └──webhook
│ ├──kustomization.yaml
│ ├──kustomizeconfig.yaml
│ └──service.yaml
├──Dockerfile
├──go.mod
├──go.sum
├──hack
│ └──boilerplate.go.txt
├──main.go
├──Makefile
└──PROJECT
接下来我们使用代码清单 1-8创建“Welcome”Kind 和其对应的控制器。
$kubebuildercreateapi--groupwebapp--kindWelcome--versionv1CreateResource[y/n]
y
CreateController[y/n]y
输入两次 y,Kubebuilder 分别创建了资源和控制器的模板,此处的 group、version、kind这 3个属性组合起来标识一个k8s的 CRD,创建完成后,Kubebuilder 添加文件见代码清单 1-9。
├──api
│ └──v1
│ ├──groupversion_info.go
│ ├── welcome_types.go //⾃定义CRD结构需修改的⽂件
│ └──zz_generated.deepcopy.go
├──bin
│ └──manager
├──config
│ ├──certmanager
│ |
│ |
├── |
certificate.yaml |
│ |
│ |
├── |
kustomization.yaml |
│ │ │ |
│ ├── │ |
└── crd ├── |
kustomizeconfig.yaml
bases |
│ |
│ |
│ |
└──webapp.demo.welcome.domain_welcomes.yaml |
│ |
│ |
├── |
kustomization.yaml |
│ |
│ |
├── |
kustomizeconfig.yaml |
│ │ │ |
│ │ │ |
└── |
patches ├── cainjection_in_welcomes.yaml └── webhook_in_welcomes.yaml |
│ |
├── |
default |
|
│ |
│ |
├── kustomization.yaml |
|
│ |
│ |
├── manager_auth_proxy_patch.yaml |
|
│ |
│ |
├── manager_webhook_patch.yaml |
|
│ |
│ |
└── webhookcainjection_patch.yaml |
|
│ |
├── |
manager |
|
│ |
│ |
├── kustomization.yaml |
|
│ |
│ |
└── manager.yaml |
|
│ |
├── |
prometheus |
|
│ |
│ |
├── kustomization.yaml |
|
│ |
│ |
└── monitor.yaml |
|
│ |
├── |
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 |
│ |
│ |
├── |
role.yaml |
│ |
│ |
├── |
welcome_editor_role.yaml |
│ |
│ |
└── |
welcome_viewer_role.yaml |
│ ├──samples
│ │ └── webapp_v1_welcome.yaml //简单的⾃定义资源 Yaml⽂件
│ └──webhook
│ ├──kustomization.yaml
│ ├──kustomizeconfig.yaml
│ └──service.yaml
├──controllers
│ ├──suite_test.go
│ └── welcome_controller.go //CRDController核⼼逻辑
├──Dockerfile
├──go.mod
├──go.sum
├──hack
│ └──boilerplate.go.txt
├──main.go
├──Makefile
└──PROJECT
后续需要执行两步操作:
① 修改 ResourceType;
② 修改 Controller逻辑。
(3) 修改 ResourceType
此处 ResourceType为需要定义的资源字段,用于在 Yaml 文件中进行声明,本案例中需要新增 name字段用于“Welcome”Kind中的 Web应用,见代码清单 1-10。
/api/v1/welcome_types.gotypeWelcomeSpecstruct{
//INSERTADDITIONALSPECFIELDS-desiredstateofcluster
//Important:Run"make"toregeneratecodeaftermodifyingthisfile
//FooisanexamplefieldofWelcome.EditWelcome_types.gotoremove/update
//Foostring`json:"foo,omitempty"`Namestring`json:"name,omitempty"`
}