쿠버네티스는 포드, 디플로이먼트, 서비스 등은 쿠버네티스에서 자체적으로 제공하는 오브젝트들입니다. 하지만 때로는 리소스를 직접 정의해 사용해야할 상황이 생길 수 있습니다. 이럴 때 사용하는 커스텀 러소스(Custom resource)라는 것이 있습니다
쿠버네티스와 도커에는 리소스는 생성하는 방법이 명령형와 선언형으로 크게 2가지입니다
docker run과 같이 특정 명령을 요청해 수행하고 그 결괏값을 돌려받는 방식을 명령형이라고 합니다.
선언형을 Desired state를 정의한 후 해당 상태가 되도록 일치시키는 방식입니다. 이미 current state가 desired state와 같다면 아무런 동작도 하지 않고 다르다면 일치시킵니다.
커스텀 리소스는 말 그대로 직접 정의해 사용할 수 있는 리소스입니다. 여러가지 리소스를 묶어 추상화해 패키지처럼 커스텀 리소스를 만드는 것도 가능합니다
위와 같이 커스텀 리소스 안에 여러가지 오브젝트들이 담길 수도 있다.
쿠버네티스에서 커스텀 리소스는 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이라고 합니다.