[쿠버네티스] 커스텀 리소스와 컨트롤러

김우성·2022년 8월 3일

쿠버네티스는 포드, 디플로이먼트, 서비스 등은 쿠버네티스에서 자체적으로 제공하는 오브젝트들입니다. 하지만 때로는 리소스를 직접 정의해 사용해야할 상황이 생길 수 있습니다. 이럴 때 사용하는 커스텀 러소스(Custom resource)라는 것이 있습니다

쿠버네티스 컨트롤러의 개념과 동작 방식

쿠버네티스와 도커에는 리소스는 생성하는 방법이 명령형와 선언형으로 크게 2가지입니다

명령형(Imperative)

docker run과 같이 특정 명령을 요청해 수행하고 그 결괏값을 돌려받는 방식을 명령형이라고 합니다.

선언형(Declarative)

선언형을 Desired state를 정의한 후 해당 상태가 되도록 일치시키는 방식입니다. 이미 current state가 desired state와 같다면 아무런 동작도 하지 않고 다르다면 일치시킵니다.

커스텀 리소스에 대한 개념

커스텀 리소스는 말 그대로 직접 정의해 사용할 수 있는 리소스입니다. 여러가지 리소스를 묶어 추상화해 패키지처럼 커스텀 리소스를 만드는 것도 가능합니다

위와 같이 커스텀 리소스 안에 여러가지 오브젝트들이 담길 수도 있다.

커스텀 리소스를 사용하기 위한 단계

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

커스텀 리소스를 정의하기 위한 CRD(Custom Resource Definition)

쿠버네티스에서 커스텀 리소스는 crd(customresourecedefinition)이라는 오브젝트를 통해서 정의할 수 있습니다. 아래는 alice라는 이름의 커스텀 리소스를 만든 예제입니다.

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: alices.k106.com      # 1. CRD의 이름
spec:
  group: k106.com            # 2. 커스텀 리소스의 API 그룹
  scope: Namespaced          #    커스텀 리소스가 네임스페이스에 속하는지 여부
  names:
    plural: alices           # 3. 커스텀 리소스의 이름 (복수형)
    singular: alice          #    커스텀 리소스의 이름 (단수형)
    kind: Alice              #    YAML 파일 등에서 사용될 커스텀 리소스의 Kind
    shortNames: ["ac"]       #    커스텀 리소스 이름의 줄임말
  versions:
  - name: v1alpha1           #    커스텀 리소스의 API 버전
    served: true
    storage: true
    schema:
      openAPIV3Schema:       # 4. 커스텀 리소스의 데이터를 정의
        type: object
        required: ["spec"]   # 커스텀 리소스에는 반드시 "spec"이 존재해야 함
        properties:          # 커스텀 리소스에 저장될 데이터 형식을 정의
          spec:
            required: ["myvalue"]
            type: object
            properties:
              myvalue:
                type: "string"
                minimum: 1

이제 아래와 같이 alice라는 이름의 오브젝트를 만들 수 있습니다.

apiVersion: k106.com/v1alpha1
kind: Alice
metadata:
  name: my-custom-resource
spec:
  myvalue: "This is my value"

커스텀 리소스와 컨트롤러

CRD로 부터 커스텀 리소스를 생성했다고 하더라도 무언가 동작을 하지는 않습니다. 이것을 동작 시키기 위해서는 컨트롤러를 별도로 만들어주어야 합니다.

컨트롤러가 어떻게 동작하는지를 간단하게 나타내면 아래와 같습니다.

Desired-state는 상황에 따라 여러가지가 될 수 있습니다. 예로 2개의 포드가 존재하기, 웹 서버 구축을 위한 여러 개의 서버 포드와 서비스가 존재하기, AWS에서 EC2 인스턴스를 생성하기 등 다양합니다. 이처럼 현재 상태가 바람직한 상태가 되도록 동작하는 것을 Reconcile이라고 합니다.

profile
초보 개발자입니다

0개의 댓글