[kubebuilder] 정리 및 demo 개발 내용

zzery·2022년 4월 24일

일지(2022~2024)

목록 보기
8/25

1. 오퍼레이터 개발 툴

golang으로 개발할 경우, 두 툴의 사용법은 똑같음. (CLI 이름만 다름)

Operator SDK

  • Go, Helm, Ansible로 개발 가능하도록 지원.
  • Go로 개발할 때 kubebuilder를 기반으로 사용함.
  • Operator SDK를 사용하면서 kubebuilder 문서를 참고하는 것이 가능.
  • https://sdk.operatorframework.io/docs/faqs/

kubebuilder


2. kubebuilder 특징

테스트 및 적용이 쉬움

  • make 명령어로 개발 도중의 빌드 / manifest 변경 사항 반영 / 배포 쉽게 가능
  • kustomize 포함 - manifest 직접 수정할 일이 별로 없음.
# 로컬에서 controller 실행make run

# controller 이미지 빌드make docker-build

# 이미지 배포make docker-push

# CRD, role 등의 내용을 k8s에 반영
# 삭제는 uninstallmake install

# k8s에 오퍼레이터 반영 (CRD, role, controller 모두 포함)
# 삭제는 undeploymake deploy

kubebuilder annotation

  • 코드상 아래 형식의 주석으로 manifest의 metadata 내용을 반영
  • 지우거나 제대로 추가가 안됐으면 작동에 문제 있을 수 있음.
# 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 모듈에 익숙할수록 개발이 수월함.


3. demo 개발 내용

CR 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
  • LeaderElection 으로 HA 적용 (기본 옵션)

개선 필요한 부분

  • Reconcile 도중 파드 리스트를 반영할 때, 간헐적으로 에러 출력.
    • 에러가 나와도 상태 반영은 정상적으로 되고 있음.
    • 이부분은 코드를 잘못 짠 것으로 예상.
  • 컨트롤러 Leader가 새로 선정될 때 시간차가 있음.

추가 내용

추가 1 - kubebuilder 설치 과정

설치 커맨드 (Ubuntu 20:04)

  • go: v1.16
  • kubebuilder: v3.2.0
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"}

gvm - go 버전 관리

  • go 버전 여러 개를 사용할 경우, 템플릿 생성 이전에 버전 확인 권장.
  • 사용법 - https://goax.tistory.com/7
# golang 버전은 1.16이 권장 (Operator-SDK 경우)
❯ gvm use go1.16
Now using version go1.16
❯ go version
go version go1.16 linux/amd64

추가 2 - 프로젝트 템플릿 생성

# 프로젝트 디렉토리에서 작업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
profile
이 블로그의 모든 글은 수제로 짜여져 있습니다...

0개의 댓글