시작하며
쿠버네티스는 포드, 디플로이먼트, 서비스 같은 기본 리소스 외에도 사용자가 직접 리소스 종류를 정의해 사용할 수 있다. 이를 Custom Resource라 하며, 이를 제어하는 Controller와 함께 Operator 패턴을 구성한다.
Kubernetes Controller
- Imperative(명령형): 특정 명령을 처리하는 주체와 통신해 그 작업을 수행하고 결과값을 돌려받는 방식 (예:
kubectl run) - Declarative(선언형): 최종적으로 도달해야 하는 바람직한 상태(Desired State)를 정의한 뒤, 현재 상태가 바람직한 상태와 다를 경우 이를 일치하도록 만드는 방법 (예:
kubectl apply)
# Controller
최종적으로 도달해야 하는 바람직한 상태(Desired State)를 정의하는 파일이 yaml 파일이며,
어떤 동작을 취할지는 쿠버네티스에서 Controller라고 불리는 개체가 내부적으로 결정한다.
이 Controller는 쿠버네티스 API 서버의 Watch API를 통해
etcd(쿠버네티스의 상태를 저장하는 분산 코디네이터)에 저장된 상태 데이터를 받아와 동작을 수행한다.Controller Manager
이론상 쿠버네티스의 컨트롤러는 모두 개별적으로 존재할 수도 있지만, 복잡성을 줄이기 위해 쿠버네티스 컨트롤러 매니저라는 하나의 컴포넌트에 구현해 놓았다. 이는 핵심 컴포넌트이므로 kube-system 네임스페이스에서 포드로 실행되고 있다.
Custom Resource
디플로이먼트, 서비스 등의 오브젝트 묶음을 커스텀 리소스로 추상화함으로써, 쿠버네티스 리소스를 묶어 놓은 패키지처럼 사용할 수도 있고, 쿠버네티스와 전혀 상관없는 로직을 커스텀 리소스와 연동할 수도 있다.
# Custom Resource 생성 절차
1) 바람직한 상태(Desired State)로 변화시킬 수 있는 컨트롤러를 구현, 실행
2) Custom Resource의 상세 정보를 정의하는 CRD(Custom Resource Definition) 리소스를 생성
3) CRD에 정의된 데이터에 맞춰 Custom Resource를 생성
4) 이 생성을 감지하고, 바람직한 상태(Desired State)가 되도록 적절한 작업을 수행Custom Resource CRD
커스텀 리소스는 customresourcedefinition이라는 오브젝트를 통해 정의할 수 있다. 이름이 길기 때문에 CRD(Custom Resource Definition)로 줄여 부른다. 마치 클래스와 인스턴스의 관계처럼, CRD 자체가 커스텀 리소스가 아니라 CRD를 통해 커스텀 리소스를 생성해야 비로소 의미를 가진다.
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: v1alpha1 # 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"] # 반드시 필요한 항목
properties: # C.R.에 저장될 데이터 형식을 정의
spec:
required: ["myvalue"]
properties:
myvalue:
type: "string"
minimum: 1kubectl apply -f {crd 정의 파일}
kubectl apply -f {crd 생성 파일, 정의 파일의 kind가 명시된}Custom Controller와 Operator 패턴
커스텀 리소스가 의미를 갖기 위해서는, 커스텀 리소스를 생성했을 때 특정 동작을 수행하도록 정의하는 컨트롤러가 별도로 구현되어야 한다.
컨트롤러가 동작하는 것은 Custom Resource의 생성을 감지하여 Custom Resource가 Desired State가 되도록(이런 동작을 쿠버네티스에서는 Reconcile이라 한다) 하기 위함이다. 이런 일련의 동작을 통해 CRD를 사용할 수 있도록 컨트롤러를 구현하는 방법을 오퍼레이터(Operator) 패턴이라고 한다.
정리하며
쿠버네티스의 Custom Resource는 기본 리소스를 넘어 도메인에 특화된 추상화를 가능하게 한다. CRD로 리소스 스키마를 정의하고, 커스텀 컨트롤러가 Reconcile 루프를 통해 Desired State를 유지하는 Operator 패턴은 현재 쿠버네티스 생태계에서 가장 널리 쓰이는 확장 방법이다.