-
[Kubernetes] 확장 - CustomResourceDefinitions (CRD)공부/데이터 2025. 2. 24. 13:15
CustomResourceDefinitions (CRD)
CRD는 쿠버네티스 API를 확장하여 사용자 정의 리소스를 정의하는 메커니즘입니다. CRD를 사용하면 사용자는 원하는 종류의 리소스를 정의하고 해당 리소스에 대한 CRUD (Create, Read, Update, Delete) 작업을 수행할 수 있습니다. CRD는 쿠버네티스 API 서버에 등록되어 관리되며
kubectl
과 같은 명령행 도구를 사용하여 상호 작용할 수 있습니다.CRD를 사용하는 이유
- 확장성: CRD를 사용하면 쿠버네티스에 필요한 기능을 추가하여 확장할 수 있습니다. 쿠버네티스 자체에는 없는 기능을 CRD를 통해 정의하고 사용할 수 있습니다.
- 유연성: CRD는 사용자가 원하는 종류의 리소스를 자유롭게 정의할 수 있도록 지원합니다. 애플리케이션의 특성에 맞춰 필요한 리소스를 정의하고 관리할 수 있습니다.
- 재사용성: CRD를 통해 정의된 리소스는 다른 쿠버네티스 리소스와 마찬가지로 재사용할 수 있습니다. 한 번 정의된 CRD는 여러 번 활용하여 동일한 종류의 리소스를 생성하고 관리할 수 있습니다.
- 자동화: CRD와 함께 Operator 패턴을 사용하면 복잡한 애플리케이션의 배포 및 관리를 자동화할 수 있습니다. Operator는 CRD를 감시하고, 정의된 로직에 따라 리소스를 관리하는 역할을 합니다.
CRD 사용 사례
- 데이터베이스 관리: 데이터베이스를 쿠버네티스 환경에서 관리하기 위해 CRD를 사용할 수 있습니다. 예를 들어, MySQL, PostgreSQL과 같은 데이터베이스의 인스턴스를 CRD로 정의하고, Operator를 통해 데이터베이스의 배포, 확장, 백업 등을 자동화할 수 있습니다.
- 미들웨어 관리: Kafka, Redis와 같은 미들웨어를 쿠버네티스 환경에서 관리하기 위해 CRD를 사용할 수 있습니다. CRD를 통해 미들웨어의 인스턴스를 정의하고, Operator를 통해 미들웨어의 배포, 확장, 장애 복구 등을 자동화할 수 있습니다.
- 애플리케이션 관리: 특정 애플리케이션의 배포 및 관리를 자동화하기 위해 CRD를 사용할 수 있습니다. 예를 들어, 웹 애플리케이션, 모바일 애플리케이션, 게임 서버 등을 CRD로 정의하고, Operator를 통해 애플리케이션의 배포, 업데이트, 스케일링 등을 자동화할 수 있습니다.
- 네트워크 관리: 네트워크 장비 또는 서비스를 쿠버네티스 환경에서 관리하기 위해 CRD를 사용할 수 있습니다. 예를 들어, 로드 밸런서, 방화벽 등을 CRD로 정의하고, Operator를 통해 네트워크 장비 또는 서비스의 설정, 배포, 관리 등을 자동화할 수 있습니다.
예시
ManagedDatabase라는 CRD를 정의하여 데이터베이스 인스턴스를 관리하고 데이터베이스의 백업 및 복구 기능을 포함하는 예시입니다
- CRD 정의 및 생성
ManagedDatabase CRD를 정의하는 YAML 파일입니다.
apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: name: manageddatabases.example.com spec: group: example.com versions: - name: v1alpha1 served: true storage: true schema: openAPIV3Schema: type: object properties: spec: type: object properties: engine: type: string enum: ["mysql", "postgresql"] size: type: integer storage: type: string backupSchedule: type: string status: type: object properties: ready: type: boolean lastBackup: type: string
spec
: 데이터베이스 엔진(engine), 크기(size), 저장소(storage), 백업 스케줄(backupSchedule)을 정의합니다.status
: 데이터베이스 준비 상태(ready), 마지막 백업 시간(lastBackup)을 정의합니다.
kubectl apply -f manageddatabase-crd.yaml
- Custom Resource 정의 및 생성
ManagedDatabase CRD를 기반으로 데이터베이스 인스턴스를 생성하는 YAML 파일입니다.
apiVersion: example.com/v1alpha1 kind: ManagedDatabase metadata: name: my-database spec: engine: mysql size: 5 storage: "10Gi" backupSchedule: "0 0 * * *" # 매일 자정에 백업
kubectl apply -f my-database.yaml
- Operator 개발
실제 데이터베이스 프로비저닝, 백업/복구 로직은 Operator를 통해 구현해야 합니다. Operator는 "ManagedDatabase" CRD를 감시하고, 사용자가 정의한 스펙에 따라 데이터베이스를 생성하고 관리합니다.
- Custom Resource 상태 확인
kubectl get manageddatabases my-database -o yaml
위 명령어를 통해 데이터베이스의 상태(status)를 확인할 수 있습니다. Operator는 데이터베이스가 준비되면
status.ready
를true
로, 백업이 완료되면status.lastBackup
을 업데이트합니다.ConfigMap과 CRD 중 어느 것을 사용해야 할까?
ConfigMap
ConfigMap은 애플리케이션의 설정 파일이나 환경 변수와 같은 구성 데이터를 키-값 쌍 형태로 저장하는 데 사용됩니다. 애플리케이션은 ConfigMap에 저장된 데이터를 환경 변수, 볼륨 마운트 등을 통해 접근하여 자신의 설정을 구성할 수 있습니다.
ConfigMap 사용 사례
- 애플리케이션의 데이터베이스 연결 정보, API 키, 각종 설정 값 등을 저장하는 경우
- 애플리케이션의 로깅 설정, 캐싱 설정 등 환경에 따라 달라지는 설정을 관리하는 경우
- 여러 파드에서 공유하는 공통 설정 값을 관리하는 경우
ConfigMap과 CRD 선택 기준
- 애플리케이션 설정 데이터 관리: ConfigMap을 사용합니다.
- 사용자 정의 리소스 정의 및 관리: CRD를 사용합니다.
- 복잡한 애플리케이션 관리 및 자동화: CRD와 Operator를 함께 사용합니다.
예시
애플리케이션 설정 관리 (ConfigMap)
웹 애플리케이션의 데이터베이스 연결 정보, API 키, 로깅 설정을 관리해야 한다고 가정합니다. 이 때, ConfigMap을 사용하여 데이터베이스 연결 정보, API 키, 로깅 설정을 키-값 쌍 형태로 저장합니다. 애플리케이션은 ConfigMap에 저장된 데이터를 환경 변수 또는 볼륨 마운트를 통해 접근하여 자신의 설정을 구성합니다.
apiVersion: v1 kind: ConfigMap metadata: name: my-webapp-config data: database_url: jdbc:mysql://mydb.example.com:3306/mydb api_key: abcdef123456 log_level: INFO
데이터베이스 관리 자동화 (CRD)
쿠버네티스 환경에서 MySQL 데이터베이스를 관리해야 합니다. 데이터베이스의 배포, 확장, 백업 등을 자동화하려 한다고 가정합니다. CRD를 사용하여 MySQL 데이터베이스 인스턴스를 나타내는 사용자 정의 리소스를 정의합니다. Operator를 개발하여 CRD를 감시하고, 정의된 로직에 따라 MySQL 데이터베이스를 관리합니다.
apiVersion: mysql.example.com/v1alpha1 kind: MySQLDatabase metadata: name: my-mysql-instance spec: size: 3 storage: 10Gi version: 8.0
레퍼런스
https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/