天天看點

帶你讀《雲原生應用開發 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

│       │       ├──manager_auth_proxy_patch.yaml

│       │       ├──manager_webhook_patch.yaml

│       │       └──webhookcainjection_patch.yaml

│       ├──manager

│       │       └──manager.yaml

│       ├──prometheus

│       │       └──monitor.yaml

│       ├──rbac

│       │       ├──auth_proxy_client_clusterrole.yaml

│       │       ├──auth_proxy_role_binding.yaml

│       │       ├──auth_proxy_role.yaml

│       │       ├──auth_proxy_service.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

├── certificate.yaml
kustomization.yaml

└──

crd

kustomizeconfig.yaml

bases

└──webapp.demo.welcome.domain_welcomes.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
└── manager.yaml
prometheus
└── monitor.yaml
rbac
├── auth_proxy_client_clusterrole.yaml
├── auth_proxy_role_binding.yaml
├── auth_proxy_role.yaml
├── auth_proxy_service.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⽂件

├──controllers

│       ├──suite_test.go

│       └── welcome_controller.go                //CRDController核⼼邏輯

後續需要執行兩步操作:

① 修改 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"`

}