golang으로 개발할 경우, 두 툴의 사용법은 똑같음. (CLI 이름만 다름)
# 로컬에서 controller 실행
❯ make run
# controller 이미지 빌드
❯ make docker-build
# 이미지 배포
❯ make docker-push
# CRD, role 등의 내용을 k8s에 반영
# 삭제는 uninstall
❯ make install
# k8s에 오퍼레이터 반영 (CRD, role, controller 모두 포함)
# 삭제는 undeploy
❯ make deploy
# CRD manifest 생성에 사용
// +kubebuilder:printcolumn:name="size",type=string,JSONPath=`.spec.size`
// +kubebuilder:printcolumn:name="created at",type=string,JSONPath=`.metadata.creationTimestamp`
# ClusterRole manifest 생성에 사용
//+kubebuilder:rbac:groups=apps,resources=deployments,verbs=get;list;watch;create;update;delete
//+kubebuilder:rbac:groups="",resources=services,verbs=get;list;watch;create;update;delete
//+kubebuilder:rbac:groups="",resources=pods,verbs=get;list;watch;create;update;delete
k8s 관련 golang 모듈에 익숙할수록 개발이 수월함.
Cluster API: https://github.com/kubernetes-sigs/cluster-apikudo: https://github.com/kudobuilder/kudoCR Manifest 예시 : demo-sample.yaml
demo.spec.size 는 deployment의 replicas 값으로 들어감.apiVersion: demoapp.my.domain/v1
kind: Demo
metadata:
name: demo-sample
spec:
size: 3
적용 예시 1 - CR 생성 및 확인
# demo 라는 이름의 CR을 관리할 수 있음.
❯ k get demo
No resources found in default namespace.
❯ k apply -f demo-sample.yaml
demo.demoapp.my.domain/demo-sample created
# size=3인 demo 리소스 생성 확인
❯ k get demo
NAME SIZE CREATED AT
demo-sample 3 2022-04-24T10:47:30Z
# deploy, service, pod 확인
❯ k get demo,deploy,svc,po
NAME SIZE CREATED AT
demo.demoapp.my.domain/demo-sample 3 2022-04-24T10:47:30Z
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/demo-sample 3/3 3 3 43s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/demo-sample ClusterIP 10.101.108.83 <none> 80/TCP 43s
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 49d
NAME READY STATUS RESTARTS AGE
pod/demo-sample-5776888c78-2j5tr 1/1 Running 0 43s
pod/demo-sample-5776888c78-h6g6m 1/1 Running 0 43s
pod/demo-sample-5776888c78-xnnnl 1/1 Running 0 43s
적용 예시 2 - custom controller 배포 형식
# CR을 관리하는 system Namespace 생성
❯ k get ns
NAME STATUS AGE
default Active 49d
demo-operator-system Active 2m30s # <- demo CR 관련
kube-node-lease Active 49d
kube-public Active 49d
kube-system Active 49d
# custom controller - deployment 형태
❯ k get deploy,po -n demo-operator-system
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/demo-operator-controller-manager 2/2 2 2 2m46s
NAME READY STATUS RESTARTS AGE
pod/demo-operator-controller-manager-74fd6fcd6c-cs55r 2/2 Running 0 2m46s
pod/demo-operator-controller-manager-74fd6fcd6c-swdpj 2/2 Running 0 2m46s
개선 필요한 부분

❯ wget https://github.com/kubernetes-sigs/kubebuilder/releases/download/v3.2.0/kubebuilder_linux_amd64
❯ chmod +x kubebuilder && mv kubebuilder /usr/local/bin/
❯ kubebuilder version
Version: main.version{KubeBuilderVersion:"3.2.0", KubernetesVendor:"1.22.1", GitCommit:"b7a730c84495122a14a0faff95e9e9615fffbfc5", BuildDate:"2021-10-29T18:32:16Z", GoOs:"linux", GoArch:"amd64"}
# golang 버전은 1.16이 권장 (Operator-SDK 경우)
❯ gvm use go1.16
Now using version go1.16
❯ go version
go version go1.16 linux/amd64
# 프로젝트 디렉토리에서 작업
❯ mkdir demo-operator && cd demo-operator
❯ gvm use go1.16
Now using version go1.16
# 템플릿 생성
❯ kubebuilder init demo-operator --repo demo-operator
Writing kustomize manifests for you to edit...
Writing scaffold for you to edit...
Get controller runtime:
$ go get sigs.k8s.io/controller-runtime@v0.10.0
Update dependencies:
$ go mod tidy
Next: define a resource with:
$ kubebuilder create api
# api 템플릿 생성 (CRD, controller 포함)
❯ kubebuilder create api --group demoapp --version v1 --kind Demo
Create Resource [y/n]
y
Create Controller [y/n]
y
Writing kustomize manifests for you to edit...
Writing scaffold for you to edit...
api/v1/demo_types.go
controllers/demo_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
Desktop/demo-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