ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Kubernetes] 확장 - CustomResourceDefinitions (CRD)
    공부/데이터 2025. 2. 24. 13:15

    CustomResourceDefinitions (CRD)

    CRD는 쿠버네티스 API를 확장하여 사용자 정의 리소스를 정의하는 메커니즘입니다. CRD를 사용하면 사용자는 원하는 종류의 리소스를 정의하고 해당 리소스에 대한 CRUD (Create, Read, Update, Delete) 작업을 수행할 수 있습니다. CRD는 쿠버네티스 API 서버에 등록되어 관리되며 kubectl과 같은 명령행 도구를 사용하여 상호 작용할 수 있습니다.

    CRD를 사용하는 이유

    1. 확장성: CRD를 사용하면 쿠버네티스에 필요한 기능을 추가하여 확장할 수 있습니다. 쿠버네티스 자체에는 없는 기능을 CRD를 통해 정의하고 사용할 수 있습니다.
    2. 유연성: CRD는 사용자가 원하는 종류의 리소스를 자유롭게 정의할 수 있도록 지원합니다. 애플리케이션의 특성에 맞춰 필요한 리소스를 정의하고 관리할 수 있습니다.
    3. 재사용성: CRD를 통해 정의된 리소스는 다른 쿠버네티스 리소스와 마찬가지로 재사용할 수 있습니다. 한 번 정의된 CRD는 여러 번 활용하여 동일한 종류의 리소스를 생성하고 관리할 수 있습니다.
    4. 자동화: CRD와 함께 Operator 패턴을 사용하면 복잡한 애플리케이션의 배포 및 관리를 자동화할 수 있습니다. Operator는 CRD를 감시하고, 정의된 로직에 따라 리소스를 관리하는 역할을 합니다.

    CRD 사용 사례

    1. 데이터베이스 관리: 데이터베이스를 쿠버네티스 환경에서 관리하기 위해 CRD를 사용할 수 있습니다. 예를 들어, MySQL, PostgreSQL과 같은 데이터베이스의 인스턴스를 CRD로 정의하고, Operator를 통해 데이터베이스의 배포, 확장, 백업 등을 자동화할 수 있습니다.
    2. 미들웨어 관리: Kafka, Redis와 같은 미들웨어를 쿠버네티스 환경에서 관리하기 위해 CRD를 사용할 수 있습니다. CRD를 통해 미들웨어의 인스턴스를 정의하고, Operator를 통해 미들웨어의 배포, 확장, 장애 복구 등을 자동화할 수 있습니다.
    3. 애플리케이션 관리: 특정 애플리케이션의 배포 및 관리를 자동화하기 위해 CRD를 사용할 수 있습니다. 예를 들어, 웹 애플리케이션, 모바일 애플리케이션, 게임 서버 등을 CRD로 정의하고, Operator를 통해 애플리케이션의 배포, 업데이트, 스케일링 등을 자동화할 수 있습니다.
    4. 네트워크 관리: 네트워크 장비 또는 서비스를 쿠버네티스 환경에서 관리하기 위해 CRD를 사용할 수 있습니다. 예를 들어, 로드 밸런서, 방화벽 등을 CRD로 정의하고, Operator를 통해 네트워크 장비 또는 서비스의 설정, 배포, 관리 등을 자동화할 수 있습니다.

    예시

    ManagedDatabase라는 CRD를 정의하여 데이터베이스 인스턴스를 관리하고 데이터베이스의 백업 및 복구 기능을 포함하는 예시입니다

    1. 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
    1. 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
    1. Operator 개발

    실제 데이터베이스 프로비저닝, 백업/복구 로직은 Operator를 통해 구현해야 합니다. Operator는 "ManagedDatabase" CRD를 감시하고, 사용자가 정의한 스펙에 따라 데이터베이스를 생성하고 관리합니다.

    1. Custom Resource 상태 확인
    kubectl get manageddatabases my-database -o yaml

    위 명령어를 통해 데이터베이스의 상태(status)를 확인할 수 있습니다. Operator는 데이터베이스가 준비되면 status.readytrue로, 백업이 완료되면 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/

    댓글