Custom Resource Definition (CRD)

Yu Sang Min·2025년 6월 21일

CKA

목록 보기
63/110
post-thumbnail

📦 Kubernetes Custom Resource & Custom Controller 개요


🔍 1. 기본 개념 요약

개념설명
ResourceKubernetes가 관리하는 객체(Pod, Deployment 등)
ControllerResource의 상태를 감시하고, 실제 클러스터 상태를 정의된 스펙대로 유지
Custom Resource (CR)사용자가 직접 정의하는 새로운 리소스 타입
Custom Resource Definition (CRD)Kubernetes에 새로운 리소스를 인식시키는 API 확장 정의
Custom ControllerCustom Resource를 감지하고 원하는 작업을 수행하는 코드(주로 Go로 작성)

✈️ 2. 예시: FlightTicket 리소스 정의 흐름

✅ 1단계: 원하는 리소스 정의

apiVersion: flights.com/v1
kind: FlightTicket
metadata:
  name: my-flight-ticket
spec:
  from: "Mumbai"
  to: "London"
  number: 2

⚠️ 아직 이 상태에선 Kubernetes는 FlightTicket이라는 리소스가 무엇인지 모름.


✅ 2단계: CRD (CustomResourceDefinition) 작성

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: flighttickets.flights.com
spec:
  group: flights.com
  names:
    kind: FlightTicket
    plural: flighttickets
    singular: flightticket
    shortNames:
      - ft
  scope: Namespaced
  versions:
    - name: v1
      served: true
      storage: true
      schema:
        openAPIV3Schema:
          type: object
          properties:
            spec:
              type: object
              properties:
                from:
                  type: string
                to:
                  type: string
                number:
                  type: integer
                  minimum: 1
                  maximum: 5

이제 kubectl get flighttickets 같은 명령으로 리소스를 다룰 수 있음.


⚙️ 3. 왜 컨트롤러가 필요한가?

  • CRD만 등록하면, 리소스를 생성하고 저장할 수 있음
  • 하지만 실제로 외부 API 호출, 파일 생성, DB 연결 등의 동작은 안함
  • 그래서 별도로 Custom Controller를 만들어야 함

🎯 4. Custom Controller 역할 예시

리소스 변경컨트롤러 동작
FlightTicket 생성book-flight.com/api에 API 호출
FlightTicket 삭제API로 예약 취소 요청

컨트롤러는 Go 언어로 client-go, controller-runtime 같은 SDK를 통해 작성 가능.


🛠️ 실무 예시 (실제 사용 사례)

사용 예설명
Cert ManagerCRD를 통해 Certificate 리소스를 정의하고, 생성 시 Let's Encrypt 등으로 인증서 발급
Prometheus OperatorServiceMonitor, PrometheusRule 같은 CR 생성 → 자동 모니터링 설정
ArgoCDApplication CR 생성 → GitOps 방식으로 앱 자동 배포

✅ 정리: CRD + Custom Controller 구조도

[User] → kubectl apply -f flightticket.yaml
   ↓
[API Server] → 저장 → [ETCD]
   ↓
[FlightTicket Controller]
   └─> 감지 후 외부 API 호출
profile
React, Node.js, AWS, Git, Github, Github Action, Docker, K8S

0개의 댓글