안녕하세요! 쿠버네티스에서 기본 오브젝트 외에 "나만의 리소스"를 만들고 싶다는 생각 해보셨나요? 오늘은 그 꿈을 현실로 만들어 줄 CRD(Custom Resource Definition)에 대해 깊이 있게 알아보겠습니다. 특히 CKAD(Certified Kubernetes Application Developer) 시험을 준비하는 분들이라면, 이 포스팅이 큰 도움이 될 것입니다. 🛠️

1. CRD, 왜 필요할까? 🧐 쿠버네티스 확장성의 핵심
쿠버네티스는 Pod, Deployment, Service 등 강력한 기본 리소스를 제공합니다. 하지만 모든 애플리케이션의 복잡한 요구사항을 다 담기에는 한계가 있죠.
이때 CRD가 등장합니다! CRD는 쿠버네티스 API를 확장하여 사용자 정의 리소스(Custom Resource, CR)를 정의할 수 있게 해주는 "설계도"입니다.
- 나만의 리소스 타입 생성: 예를 들어, Backup, DatabaseCluster, CDNConfig 같은 우리 서비스만의 고유한 리소스 타입을 만들 수 있습니다.
- Kubernetes-native 관리: 이렇게 만든 CR은 kubectl get <my-resource>, kubectl apply -f <my-resource.yaml>처럼 쿠버네티스 기본 리소스처럼 동일하게 관리할 수 있습니다.
- Operator 패턴의 기반: CRD는 Operator 패턴의 핵심입니다. CR을 생성하면, 이를 감지한 Operator(컨트롤러)가 실제 동작(Pod 배포, 설정 변경 등)을 수행합니다.
2. CRD의 주요 구성 요소 해부 🔍
CRD를 정의하는 YAML 파일을 보면 몇 가지 중요한 필드들이 있습니다.
- apiVersion: apiextensions.k8s.io/v1: CRD 자체를 정의하는 API 버전입니다.
- kind: CustomResourceDefinition: 이 파일이 CRD임을 명시합니다.
- metadata.name: <복수형>.<그룹명>: CRD의 고유한 이름입니다. (예: databases.mycompany.com)
- spec.group: <그룹명>: API 그룹을 정의합니다. (예: mycompany.com)
- spec.versions: 리소스의 버전을 정의합니다. v1, v2alpha1 등으로 관리하며, served: true는 API 서버에서 이 버전을 사용한다는 의미이고, storage: true는 이 버전이 etcd에 저장된다는 의미입니다.
- spec.scope: 리소스의 범위입니다. Namespaced (네임스페이스 단위) 또는 Cluster (클러스터 전역) 중 하나를 선택합니다.
- spec.names:
- plural: 복수형 이름 (예: databases)
- singular: 단수형 이름 (예: database)
- kind: 리소스의 Kind 이름 (예: Database) - YAML 파일의 kind 필드에 사용됩니다.
- shortNames: 짧은 별칭 (예: db)
- spec.schema.openAPIV3Schema: 가장 중요! 실제 커스텀 리소스(CR)의 데이터 구조(필드, 타입, 유효성 검사 규칙)를 정의합니다.
3. [CKAD 대비 실전 튜토리얼] 나만의 AppConfig 리소스 만들기 🧑💻
CKAD 시험에서는 CRD를 직접 코딩하기보다, 제공된 CRD를 배포하고, 그 스펙에 맞는 CR을 생성하는 문제가 주로 출제됩니다. 아래 튜토리얼을 통해 실력을 다져보세요.
🚀 단계 1: AppConfig CRD 정의 및 클러스터에 배포
우리의 애플리케이션 설정을 관리할 AppConfig라는 리소스를 정의해 봅시다.
YAML
# appconfig-crd.yaml
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: appconfigs.example.com # 복수형.그룹명
spec:
group: example.com # API 그룹
versions:
- name: v1
served: true
storage: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
env:
type: string
description: "Environment for the application (e.g., dev, prod)"
replicas:
type: integer
minimum: 1
maximum: 10
description: "Number of replicas for the application"
message:
type: string
description: "A custom message for the application"
scope: Namespaced # 네임스페이스 범위 리소스
names:
plural: appconfigs
singular: appconfig
kind: AppConfig
shortNames: ["ac"] # 단축어
- 배포: kubectl apply -f appconfig-crd.yaml
🚀 단계 2: CRD가 잘 생성되었는지 확인
이제 쿠버네티스가 AppConfig라는 새로운 리소스를 인식했는지 확인합니다.
- CRD 목록 확인: kubectl get crd | grep appconfigs
- API 리소스 확인: kubectl api-resources | grep appconfig
- ac 단축어와 example.com 그룹이 보이면 성공입니다.
🚀 단계 3: AppConfig 커스텀 리소스(CR) 인스턴스 생성
정의된 AppConfig 타입에 맞춰 실제 애플리케이션 설정을 담은 객체를 생성합니다.
YAML
# my-app-config.yaml
apiVersion: example.com/v1 # CRD에 정의된 group/version 사용
kind: AppConfig # CRD에 정의된 kind 사용
metadata:
name: frontend-config
namespace: default
spec:
env: "development"
replicas: 3
message: "Welcome to my K8s app!"
- 배포: kubectl apply -f my-app-config.yaml
🚀 단계 4: 생성된 커스텀 리소스 조회 및 관리
일반 Pod처럼 kubectl 명령어로 관리합니다.
- 조회: kubectl get appconfigs 또는 kubectl get ac
- 상세 확인: kubectl describe ac frontend-config
- 수정: kubectl edit ac frontend-config (예: replicas 값을 5로 변경)
4. CKAD 시험 꿀팁 🍯 CRD 관련 문제 이렇게 접근하자
- API 그룹/버전/Kind 확인: 문제가 요구하는 CRD의 apiVersion, kind 필드를 정확히 찾아야 합니다. kubectl api-resources, kubectl explain <crd-name> 명령어가 유용합니다.
- spec.schema 이해: CRD의 spec.schema 부분을 보고 어떤 필드(env, replicas 등)가 필요한지, 그리고 각 필드의 데이터 타입(string, integer)이 무엇인지 정확히 파악해야 합니다.
- 오타 주의: YAML 파일 작성 시 필드명이나 들여쓰기 오타는 실패의 지름길입니다. 작은 오타도 용납되지 않으니 신중하게 작성하고 검토하세요.
🚀 마치며: CRD로 여는 무한한 확장성
CRD는 쿠버네티스의 무한한 확장성을 보여주는 핵심 기능입니다. 여러분만의 리소스를 정의하고 관리하는 능력을 갖춘다면, 훨씬 더 강력하고 유연한 클러스터 운영이 가능해질 것입니다. CKAD 시험에서도 이 개념을 잘 이해하고 적용하는 것이 중요하니, 위 튜토리얼을 꼭 직접 실습해보시길 바랍니다.
궁금한 점이 있다면 언제든지 댓글로 남겨주세요! 다음에는 Operator 패턴과 CRD 연동에 대해 더 심화된 내용으로 찾아오겠습니다. 🧑💻
'클라우드 > 쿠버네티스' 카테고리의 다른 글
| 🔐 Kubernetes Secret: 민감한 정보를 안전하게 관리하는 법 (과 그 한계) (0) | 2026.02.09 |
|---|---|
| ☸️ Kubernetes ConfigMap: 설정과 코드를 완벽하게 분리하는 법 (0) | 2026.02.09 |
| [K8s 보안] 실전 CKAD 대비: NetworkPolicy로 마스터하는 포드 통신 제어 전략 (0) | 2026.02.07 |
| 🏆 쿠버네티스 트래픽 제어의 진화: Ingress에서 Gateway API, 그리고 Traefik CRD까지 (0) | 2026.02.07 |
| ⚓ Helm 4: 더 강력하고 안전해진 쿠버네티스 항해의 새로운 동반자 (0) | 2026.02.06 |