🔧 DevOps

Kustomize

커스터마이즈

Kubernetes 설정 관리 도구. YAML 패치로 환경별 설정.

상세 설명

Kustomize는 Kubernetes 네이티브 설정 관리 도구로, 템플릿 없이 YAML 패치 방식으로 환경별 설정을 관리합니다. kubectl에 내장되어 있어 별도 설치 없이 `kubectl apply -k` 명령으로 바로 사용할 수 있습니다. Google이 개발했으며, Kubernetes SIG-CLI에서 관리합니다.

Kustomize의 핵심 철학은 "Don't Repeat Yourself"입니다. base 디렉토리에 공통 리소스를 정의하고, overlays 디렉토리에서 환경별(dev, staging, prod) 차이점만 패치합니다. 원본 YAML을 직접 수정하지 않으므로 변경 사항 추적이 용이하고, 환경 간 드리프트를 방지합니다.

주요 기능으로는 namePrefix/nameSuffix로 리소스 이름 일괄 변경, configMapGenerator/secretGenerator로 ConfigMap/Secret 자동 생성, images로 컨테이너 이미지 태그 오버라이드, patchesStrategicMerge/patchesJson6902로 세밀한 YAML 수정이 가능합니다.

Helm과 자주 비교되는데, Helm은 템플릿 기반으로 값을 주입하고, Kustomize는 레이어 기반으로 패치를 적용합니다. 복잡한 차트 배포는 Helm이 유리하고, 기존 YAML에 환경별 변형을 가하는 작업은 Kustomize가 직관적입니다. ArgoCD, Flux 같은 GitOps 도구들이 Kustomize를 기본 지원합니다.

코드 예제

# 디렉토리 구조:
# app/
# ├── base/
# │   ├── kustomization.yaml
# │   ├── deployment.yaml
# │   └── service.yaml
# └── overlays/
#     ├── dev/
#     │   └── kustomization.yaml
#     └── prod/
#         ├── kustomization.yaml
#         └── replica-patch.yaml

# base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - deployment.yaml
  - service.yaml

# base/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-server
spec:
  replicas: 1
  selector:
    matchLabels:
      app: api-server
  template:
    spec:
      containers:
        - name: api
          image: api-server:latest
          resources:
            requests:
              memory: "256Mi"
              cpu: "100m"

---
# overlays/prod/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - ../../base
namespace: production
namePrefix: prod-
images:
  - name: api-server
    newName: registry.company.com/api-server
    newTag: v1.2.3
configMapGenerator:
  - name: app-config
    literals:
      - LOG_LEVEL=warn
      - DB_POOL_SIZE=20
patchesStrategicMerge:
  - replica-patch.yaml

# overlays/prod/replica-patch.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-server
spec:
  replicas: 5
  template:
    spec:
      containers:
        - name: api
          resources:
            requests:
              memory: "1Gi"
              cpu: "500m"
            limits:
              memory: "2Gi"
              cpu: "1000m"

# 적용: kubectl apply -k overlays/prod/

실무에서 이렇게 말해요

DevOps: "환경별로 YAML 복붙하다가 staging이랑 prod 설정이 달라져서 장애났잖아요. Kustomize로 구조 바꾸죠."

개발자: "base에 공통 부분 두고 overlays에서 환경별로 replica, resource limit만 패치하면 되겠네요."

DevOps: "네, 그리고 kustomize build로 최종 YAML 미리 확인하고 PR 리뷰 때 diff 보여주면 좋겠어요."

면접관: "Helm과 Kustomize 중 언제 어떤 걸 선택하시나요?"

지원자: "복잡한 조건부 로직이나 루프가 필요한 차트는 Helm이 적합하고, 기존 YAML 매니페스트에 환경별 변형만 적용하는 경우는 Kustomize가 더 단순합니다. 저희는 써드파티 Helm 차트 설치 후 Kustomize로 커스터마이징하는 방식도 씁니다."

리뷰어: "configMapGenerator 쓰면 ConfigMap 이름에 해시가 붙어서 변경 시 자동 롤링 업데이트 되는 거 알고 계시죠?"

개발자: "아, 그래서 매번 새 ConfigMap이 생성되는 거군요. generatorOptions로 disableNameSuffixHash 설정할게요."

주의사항

더 배우기