Kubernetes

Kubernete CRD를 사용하여 새로운 K8S API가 추가되는 과정

DevOps Engineer 2025. 3. 2. 11:01
728x90

Kubernetes에서 Custom Resource Definition (CRD)를 사용하면 새로운 API 리소스를 생성할 수 있습니다. 이 과정을 통해 새로운 리소스 유형을 정의하고, Kubernetes API 서버는 이를 자동으로 관리하며 해당 리소스를 API로 제공하게 됩니다.

 

CRD를 사용하여 새로운 API 리소스를 생성하는 과정:

1️⃣ CRD 정의 및 적용

CRD는 Kubernetes의 apiextensions.k8s.io API 그룹에서 제공하는 리소스로, 새로운 커스텀 리소스 타입을 정의합니다. 이를 적용하면 Kubernetes API 서버가 해당 리소스를 자동으로 감지하고 API를 생성합니다.

CRD 예시

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: widgets.example.com
spec:
  group: example.com
  names:
    kind: Widget       # 리소스의 객체 이름
    plural: widgets    # 복수형 이름 (리소스 목록)
    singular: widget   # 단수형 이름 (리소스 개별)
    shortNames:
      - wd              # 커스텀 리소스의 짧은 이름
  scope: Namespaced     # Namespaced 또는 Cluster-wide 리소스로 지정
  versions:
    - name: v1          # API 버전
      served: true      # 해당 버전에서 이 리소스를 제공
      storage: true     # 해당 버전에서 리소스를 저장
      schema:
        openAPIV3Schema:
          type: object
          properties:
            spec:
              type: object
              properties:
                size:
                  type: string  # 'size'라는 필드를 가진 리소스
 

위의 CRD 정의에서 중요한 요소는:

  • group: API 그룹, 이 예제에서는 example.com.
  • names: 이 리소스의 이름과 관련된 설정 (kind, plural, singular, shortNames).
  • scope: 리소스의 범위 (Namespaced는 네임스페이스 내에서 리소스를 관리).
  • versions: API 버전 정의 (v1 버전의 리소스 제공).

CRD 적용

위 YAML 파일을 kubectl을 통해 적용하여 CRD를 Kubernetes 클러스터에 등록합니다:

kubectl apply -f crd.yaml
 
 

2️⃣ CRD가 API 서버에 의해 등록되고 API가 제공됨

CRD를 적용하면 Kubernetes API 서버는 다음과 같은 과정을 통해 해당 CRD와 관련된 API를 자동으로 제공합니다.

  1. CRD의 정의가 Kubernetes API 서버에 등록됨
    • kubectl apply -f 명령어로 CRD 리소스가 클러스터에 등록됩니다. 이때 API 서버는 새로운 리소스를 감지하고 이를 /apis/example.com/v1/widgets API 엔드포인트로 자동 등록합니다.
  2. API 엔드포인트 생성
    • Kubernetes API 서버는 해당 CRD의 API 엔드포인트를 생성하여 REST API 형태로 사용할 수 있게 합니다.
    • 예를 들어, 위에서 정의한 widgets.example.com CRD는 /apis/example.com/v1/widgets 경로에서 접근할 수 있는 API를 제공하게 됩니다.
  3. Custom Resources를 관리하는 REST API
    • GET, POST, PUT, DELETE 요청을 통해 Kubernetes 클러스터 내에서 Widget 리소스를 관리할 수 있습니다.
    • 예를 들어, kubectl 명령어를 사용하여 Widget 리소스를 관리하려면 다음과 같이 합니다:
      kubectl get widgets.example.com
      kubectl create -f widget.yaml
      kubectl delete widget <widget-name>
  4. Kubernetes API 서버의 동적 API 등록
    • kubectl api-resources 명령어를 실행하면 생성된 Widget 리소스가 목록에 나타납니다.
    kubectl api-resources
    출력 예시:
     
    NAME SHORTNAMES APIGROUP NAMESPACED KIND
    widgets wd example.com true Widget

3️⃣ Custom Resource 사용 예시

Widget 리소스를 실제로 생성하거나 조회할 수 있습니다.

Custom Resource 생성 예시

 
apiVersion: example.com/v1
kind: Widget
metadata:
  name: my-widget
spec:
  size: "large"

이 Widget 리소스를 생성하려면 다음 명령어를 사용합니다:

 

kubectl apply -f widget-example.yaml

Custom Resource 조회 예시

kubectl get widgets.example.com

Custom Resource 삭제 예시

kubectl delete widget my-widget

4️⃣ CRD와 관련된 API 정보 확인

  • 활성화된 CRD 목록 확인:위 명령어로 현재 클러스터에 등록된 모든 CRD를 확인할 수 있습니다.
     
    kubectl get crds
  • Custom Resource 목록 확인:
     
    kubectl get widgets.example.com

 

🔥 정리

  1. CRD 정의: 새로운 리소스를 정의하고, API 서버에 이 리소스를 등록합니다.
  2. API 서버에 API 등록: CRD가 등록되면 Kubernetes API 서버는 자동으로 해당 리소스를 관리할 수 있는 API를 생성합니다.
  3. Custom Resource 사용: 생성된 API를 통해 Custom Resource를 생성, 조회, 업데이트 및 삭제할 수 있습니다.

이 방식으로 Kubernetes는 외부 개발자나 관리자가 정의한 새로운 리소스를 클러스터에서 자동으로 API로 제공합니다.

 

 

728x90