안녕하세요.
이번 글에서는 Kubernetes Patterns 책의 22장 Configuration Template 패턴을 중심으로,
Kubernetes v1.35 기준 최신 트렌드와 실무 패턴까지 포함하여 하나의 흐름으로 정리해 보겠습니다.
21장 Immutable Configuration이
“시간에 따라 변경되는 설정을 어떻게 안전하게 관리할 것인가”
에 대한 이야기였다면,
22장 Configuration Template는 다음 질문에 답합니다.
“같은 애플리케이션을 서로 다른 환경(dev / staging / prod)에
어떻게 중복 없이, 그리고 일관되게 배포할 것인가?”
Kubernetes 환경에서는 동일한 애플리케이션을 여러 환경에 배포하는 것이 일반적입니다.
하지만 환경이 늘어날수록 설정 관리는 급격히 어려워집니다.
많은 팀이 처음에는 다음과 같은 방식으로 시작합니다.
그 결과:
21장에서의 Configuration Drift는 Git과 클러스터 상태의 불일치였습니다.
22장에서 다루는 Drift는 다음과 같습니다.
환경 간 Configuration Drift
즉, dev와 prod의 설정 차이가
구분할 수 없는 상태입니다.
Configuration Template 패턴은 이 환경 간 Drift를 구조적으로 예방하기 위한 접근입니다.
Configuration Template 패턴의 핵심은 다음 한 문장으로 요약됩니다.
공통 설정은 하나의 템플릿으로 유지하고, 환경별 차이(Variance)만 외부에서 주입한다.
이를 통해 다음을 달성합니다.
가장 단순한 방식은 YAML 내부에 placeholder를 두는 것입니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: {{REPLICAS}}
배포 시점에 스크립트나 CI/CD 파이프라인에서 값을 치환합니다.
장점
단점
Helm은 Kubernetes에서 가장 널리 사용되는 템플릿 엔진입니다.
replicaCount: 3
image:
tag: "1.0.0"
장점
단점
Kustomize는 “YAML을 그대로 유지하면서 차이만 덧붙인다”는 철학을 가집니다.
base/
deployment.yaml
overlays/
dev/
staging/
prod/
장점
단점
실무에서는 Helm과 Kustomize를 배타적 선택이 아니라 상호 보완적 도구로 봅니다.
| 구분 | Helm | Kustomize |
|---|---|---|
| 철학 | 템플릿 엔진 | 오버레이 엔진 |
| 강점 | 패키징, 복잡한 로직 | 가독성, 선언성 |
| 주 사용처 | 남에게 배포할 때 | 내가 운영할 때 |
| Git Diff | 불리 | 매우 유리 |
최근 가장 많이 사용되는 패턴은 다음과 같습니다.
helm template)patches)이 방식은 두 도구의 장점만 취하는 현실적인 전략입니다.
Helm v3.8+부터 차트는 OCI Artifact로 표준화되었습니다.
helm package my-chart
helm push my-chart-0.1.0.tgz oci://public.ecr.aws/my-org/
docker push 하듯이 차트를 관리할 수 있습니다.이는 21장의 Immutable Configuration에서 말한 Artifact 중심 관리 철학과 자연스럽게 연결됩니다.
환경이 3개가 아니라 50개, 100개라면 Kustomize 오버레이 폴더를 모두 만들어야 할까요?
ArgoCD ApplicationSet은 이 문제를 해결합니다.
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
spec:
generators:
- list:
elements:
- cluster: engineering-dev
url: <https://1.2.3.4>
- cluster: engineering-prod
url: <https://5.6.7.8>
template:
metadata:
name: '{{cluster}}-guestbook'
spec:
destination:
server: '{{url}}'
이 설정 하나로 수십 개의 클러스터 배포를 한 번에 자동화할 수 있습니다.
ApplicationSet은 Configuration Template 패턴의 자동화된 최종 형태라 할 수 있습니다.

도구를 고르는 것이 아니라, 조합하는 시대입니다.
기존 템플릿 도구는 다음과 같은 한계를 가집니다.
YAML은 사람이 읽기 쉽지만, 기계가 검증하기엔 너무 유연합니다.
port: "8080" # 문자열
port: 8080 # 숫자
이 차이는 실행 시점에서야 장애로 드러납니다.
CUE는 이를 “프로그래밍 언어 수준의 타입 시스템”으로 해결합니다.
타입(Schema)이 곧 값(Value)이고, 값(Value) 또한 타입(Type)이다.
정의와 검증이 동시에 수행됩니다.
Helm처럼 텍스트 템플릿을 사용하지 않고,
JSON 상위 집합 문법으로 구조화된 설정을 정의합니다.
app 레이블 필수replicas는 최소 1 이상deployment.cue)// 1. 스키마 정의 (템플릿 역할)
#MyDeployment: {
apiVersion: "apps/v1"
kind: "Deployment"
metadata: {
name: string
labels: {
app: name
tier: "frontend" | "backend"
}
}
spec: {
replicas: int & >=1
template: {
spec: {
containers: [...{
name: metadata.name
image: string
}]
}
}
}
}
// 2. 실제 데이터 주입
prod: #MyDeployment & {
metadata: name: "payment-service"
metadata: labels: tier: "backend"
spec: replicas: 3
spec: template: spec: containers: [{image: "pay-v1"}]
}
dev: #MyDeployment & {
metadata: name: "payment-service-dev"
metadata: labels: tier: "backend"
spec: replicas: 1
spec: template: spec: containers: [{image: "pay-dev"}]
}
replicas: 0 → 즉시 에러cue export deployment.cue --out yaml
| 구분 | Helm | Kustomize | CUE |
|---|---|---|---|
| 방식 | 문자열 치환 | 파일 패치 | 제약 병합 |
| 안전성 | 낮음 | 중간 | 매우 높음 |
| 중복 제거 | values.yaml | base 공유 | 구조체 조합 |