How to use Kubernetes Custom Resource Definition

jelly
6 min readMay 31, 2022

--

일을 하다보니 Kubernetes 의 Custom Resource Definition 를 사용할 일이 생긴 김에 Custom Resource Definition(CRD) 에 대해서 정리를 해보았습니다. :)

Kubernetes 는 확장성이 좋게 구조화 되어 있습니다. 기본적으로 제공하는 Resource(POD, CRD, …) 외에도 필요한 경우 Resource 를 Custom Resource 로 추가하여 Kubernetes 의 기본 Resource 와 함께 사용이 가능합니다. 이런 Custom Resource 들은 Custom Controller 를 만들어서 사용이 가능합니다.

Custom Resource Definition(CRD) 는 위에서 이야기 한것 처럼 Operator 라고 불리는 Custom Controller 와 함께 사용이 되는데, 일반적으로 이런 구조를 Operator Patter 이라고 이야기를 합니다.

Operator, Custom Resource Definition(CRD), Custom Resource(CR)?

  • Operator : Custom Resource Definition(CRD)을 기반으로 Kubernetes API 의 기능을 확장하는 것(실제 Operator 와 비슷)
  • Custom Resource Definition(CRD) : Operator 에서 사용하는 Resource Object 의 Spec 을 정의 한 것
  • Custom Resource(CR) : Custom Resource Definition 에서 정의한 Object Spec 에 입력하는 Value

Custom Resource Definition(CRD) 특징

  1. 별도의 코드 작성이 필요 없이 YAML 로 된 SCHEME 작성만 하면 됨
  2. Custom Resource Definition(CRD) Controller 를 만들때 다양한 언어가 사용 가능(Go, Python, …)
  3. kube-apiserver 가 Custom Resource Definition(CRD) 상태를 관리
  4. Kubernetes 의 확장 기능으므로 별도의 관리가 필요 없음(Kubernetes 와 함께 Upgrade, Bug Patch 가 됨)
  5. Custom Resource Definition(CRD) 의 Scope 를 정의 할 수 있음(Namespace or Cluster)

Operator, Custom Resource Definition(CRD) Flow

  1. Service #1 이 Custom Resource Spec 을 Write 를 Kube API Server 에 요청합니다.
  2. Kube API Server 는 etcd 에 Custom Resource Spec 을 Write 합니다.
  3. Operator(Custom Controller) 는 Kube API Server 를 통해 Custom Resource Definition 의 Custom Resource 가 변경 되었는지를 지쳐봅니다(Watch)
  4. Operator(Custom Controller) 가 변경 됨을 확인 하면 Custom Resource Status 를 업데이트 하고, 기존에 정의한 대로 POD 를 생성하는 요청을 Kube API Server 에 합니다.
  5. Kube API Server 는 Operator(Custom Controller) 에게 요청 받은대로 POD 을 생성합니다.

** Kube API Server

Kube API Server는 Cluster 에 접근하기 위한 API 가 있는 서버로 kubernetes 의 모든 기능을 제어 할 수 있는 서버입니다.

** Operator : Custom Controller

Custom Resource Definition 을 정의한 사용자가 개발한 컨트롤러입니다. Custom Resource 의 spec 을 읽고 작업을 수행 한 후에 status 를 업데이트 하는 구조입니다. spec 에 따라 사용자가 원하는 작업을 수행 하도록 개발이 가능합니다.

이제 Custom Resource Defition(CRD), Operator 를 어떻게 작성하는지에 대해 살펴 보겠습니다.

Custom Resource Definition & Operator Example

  1. Custom Resource Definition Yaml 을 작성합니다.

[ CRD-SAMPLE.yaml ]

  • metadata: metadata 로 name, namespace 등이 있습니다.
  • spec: Request 하는 부분으로 Rest API 의 Request Spec 과 같습니다.
  • status: Response 하는 부분으로 Rest API 의 Response Spec 과 같습니다.

2. Custom Resource Definition 을 구성합니다.

# Custom Resource Definition 구성 
$ kubectl apply -f CRD-SAMPLE.yaml
# Custom Resource Definition 구성 확인
$ kubectl describe sample.test.group

3. Operator(=Custom Controller) 를 작성합니다.

[ k8s-operator.py]

4. Operator(=Custom Controller) 를 실행하여 동작 확인을 합니다.

  • CR-SAMPLE.yaml 을 작성합니다.

[ CR-SAMPLE.yaml ]

  • Operator(=Custom Controller) 를 시작합니다.
$ python k8s-operator.py
  • CR-SAMPLE.yaml 을 추가합니다.
$ kubectl apply -f CR-SAMPLE.yaml
  • Operator(=Custom Controller) 실행 로그를 확인 해보면 아래와 같으 ADDED 된 CR 정보가 나타납니다.
  • Operator(=Custom Controller) 로 status 가 업데이트 된 것을 확인 합니다.
$ kubectl describe sample.test.group

이렇게 간단하게 Kubernetes 에서 Custom Resource Definition 와 Operator 를 사용하는 방법을 정리해봤습니다~~!

그럼 즐거운 개발 세발~~ 하세용! :)

--

--