사용자 정의 리소스와 오퍼레이터를 통한 확장
사용자 정의 리소스
- kubectl 명령은 쿠버네티스 API와 거의 일대일로 대응
- 모든 리소스에 공통으로 있는 표준 action은 create, get, list, match, delete 등
- CustomResourceDefinition(CRD)으로 쿠버네티스에 새로운 리소스 타입을 추가할 수 있음
- 사용자 정의 리소스 및 객체의 정보는 etcd DB에 저장됨
- 사용자 정의 리소스 역시 API 표준 action 지원
- CustomResourceDefinition(CRD)가 생성되면 이 정의와 API 버전 및 유형이 일치하는 정의를 작성하여 사용자 정의 리소스를 생성 가능
- 일반적인 리소스 정의는 리소스 유형 및 정의의 각 필드에 값을 지정한 YAML 파일로 작성된다
- 파드 정의에는 컨테이너 목록이 있고, 컨테이너 정의에는 이미지 이름과 port 등이 지정되는 등의 스키마를 k8s에서 저장하고 있으므로 리소스 구조를 바탕으로 유효성 검사가 가능하다
- API의 버전 및 필드가 여기에서 쓰이는데 v1, v2beta2 버전에 따라 HorizotalPodAutoScaler 리소스의 구조가 다름
- 이러한 구조를 기술하는 스키마를 CRD 객체로 생성
todo-crd.yaml
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: todos.ch20.kiamol.net # 리소스 정의에서 이 이름이 일치해야함
spec:
group: ch20.kiamol.net # 일련의 리소스를 그룹으로 묶음
scope: Namespaced # 유효 범위 : 클러스터전체 / 네임스페이스
names: # yaml이나 kubectl에서 리소스 지칭하는 이름
plural: todos
singular: todo
kind: ToDo
versions: # 버전 여러 개 가능
- name: v1 # 버전마다 스키마가 정의
served: true # API를 통해 리소스 다룰 수 있음
storage: true # etcd에 리소스 정보 저장
schema:
openAPIV3Schema:
type: object
properties:
spec: # 사용자 정의 리소스의 스키마
type: object # spec 필드 하위 item 필드 존재
properties:
item:
type: string
todo-ch20.yaml
apiVersion: "ch20.kiamol.net/v1" # 그룹 명 및 버전
kind: ToDo # 리소스 유형
metadata:
name: ch20
spec:
item: "Finish Kiamol ch20" # 스키마와 일치해야 함
- CRD를 배치하고나면 쿠버네티스 API가 사용자 정의 리소스 ToDo를 지원함
- 그러면 kind가 ToDo인 리소스를 배치 가능
- ToDo 리소스를 여러 개 배치한 경우 CRD의 plural name으로 조회 가능
kubectl get todos- 단 건 조회 시 에는
kubectl get todo ch20 # 리소스 이름
- CRD를 삭제하면 이 정의를 사용한 모든 리소스가 삭제 됨
Operator를 이용한 3rd-party 컴포넌트 관리
- operator는 사용자 정의 리소스 및 컨트롤러를 사용하여 애플리케이션에 완전한 생애주기를 관리
- operator 배치 시 3rd-party 컴포넌트를 하나의 서비스 처럼 사용 가능
ex) NATS 메시지 큐 오퍼레이터
1) NATS operator에 쓰이는 CRD 및 RBAC 배치
2) operator 배치
3) 사용자 정의 리소스 배치
- CRD에 지정된대로 리소스 생성
apiVersion: nats.io/v1alpha2 kind: NatsCluster metadata: name: todo-list-queue spec: size: 3 # 메시지 큐 규모 version: "1.3.0" # 사용할 nats 버전 - NatsCluster 리소스를 배치하면 operator가 각 Service 및 Secret을 생성하여 배치함
- 즉 NatsCluster의 파드의 유지 보수 작업을 operator에서 수행
- operator 정의는 명확하지 않으며 k8s에 operator라는 객체는 없음
ex) Kafka 오퍼레이터
1) strimzi helm chart 설치
2) 각 kafka용 CRD와 strimzi-cluster-operator deploy 및 pod가 생성되어 배치됨 (CRD는 operator가 생성함)
3) kafka 리소스 배치 시 operator가 pod 컨트롤러 역할 수행
- operator는 삭제해도 operator가 생성한 리소스 중 일부는 남아 있을 수도 있음
오퍼레이터 직접 작성하기
- operator로 동작할 deployment 작성하며 아래 내용이 포함됨
- RBAC가 적용된 서비스 계정
- CRD를 생성하는 컨테이너를 초기화 컨테이너로 지정
- 컨트롤러 역할을 수행할 컨테이너 정의
- ConfigMap, Secret, Service, PVC 등에 대한 정의
- 사용자 정의 리소스 배치 시 operator가 리소스의 파라미터가 설정된 애플리케이션 인스턴스를 생성

- 초기화 컨테이너는 CRD를 추가하는 것이 전부
- 컨트롤러가 사용자 정의 리소스에 일어난 변화를 감지하면 그에 맞추어 리소스를 생성하거나 삭제
- operator는 표준 쿠버네티스 객체를 기반으로 하며, 간단한 사용자 정의 리소스와 함께 최적 구성을 갖춘 복잡한 애플리케이션을 배치하는데 사용