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와 함께 활용하면 자동화된 애플리케이션 운영 가능
'Kubernetes > Kubernetes Advanced' 카테고리의 다른 글
Kubernetes 리소스 시리즈 #18: Helm (패키지 관리 및 배포 자동화) (0) | 2025.03.05 |
---|---|
Kubernetes 리소스 시리즈 #17: Operator (확장 및 기타 리소스) (0) | 2025.03.05 |
Kubernetes 리소스 시리즈 #15: Cluster Autoscaler & Metrics Server (오토스케일링 및 모니터링 리소스) (0) | 2025.03.05 |
Kubernetes 리소스 시리즈 #14: Horizontal & Vertical Pod Autoscaler (오토스케일링 및 모니터링 리소스) (0) | 2025.03.05 |
Kubernetes 리소스 시리즈 #13: ServiceAccount (정책 및 접근 제어 리소스) (0) | 2025.03.05 |