Kubernetes/Kubernetes Advanced

Kubernetes 리소스 시리즈 #16: CustomResourceDefinition(CRD) (확장 및 기타 리소스)

ygtoken 2025. 3. 5. 00:39
728x90

Kubernetes는 기본적으로 Pod, Deployment, Service 등의 리소스를 제공하지만,
특정 애플리케이션에 맞게 **새로운 리소스를 정의하고 관리할 수 있도록 CustomResourceDefinition(CRD)**를 지원합니다.

이번 글에서는 CRD의 개념, 활용법, 그리고 실전 예제를 정리하겠습니다.


🔹 CRD(CustomResourceDefinition)란?

**CRD(CustomResourceDefinition)**는 사용자가 Kubernetes에서 새로운 리소스를 정의하고 관리할 수 있도록 하는 확장 기능입니다.
✔️ 기본 제공되지 않는 새로운 리소스 유형을 정의 가능
✔️ kubectl을 통해 기본 리소스처럼 관리 가능
✔️ Operator 패턴과 함께 활용하여 자동화된 애플리케이션 운영 가능

💡 CRD를 사용하면, Kubernetes를 애플리케이션에 맞게 확장할 수 있습니다.


🔹 CRD 활용 사례

활용 사례 설명

데이터베이스 운영 MySQLCluster 같은 CRD를 만들어 Kubernetes에서 데이터베이스 클러스터 관리
CI/CD 자동화 Pipeline CRD를 만들어 배포 프로세스 자동화
스토리지 관리 VolumeSnapshot CRD를 통해 볼륨 스냅샷 관리
네트워크 설정 NetworkPolicy 외에 추가적인 네트워크 제어 기능을 CRD로 확장 가능

💡 CRD는 특정 애플리케이션에 맞게 Kubernetes를 확장하는 데 사용됩니다.


🔹 CRD 생성 예제

아래 예제는 Database라는 새로운 리소스를 생성할 수 있도록 CRD를 정의합니다.

1️⃣ CRD 정의 (database CRD 생성)

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition  # CRD 리소스 선언
metadata:
  name: databases.example.com  # CRD의 이름 (도메인 포함)
spec:
  group: example.com  # API 그룹명
  names:
    kind: Database  # 새로운 리소스의 Kind
    plural: databases  # 복수형 리소스 이름
    singular: database  # 단수형 리소스 이름
    shortNames:
      - db  # 짧은 별칭
  scope: Namespaced  # 네임스페이스 범위 적용
  versions:
    - name: v1
      served: true  # API 서버에서 제공 여부
      storage: true  # 저장되는 기본 버전 지정
      schema:
        openAPIV3Schema:
          type: object
          properties:
            spec:
              type: object
              properties:
                engine:
                  type: string  # 데이터베이스 엔진 (예: MySQL, PostgreSQL)
                version:
                  type: string  # 데이터베이스 버전
                storage:
                  type: string  # 할당할 스토리지 크기

💡 이제 Database라는 새로운 리소스를 Kubernetes에서 관리할 수 있습니다.

kubectl apply -f crd-database.yaml
kubectl get crds

출력 예시:

NAME                     CREATED AT
databases.example.com    2025-03-04T12:00:00Z

🔹 새로운 CRD를 활용하여 리소스 생성

위에서 만든 Database CRD를 사용하여 새로운 리소스를 배포할 수 있습니다.

2️⃣ Database 리소스 생성

apiVersion: example.com/v1
kind: Database  # 위에서 생성한 CRD의 Kind
metadata:
  name: my-database
spec:
  engine: "MySQL"  # MySQL 엔진 사용
  version: "8.0"
  storage: "10Gi"  # 10Gi 크기의 스토리지 할당
kubectl apply -f database.yaml
kubectl get databases

출력 예시:

NAME          ENGINE   VERSION   STORAGE
my-database  MySQL    8.0       10Gi

💡 기본 Kubernetes 리소스처럼 kubectl get databases 명령으로 관리할 수 있습니다.


🔹 CRD를 Operator와 함께 활용하기

CRD는 단순히 새로운 리소스를 정의하는 역할만 하지만,
Operator를 사용하면 해당 리소스를 자동으로 생성/관리할 수 있습니다.

예를 들어, Database CRD를 사용하여 새로운 MySQL 인스턴스를 생성하고,
Operator가 이를 감지하여 MySQL Pod와 PVC를 자동으로 배포할 수 있습니다.

💡 Operator 패턴은 CRD를 사용하여 애플리케이션 운영을 자동화하는 데 활용됩니다.


🔹 CRD 삭제

kubectl delete crd databases.example.com

💡 CRD를 삭제하면 해당 CRD를 기반으로 생성된 모든 리소스도 함께 삭제됩니다.


🚀 마무리

✔️ CRD는 Kubernetes에서 사용자 정의 리소스를 만들 수 있도록 하는 확장 기능
✔️ kubectl을 통해 기본 리소스처럼 관리 가능
✔️ Operator와 함께 활용하면 자동화된 애플리케이션 운영 가능

 

728x90