Kustomize 소개
Kustomize 소개와 사용 가이드입니다. base/overlay 구조, kustomization.yaml, patches, images, configMapGenerator, kubectl apply -k 흐름을 정리했습니다.
Kustomize는 Kubernetes manifest를 템플릿 언어 없이 조합하고 환경별로 변형하는 도구입니다. 같은 Deployment YAML을 dev, stage, prod 환경에서 재사용하되 replica 수, image tag, label, ConfigMap, patch만 다르게 적용할 때 유용합니다.
Kustomize는 Kubernetes 1.14부터 kubectl에 통합되어 kubectl kustomize, kubectl apply -k 형태로 사용할 수 있습니다. 별도 바이너리를 쓰는 방식도 가능하지만, 먼저 kubectl 내장 기능으로 흐름을 이해하는 편이 좋습니다.
기본 디렉터리 구조
app/
base/
deployment.yaml
service.yaml
kustomization.yaml
overlays/
dev/
kustomization.yaml
patch-replicas.yaml
prod/
kustomization.yaml
patch-replicas.yaml
base에는 공통 리소스를 두고, overlays에는 환경별 차이를 둡니다. 이렇게 나누면 같은 앱을 여러 환경에 배포하면서 복붙을 줄일 수 있습니다.
base kustomization.yaml
resources:
- deployment.yaml
- service.yaml
commonLabels:
app.kubernetes.io/name: sample-web
overlay kustomization.yaml
resources:
-../../base
namePrefix: dev-
images:
- name: nginx
newTag: "1.27"
patches:
- path: patch-replicas.yaml
target:
kind: Deployment
name: web
patch 예시
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 2
patch 대상의 name은 Kustomize 변환 전 기준 이름을 기준으로 잡는 경우가 많습니다. patch가 적용되지 않으면 kubectl kustomize 출력 YAML을 먼저 확인합니다.
빌드와 적용
kubectl kustomize overlays/dev
kubectl diff -k overlays/dev
kubectl apply -k overlays/dev
kubectl get deployment,svc
운영 반영 전에는 kubectl diff -k로 실제 변경될 리소스를 확인합니다. 특히 selector, Service port, PVC 같은 변경은 영향이 크므로 주의합니다.
ConfigMap 생성
configMapGenerator:
- name: app-config
literals:
- APP_MODE=dev
- LOG_LEVEL=debug
ConfigMap은 설정값에 적합합니다. password, token, private key 같은 민감정보는 Kustomize 예제에 직접 넣지 말고 별도 secret 관리 체계를 사용합니다.
이미지 태그 변경
images:
- name: registry.example.com/app/web
newName: registry.example.com/app/web
newTag: "2026.06.23"
환경별 image tag를 overlay에서 관리하면 base manifest를 건드리지 않고 배포 버전을 바꿀 수 있습니다. 운영에서는 tag뿐 아니라 digest pinning도 고려합니다.
Kustomize가 맞는 경우
- YAML 구조를 유지하면서 환경별 작은 차이만 관리하고 싶을 때
- Helm chart까지는 과하고, Kubernetes native manifest 중심으로 관리하고 싶을 때
- GitOps 도구가
kustomization.yaml을 직접 읽는 구조일 때
주의할 점
- patch가 많아지면 최종 YAML을 읽기 어려워집니다. 복잡도가 커지면 구조를 다시 나눕니다.
- Secret generator에 민감값을 직접 커밋하지 않습니다.
- base가 환경 의존 값을 포함하면 overlay 분리 효과가 줄어듭니다.
kubectl kustomize버전과 standalone kustomize 버전 차이로 출력이 달라질 수 있으니 CI에서 버전을 고정합니다.