사용자 정의 리소스

  • 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가 리소스의 파라미터가 설정된 애플리케이션 인스턴스를 생성

img.png

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