Kubernetes Helm과 Operator: 차트 패키징·Kustomize·CRD 도메인 자동화
개요
실제 애플리케이션은 Deployment·Service·ConfigMap·Ingress 등 수십 개의 매니페스트로 이뤄진다. 이를 손으로 관리하고 환경(dev/staging/prod)마다 값을 바꾸는 일은 금세 감당하기 어려워진다. Helm은 매니페스트를 템플릿화해 하나의 패키지(차트)로 묶고 값(values)만 바꿔 배포하며, Kustomize는 템플릿 없이 오버레이로 환경 차이를 표현한다. 한 걸음 더 나아가 Operator는 CRD로 도메인 지식을 인코딩해 사람이 하던 운영 작업(백업·페일오버·업그레이드)을 컨트롤러가 대신하게 만든다. 이는 Kubernetes - 개요와 아키텍처의 수렴 루프 개념을 사용자 정의 리소스로 확장한 것이다.
핵심 개념과 원리
Helm: Kubernetes의 패키지 매니저
Helm은 애플리케이션을 **차트(chart)**라는 패키지로 관리한다. 핵심 구성은 다음과 같다.
| 구성 요소 | 역할 |
|---|---|
Chart.yaml | 차트 메타데이터(이름·버전·의존성) |
templates/ | Go 템플릿으로 작성된 매니페스트 |
values.yaml | 템플릿에 주입되는 기본 설정값 |
| 릴리스(release) | 클러스터에 설치된 차트의 특정 인스턴스 |
동작 원리는 “템플릿 + values → 렌더링된 매니페스트 → 클러스터 적용”이다. 같은 차트로 values-prod.yaml, values-dev.yaml만 바꿔 여러 환경에 배포할 수 있다. Helm은 각 설치를 릴리스로 추적하고 리비전 이력을 보관하므로, 문제가 생기면 helm rollback으로 이전 릴리스로 되돌린다(Helm 3부터는 서버 사이드 Tiller가 사라지고 릴리스 상태를 클러스터 Secret에 저장한다).
Kustomize: 템플릿 없는 오버레이
Kustomize는 kubectl에 내장된 도구로, Helm과 접근이 정반대다. 템플릿 문법 없이 base(공통 매니페스트)를 두고 환경별 overlay에서 패치를 얹어 차이를 표현한다.
base/ # 공통 Deployment, Service …
overlays/
dev/ # replicas 1, 개발 이미지 태그 패치
prod/ # replicas 5, 리소스 상향 패치
순수 YAML이라 학습 곡선이 낮고 Git diff가 명확한 대신, 값 계산·조건 분기 같은 로직은 표현하기 어렵다. 복잡한 배포 로직·의존성 관리는 Helm, 단순한 환경 오버레이는 Kustomize가 강점이다. 둘을 함께 쓰기도 한다.
| 항목 | Helm | Kustomize |
|---|---|---|
| 방식 | 템플릿 + values | base + overlay 패치 |
| 로직 | 조건·반복·함수 지원 | 로직 없음(선언적 패치) |
| 릴리스 관리 | 있음(rollback) | 없음(GitOps 도구에 위임) |
| 배포 로직 복잡 | 강함 | 약함 |
CRD: API 확장
**CustomResourceDefinition(CRD)**은 Kubernetes API에 새로운 리소스 종류를 추가하는 메커니즘이다. CRD를 등록하면 PostgresCluster, Certificate 같은 사용자 정의 리소스를 마치 내장 리소스처럼 kubectl get으로 다룰 수 있다. CRD 자체는 데이터 스키마일 뿐, 그 리소스에 반응하는 로직은 컨트롤러가 제공한다.
Operator 패턴: 운영 지식의 코드화
Operator는 “CRD + 전용 컨트롤러”의 조합이다. 사람 운영자(operator)가 하던 작업(설치, 설정, 백업, 장애 복구, 롤링 업그레이드)을 컨트롤러의 수렴 루프에 인코딩한다. 동작 원리는 내장 컨트롤러와 동일하다.
사용자가 커스텀 리소스(desired state) 선언
↓
Operator 컨트롤러가 감시(watch)
↓
현재 상태와 비교 → 도메인 작업 수행(파드·PVC·Job 생성, 백업 실행 …)
↓
반복(reconcile)
예를 들어 데이터베이스 Operator에 PostgresCluster 리소스로 “복제본 3, 자동 백업 매일”을 선언하면, Operator가 StatefulSet·PVC를 만들고 페일오버와 백업 CronJob까지 자동으로 관리한다. 사람이 런북을 따라 하던 일을 소프트웨어가 대신하는 것이다. Prometheus Operator, cert-manager, 각종 DB Operator가 대표 사례다.
실전
Helm 기본 명령
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
helm search repo postgresql # 차트 검색
# 설치(릴리스 이름 my-db), 환경별 값 오버라이드
helm install my-db bitnami/postgresql \
-f values-prod.yaml \
--set auth.database=appdb
helm list # 설치된 릴리스 목록
helm upgrade my-db bitnami/postgresql -f values-prod.yaml
helm rollback my-db 1 # 리비전 1로 롤백
helm uninstall my-db
helm template my-db bitnami/postgresql -f values-prod.yaml # 적용 없이 렌더 결과 확인차트 템플릿 예시
# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Release.Name }}-web
spec:
replicas: {{ .Values.replicaCount }}
template:
spec:
containers:
- name: web
image: "{{ .Values.image.repo }}:{{ .Values.image.tag }}"# values.yaml
replicaCount: 3
image:
repo: myorg/web
tag: "1.4.0"CRD 정의 예시
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: backups.ops.example.com
spec:
group: ops.example.com
names:
kind: Backup
plural: backups
scope: Namespaced
versions:
- name: v1
served: true
storage: true
schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
schedule: { type: string } # cron 표현
target: { type: string } # 백업 대상이제 Backup 리소스를 선언하면, 짝을 이루는 Operator 컨트롤러가 이를 감시하며 백업 Job을 스케줄한다.
함정과 베스트 프랙티스
helm install을 직접 클러스터에 남발하지 말 것: 어떤 값으로 배포됐는지 추적이 어렵다. values 파일을 Git에 두고 GitOps로 배포한다 → Kubernetes - GitOps와 ArgoCD.- CRD와 CR의 생명주기 분리: Helm으로 Operator를 설치할 때 CRD 삭제가 CR(데이터) 삭제로 이어지지 않도록 주의한다. CRD 삭제는 해당 CR 전부를 지운다.
- Operator 남용 경계: 단순 무상태 앱까지 Operator로 감싸면 과설계다. 상태·운영 로직이 복잡한 시스템(DB, 메시지 큐)에 적합하다.
- 차트 버전 고정:
latest태그·미고정 차트 버전은 배포 재현성을 해친다. 차트·이미지 버전을 명시한다. helm template/helm diff로 사전 검증: 실제 적용 전 렌더 결과와 변경 diff를 확인한다.
정리
Helm은 매니페스트를 템플릿+values로 패키징해 릴리스 단위로 배포·롤백하고, Kustomize는 템플릿 없이 base+overlay로 환경 차이를 표현한다. CRD는 Kubernetes API를 확장하고, Operator는 CRD와 컨트롤러를 결합해 운영 지식을 수렴 루프로 자동화한다. 이렇게 패키징한 애플리케이션을 Git을 단일 진실 원천으로 삼아 선언적으로 배포하는 방식이 Kubernetes - GitOps와 ArgoCD이며, 그 위에서 무중단 교체를 다루는 것이 배포 전략 - Rolling·Blue-Green·Canary다.