Home 8. custom resource and controller
Post
Cancel

8. custom resource and controller

custom resource and controller

Kubernetes Custom Resource

포드, 디플로이먼트, 서비스는 쿠버네티스에서 기본적으로 제공하는 리소스 종류이지만, 사용자가 직접 리소스 종류를 정의해 사용할 수도 있다. 이를 Custom Resource 라고 한다.

Kubernetes Controller

  • Imperative(명령형) : 특정 명령을 처리하는 주체와 통신해 그 작업을 수행하고, 그 결과값을 돌려받는 방식 (ex: kubectl run)
  • Declarative(선언적) : 최종적으로 도달해야 하는 바람직한 상태(Desired State)를 정의한 뒤, 현재 상태가 바람직한 상태와 다를 경우, 이를 일치하도록 만드는 방법 (ex: kubectl apply)
1
2
3
4
# Controller
이때, 최종적으로 도달해야 하는 바람직한 상태(Desired State)를 정의하는 파일이 yaml 파일이며, 어떤 동작을 취할지는 쿠버네티스에서 Controller 라고 불리는 개체가 내부적으로 결정한다.

이 Controller는 쿠버네티스 API 서버의 Watch API를 통해 etcd(쿠버네티스의 상태를 저장하는 분산 코디네이터)에 저장된 상태 데이터를 받아와 동작을 수행한다.

Controller Manager

이론상, 쿠버네티스의 컨트롤러는 모두 개별적으로 존재랄 수도 있지만, 복잡성을 줄이기 위해 쿠버네티스 컨트롤러 매니저라는 하나의 컴포넌트에 구현해 놓았다. 이는 핵심 컴포넌트 이므로, kube-system 이라는 네임스페이스에서 포드로 실행되고 있다.

Custom Resource

디플로이먼트, 서비스 등의 오브젝트의 묶음을 커스텀 리소스로 추상화함으로써, 쿠버네티스 리소스를 묶어 놓은 패키지처럼 사용할 수도 있고, 쿠버네티스와 전혀 상관이 없는 로직을 커스텀 리소스와 연동할 수도 있다.

1
2
3
4
5
6
7
# Custom Resource Create Step

1) 바람직한 상태(Desired State)로 변화시킬 수 있는 컨트롤러를 구현, 실행
2) Custom Resource 의 상세 정보를 정의하는 CRD(Custom Resource Definition) 리소스를 생성
3) CRD에 정의된 데이터에 맞춰 Custom Resource 를 생성
4) 이 생성을 감지하고, 바람직한 상태(Desired State) 가 되도록 적절한 작업(?) 을 수행

Custom Resource CRD

커스텀 리소스는 customresourcedefinition 이라는 오브젝트를 통해 정의할 수 있다. 하지만 오브젝트 이름이 너무 길기 때문에, crd( CRD : Custom Resource Definition ) 이라는 이름으로 줄여서 부른다. 마치 클래스와 인스턴스의 관계처럼, CRD 자체가 커스텀 리소스가 아니라, CRD를 통해 커스텀 리소스를 생성해야 비로소 의미를 가진다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
    name: alices.k106.com               # 1. CRD 이름
spec:                                   #    CRD 이름은 반드시 plural + . + spec.group
    group: k106.com                     # 2. C.R. API 그룹
    version: v1a1pha1                   #    C.R. API 버전
    scope: Namespaced                   #    C.R. 가 네임스페이스에 속하는지?
    names:                              
        plural: alices                  # 3. C.R. 의 이름(복수형)
        singular: alice                 #    C.R. 의 이름(단수형)
        kind: Alice                     #    YAML 파일 등에서 사용될 커스텀 리소스 종류 -> 생성파일용
        shortNames: ["ac"]              #    C.R. 이름 줄임말
    validation:
        openAPIV3Schema:                #    C.R. 데이터 정의
            required: ["spec"]          #    반드시 필요한 항목
            poperties:                  #    C.R. 에 저장될 데이터 형식을 정의
                spec: 
                    required: ["myvalue"]
                    properties:
                        myvalue:
                            type: "string"
                            minimun: 1

1
2
kubectl apply -f {crd 정의 파일}
kubectl apply -f {crd 셍상파일, 정의파일의 kind가 명시된.}

Custom Controller

커스텀 리소스가 의미를 갖기 위해서는, 커스텀 리소스를 생성했을떄 특정 동작을 수행하도록 정의하는 컨트롤러가 별도로 구현되어야 한다.

컨트롤러가 동작하는 것은 Custom Resource 의 생성을 감지하여 Custom Resource가 Desired-State가 되도록(이런 동작을 k8s에서는 Reconcile 이라고 함) 하기 위함이며, 이런 일련의 동작을 통해 CRD를 사용할 수 있도록 컨트롤러를 구현하는 방법을 오퍼레이터(Operator) 패턴이라고 한다.

This post is licensed under CC BY 4.0 by the author.