带你读《云原生应用开发 Operator原理与实践》第一章引言1.2Operator 介绍(三)

(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"`

}

上一篇:带你读《云原生应用开发 Operator原理与实践》第一章引言1.1云原生介绍(四)


下一篇:鼠标搭上显示背景色