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가 강점이다. 둘을 함께 쓰기도 한다.

항목HelmKustomize
방식템플릿 + valuesbase + 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다.