728x90

4. 커스터마이즈 (Kustomize)
4.0 들어가며
- Kustomize
- 쿠버네티스 리소스를 YAML로 정의하고 배포하는 과정은 단순하지만, 운영 단계에선 환경별 차이로 인해 복잡해진다.
- 이를 해결하기 위해 등장한 도구가 Kustomize다.
- 템플릿이 아닌 패치(Patch) 기반 선언적 구성 방식을 사용하며,
GitOps 및 CI/CD 파이프라인에 자연스럽게 통합된다.
4.1 커스터마이즈 개념 및 배경
4.1.1 목적과 특징
- Base: 공통 리소스 정의 (Deployment, Service 등)
- Overlay: 환경별 패치 정의 (dev, staging, prod 등)
- 중복을 제거하고 YAML을 재사용할 수 있다.
- Git 저장소와 결합하면 변경 이력을 추적하며 인프라를 코드로 관리할 수 있다.
4.1.2 기본 구조 예시
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml
- service.yaml
4.2 실습: ConfigMap 생성과 적용
4.2.1 실습 환경 준비
cd ~/cloud-native-spring-in-action/Chapter14/14-end/catalog-service
tree k8s
4.2.2 application.yml 작성
cat k8s/application.yml
polar:
greeting: Welcome to the book catalog from a development Kubernetes environment!
spring:
datasource:
url: jdbc:postgresql://polar-postgres/polardb_catalog
security:
oauth2:
resourceserver:
jwt:
issuer-uri: http://polar-keycloak/realms/PolarBookshop
4.2.3 kustomization.yml 정의
cat k8s/kustomization.yml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yml
- service.yml
configMapGenerator:
- name: catalog-config
files:
- application.yml
options:
labels:
app: catalog-service
4.2.4 배포 및 확인
kubectl apply -k k8s
kubectl get cm -l app=catalog-service
NodePort 노출 및 접근:
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
name: catalog-service
spec:
type: NodePort
selector:
app: catalog-service
ports:
- port: 80
targetPort: 9001
nodePort: 30001
EOF
http :30001/
출력 예시:
Welcome to the book catalog from a development Kubernetes environment!
4.2.5 ConfigMap 변경 및 반영
sed -i "s/development/production/g" k8s/application.yml
kubectl apply -k k8s
http :30001/
출력 예시:
Welcome to the book catalog from a production Kubernetes environment!
4.3 다중 환경 구성: Base와 Overlay
4.3.1 개념
- Base: 공통 YAML (deployment, service, configmap 등)
- Overlay: 환경별 수정 및 추가 리소스 (dev, staging, prod 등)
- Overlay는 Base를 참조하며 일부 필드만 패치한다.
- GitOps에서는 Base와 Overlay를 분리하여 별도 저장소로 관리할 수도 있다.
4.3.2 예시 디렉터리 구조
tree ~/cloud-native-spring-in-action/Chapter14/14-end/polar-deployment/kubernetes/applications/catalog-service/
└── staging
├── application-staging.yml
├── kustomization.yml
└── patch-env.yml
4.3.3 Kustomization (staging overlay)
cat staging/kustomization.yml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- github.com/polarbookshop/catalog-service/k8s?ref=main
patchesStrategicMerge:
- patch-env.yml
4.3.4 환경 변수 패치
cat patch-env.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: catalog-service
spec:
template:
spec:
containers:
- name: catalog-service
env:
- name: SPRING_PROFILES_ACTIVE
value: prod
4.3.5 Base / Overlay 테스트
kubectl apply -k dev/
kubectl apply -k prod/
kubectl get -k dev/
kubectl get -k prod/
kubectl delete -k dev/
kubectl delete -k prod/
4.4 고급 기능: 제너레이터와 패치
4.4.1 ConfigMapGenerator
mkdir test && cd test
echo "FOO=Bar" > application.properties
cat <<EOF > kustomization.yaml
configMapGenerator:
- name: example-configmap
files:
- application.properties
EOF
kubectl create -k ./ --dry-run=client -o yaml
kubectl apply -k ./
kubectl get cm
kubectl delete -k ./
4.4.2 SecretGenerator
echo -e "username=admin\npassword=secret" > password.txt
cat <<EOF > kustomization.yaml
secretGenerator:
- name: example-secret
files:
- password.txt
EOF
kubectl apply -k ./
kubectl get secret
kubectl delete -k ./
4.4.3 GeneratorOptions
cat <<EOF > kustomization.yaml
configMapGenerator:
- name: nohash-config
literals:
- FOO=Bar
generatorOptions:
disableNameSuffixHash: true
labels:
type: generated
EOF
kubectl create -k ./ --dry-run=client -o yaml
kubectl apply -k ./
kubectl get cm
kubectl delete -k ./
4.5 커스터마이즈 확장: Bases와 Overlays
4.5.1 Base 및 Overlay 작성
mkdir -p base dev prod
cat <<EOF > base/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-nginx
spec:
selector:
matchLabels:
run: my-nginx
replicas: 2
template:
metadata:
labels:
run: my-nginx
spec:
containers:
- name: my-nginx
image: nginx:alpine
EOF
cat <<EOF > base/service.yaml
apiVersion: v1
kind: Service
metadata:
name: my-nginx
labels:
run: my-nginx
spec:
ports:
- port: 80
protocol: TCP
selector:
run: my-nginx
EOF
cat <<EOF > base/kustomization.yaml
resources:
- deployment.yaml
- service.yaml
EOF
cat <<EOF > dev/kustomization.yaml
resources:
- ../base
namePrefix: dev-
EOF
cat <<EOF > prod/kustomization.yaml
resources:
- ../base
namePrefix: prod-
EOF
kubectl apply -k dev/
kubectl apply -k prod/
kubectl get all
kubectl delete -k dev/
kubectl delete -k prod/
참고
- 커스터마이즈는 템플릿이 아닌 선언적 패치 기반 YAML 재사용 도구다.
- Base-Overlay 구조로 환경별 구성을 쉽게 분리한다.
- Helm보다 단순하지만, GitOps에 최적화된 구조를 가진다.
- kind + macOS 환경에서도 기본적으로 작동하며, CI/CD와 쉽게 연계할 수 있다.
728x90
'스터디(Study) > CI·CD Study' 카테고리의 다른 글
| GitOps Cookbook 6장: 클라우드 네이티브 CI/CD (0) | 2025.10.25 |
|---|---|
| GitOps Cookbook 5장: 헬름 (0) | 2025.10.25 |
| GitOps Cookbook 3장: 컨테이너 (0) | 2025.10.18 |
| GitOps Cookbook 2장: 실습 준비 (0) | 2025.10.18 |
| GitOps Cookbook 1장: 소개 (0) | 2025.10.18 |
댓글