본문으로 건너뛰기

Kustomize

Kustomize는 Kubernetes 리소스를 선언적으로 관리하고 환경별(개발, 스테이징, 프로덕션) 설정을 재사용 가능하게 만드는 도구입니다. kubectl에 내장되어 있어 별도 설치 없이 사용할 수 있습니다.

Kustomize의 필요성

기존 방식의 문제점

환경별로 다른 설정이 필요한 경우:

  • ❌ 각 환경마다 별도의 YAML 파일 관리
  • ❌ 코드 중복으로 유지보수 어려움
  • ❌ 변경 사항 동기화 누락 위험
  • ❌ 환경별 차이점 파악 어려움

Kustomize의 장점

  • ✅ 기본 설정을 재사용하고 환경별 차이만 오버레이
  • ✅ YAML 템플릿 엔진 불필요 (순수 YAML 유지)
  • ✅ kubectl에 내장되어 별도 도구 설치 불필요
  • ✅ Git으로 버전 관리 용이
  • ✅ 선언적이고 예측 가능한 설정 관리

Kustomize 아키텍처

실습 1: 기본 구조 만들기

디렉토리 구조

# 프로젝트 디렉토리 생성
mkdir -p ~/kustomize-demo/{base,overlays/{dev,prod}}
cd ~/kustomize-demo

# 디렉토리 구조 확인
tree

예상 구조:

kustomize-demo/
├── base/
│ ├── kustomization.yaml
│ ├── deployment.yaml
│ └── service.yaml
└── overlays/
├── dev/
│ ├── kustomization.yaml
│ └── replica-patch.yaml
└── prod/
├── kustomization.yaml
└── replica-patch.yaml

Base 리소스 생성

1. Base Deployment 생성:

cat <<EOF > base/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
labels:
app: myapp
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: nginx:1.27
ports:
- containerPort: 80
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 200m
memory: 256Mi
EOF

2. Base Service 생성:

cat <<EOF > base/service.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp
labels:
app: myapp
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 80
protocol: TCP
selector:
app: myapp
EOF

3. Base Kustomization 생성:

cat <<EOF > base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
- deployment.yaml
- service.yaml

commonLabels:
managed-by: kustomize
EOF

4. Base 설정 확인:

# Base 리소스 빌드 확인
kubectl kustomize base/

실습 2: 개발 환경 오버레이

Dev 환경 설정

1. Dev 환경용 패치 생성:

cat <<EOF > overlays/dev/replica-patch.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 2
EOF

2. Dev Kustomization 생성:

cat <<EOF > overlays/dev/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

namespace: dev

namePrefix: dev-

commonLabels:
environment: dev

bases:
- ../../base

patches:
- replica-patch.yaml

images:
- name: nginx
newTag: 1.25-alpine
EOF

3. Dev 환경 빌드 확인:

# Dev 환경 리소스 확인
kubectl kustomize overlays/dev/

4. Dev 환경 배포:

# 네임스페이스 생성
kubectl create namespace dev

# Dev 환경 배포
kubectl apply -k overlays/dev/

# 확인
kubectl get all -n dev
kubectl get deployment dev-myapp -n dev -o yaml | grep -A 2 replicas

실습 3: 프로덕션 환경 오버레이

Prod 환경 설정

1. Prod 환경용 패치 생성:

cat <<EOF > overlays/prod/replica-patch.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 5
template:
spec:
containers:
- name: myapp
resources:
requests:
cpu: 200m
memory: 256Mi
limits:
cpu: 500m
memory: 512Mi
EOF

2. Prod Service 패치 생성:

cat <<EOF > overlays/prod/service-patch.yaml
apiVersion: v1
kind: Service
metadata:
name: myapp
spec:
type: LoadBalancer
EOF

3. Prod Kustomization 생성:

cat <<EOF > overlays/prod/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

namespace: prod

namePrefix: prod-

commonLabels:
environment: prod
tier: production

bases:
- ../../base

patches:
- replica-patch.yaml
- service-patch.yaml

images:
- name: nginx
newTag: 1.25

commonAnnotations:
managed-by: kustomize
environment: production
EOF

4. Prod 환경 빌드 확인:

# Prod 환경 리소스 확인
kubectl kustomize overlays/prod/

5. Prod 환경 배포:

# 네임스페이스 생성
kubectl create namespace prod

# Prod 환경 배포
kubectl apply -k overlays/prod/

# 확인
kubectl get all -n prod
kubectl get deployment prod-myapp -n prod -o yaml | grep -A 2 replicas
kubectl get svc prod-myapp -n prod

실습 4: ConfigMap 생성기

ConfigMap Generator 사용

1. Base에 ConfigMap 추가:

cat <<EOF >> base/kustomization.yaml

configMapGenerator:
- name: app-config
literals:
- APP_NAME=myapp
- LOG_LEVEL=info
EOF

2. Dev 환경에서 ConfigMap 오버라이드:

cat <<EOF >> overlays/dev/kustomization.yaml

configMapGenerator:
- name: app-config
behavior: merge
literals:
- LOG_LEVEL=debug
- ENVIRONMENT=development
EOF

3. Prod 환경에서 ConfigMap 오버라이드:

cat <<EOF >> overlays/prod/kustomization.yaml

configMapGenerator:
- name: app-config
behavior: merge
literals:
- LOG_LEVEL=warn
- ENVIRONMENT=production
EOF

4. Deployment에서 ConfigMap 사용:

cat <<EOF > base/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
labels:
app: myapp
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: nginx:1.27
ports:
- containerPort: 80
envFrom:
- configMapRef:
name: app-config
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 200m
memory: 256Mi
EOF

5. ConfigMap 확인:

# Dev 환경 ConfigMap
kubectl kustomize overlays/dev/ | grep -A 10 "kind: ConfigMap"

# Prod 환경 ConfigMap
kubectl kustomize overlays/prod/ | grep -A 10 "kind: ConfigMap"

6. 재배포:

# Dev 환경 재배포
kubectl apply -k overlays/dev/

# Prod 환경 재배포
kubectl apply -k overlays/prod/

# ConfigMap 확인
kubectl get configmap -n dev
kubectl describe configmap -n dev | grep -A 5 Data

kubectl get configmap -n prod
kubectl describe configmap -n prod | grep -A 5 Data

실습 5: Secret 생성기

Secret Generator 사용

1. Secret 파일 생성:

# Dev 환경 시크릿
cat <<EOF > overlays/dev/secret.env
DB_PASSWORD=dev-password-123
API_KEY=dev-api-key-456
EOF

# Prod 환경 시크릿
cat <<EOF > overlays/prod/secret.env
DB_PASSWORD=prod-secure-password-xyz
API_KEY=prod-api-key-abc
EOF

2. Dev Kustomization에 Secret Generator 추가:

cat <<EOF >> overlays/dev/kustomization.yaml

secretGenerator:
- name: app-secrets
envs:
- secret.env
EOF

3. Prod Kustomization에 Secret Generator 추가:

cat <<EOF >> overlays/prod/kustomization.yaml

secretGenerator:
- name: app-secrets
envs:
- secret.env
EOF

4. Deployment에서 Secret 사용:

# Base Deployment 수정 (envFrom 섹션에 추가)
cat <<EOF > base/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
labels:
app: myapp
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: nginx:1.27
ports:
- containerPort: 80
envFrom:
- configMapRef:
name: app-config
- secretRef:
name: app-secrets
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 200m
memory: 256Mi
EOF

5. Secret 배포 및 확인:

# Dev 환경 배포
kubectl apply -k overlays/dev/

# Secret 확인 (해시 접미사 자동 생성됨)
kubectl get secrets -n dev
kubectl get deployment dev-myapp -n dev -o yaml | grep -A 5 envFrom

# Prod 환경 배포
kubectl apply -k overlays/prod/

# Secret 확인
kubectl get secrets -n prod
kubectl get deployment prod-myapp -n prod -o yaml | grep -A 5 envFrom

Secret 값 확인 (디코딩):

# Dev 환경 시크릿 확인
SECRET_NAME=$(kubectl get secrets -n dev | grep app-secrets | awk '{print $1}')
kubectl get secret $SECRET_NAME -n dev -o jsonpath='{.data.DB_PASSWORD}' | base64 -d
echo

# Prod 환경 시크릿 확인
SECRET_NAME=$(kubectl get secrets -n prod | grep app-secrets | awk '{print $1}')
kubectl get secret $SECRET_NAME -n prod -o jsonpath='{.data.DB_PASSWORD}' | base64 -d
echo

실습 6: JSON 6902 패치

복잡한 패치 적용

1. JSON 패치 파일 생성:

cat <<EOF > overlays/prod/add-probe.yaml
- op: add
path: /spec/template/spec/containers/0/livenessProbe
value:
httpGet:
path: /healthz
port: 80
initialDelaySeconds: 30
periodSeconds: 10

- op: add
path: /spec/template/spec/containers/0/readinessProbe
value:
httpGet:
path: /ready
port: 80
initialDelaySeconds: 5
periodSeconds: 5
EOF

2. Prod Kustomization 수정:

cat <<EOF > overlays/prod/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

namespace: prod

namePrefix: prod-

commonLabels:
environment: prod
tier: production

bases:
- ../../base

patches:
- replica-patch.yaml
- service-patch.yaml

patchesJson6902:
- target:
group: apps
version: v1
kind: Deployment
name: myapp
path: add-probe.yaml

images:
- name: nginx
newTag: 1.25

commonAnnotations:
managed-by: kustomize
environment: production

configMapGenerator:
- name: app-config
behavior: merge
literals:
- LOG_LEVEL=warn
- ENVIRONMENT=production

secretGenerator:
- name: app-secrets
envs:
- secret.env
EOF

3. 패치 적용 확인:

# 빌드하여 Probe 추가 확인
kubectl kustomize overlays/prod/ | grep -A 10 "livenessProbe"

# 배포
kubectl apply -k overlays/prod/

# Probe 확인
kubectl get deployment prod-myapp -n prod -o yaml | grep -A 15 Probe

실습 7: 리소스 변환기

이미지와 레이블 일괄 변경

1. 모든 환경의 이미지 태그 변경:

# Prod 환경 이미지 태그 업데이트
cat <<EOF > overlays/prod/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

namespace: prod

namePrefix: prod-

commonLabels:
environment: prod
tier: production
version: v2

bases:
- ../../base

patches:
- replica-patch.yaml
- service-patch.yaml

patchesJson6902:
- target:
group: apps
version: v1
kind: Deployment
name: myapp
path: add-probe.yaml

images:
- name: nginx
newName: nginx
newTag: 1.26-alpine

commonAnnotations:
managed-by: kustomize
environment: production
version: "2.0"

configMapGenerator:
- name: app-config
behavior: merge
literals:
- LOG_LEVEL=warn
- ENVIRONMENT=production
- VERSION=2.0

secretGenerator:
- name: app-secrets
envs:
- secret.env
EOF

2. 변경사항 확인 및 배포:

# 변경사항 미리보기
kubectl diff -k overlays/prod/

# 배포
kubectl apply -k overlays/prod/

# 이미지 확인
kubectl get deployment prod-myapp -n prod -o yaml | grep image:

# 레이블 확인
kubectl get deployment prod-myapp -n prod --show-labels

주요 Kustomize 기능

1. 네임 변환

필드설명예시
namePrefix모든 리소스 이름 앞에 접두사 추가dev-, prod-
nameSuffix모든 리소스 이름 뒤에 접미사 추가-v1, -canary
namespace모든 리소스에 네임스페이스 설정dev, prod

2. 레이블과 어노테이션

commonLabels:
app: myapp
managed-by: kustomize

commonAnnotations:
description: "Managed by Kustomize"

3. 패치 방식

패치 방식용도복잡도
Strategic Merge간단한 필드 오버라이드낮음
JSON 6902정밀한 수정 (추가/삭제/변경)높음
InlineKustomization 파일 내 직접 정의중간

4. 생성기

# ConfigMap 생성
configMapGenerator:
- name: config
literals:
- KEY=value
files:
- config.properties

# Secret 생성
secretGenerator:
- name: secrets
envs:
- secret.env
files:
- tls.crt
- tls.key

고급 패턴

Components 사용

1. Components 디렉토리 생성:

mkdir -p components/monitoring

2. Monitoring Component 생성:

cat <<EOF > components/monitoring/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1alpha1
kind: Component

commonLabels:
monitoring: enabled

patches:
- target:
kind: Deployment
patch: |-
- op: add
path: /spec/template/metadata/annotations/prometheus.io~1scrape
value: "true"
- op: add
path: /spec/template/metadata/annotations/prometheus.io~1port
value: "9090"
EOF

3. Prod 환경에서 Component 사용:

cat <<EOF >> overlays/prod/kustomization.yaml

components:
- ../../components/monitoring
EOF

4. Component 적용 확인:

kubectl kustomize overlays/prod/ | grep -A 5 annotations

검증 및 테스트

Kustomize 빌드 검증

# 문법 검증
kubectl kustomize overlays/dev/ > /dev/null && echo "✅ Dev 설정 유효함"
kubectl kustomize overlays/prod/ > /dev/null && echo "✅ Prod 설정 유효함"

# 차이점 비교
diff <(kubectl kustomize overlays/dev/) <(kubectl kustomize overlays/prod/) | head -20

# 특정 리소스만 추출
kubectl kustomize overlays/prod/ | grep -A 20 "kind: Deployment"

Dry-run 테스트

# Dry-run으로 배포 테스트
kubectl apply -k overlays/dev/ --dry-run=client

# Server-side dry-run
kubectl apply -k overlays/prod/ --dry-run=server

정리

# 모든 리소스 삭제
kubectl delete -k overlays/dev/
kubectl delete -k overlays/prod/

# 네임스페이스 삭제
kubectl delete namespace dev prod

# 작업 디렉토리 정리
cd ~
rm -rf ~/kustomize-demo

베스트 프랙티스

1. 디렉토리 구조

권장 구조:

project/
├── base/ # 공통 리소스
│ ├── kustomization.yaml
│ ├── deployment.yaml
│ ├── service.yaml
│ ├── configmap.yaml
│ └── rbac.yaml
├── overlays/ # 환경별 설정
│ ├── dev/
│ │ ├── kustomization.yaml
│ │ ├── namespace.yaml
│ │ ├── replica-patch.yaml
│ │ └── configmap-patch.yaml
│ ├── staging/
│ │ ├── kustomization.yaml
│ │ ├── namespace.yaml
│ │ └── scaling-patch.yaml
│ └── prod/
│ ├── kustomization.yaml
│ ├── namespace.yaml
│ ├── scaling-patch.yaml
│ ├── hpa.yaml
│ └── network-policy.yaml
└── components/ # 재사용 가능한 컴포넌트
├── monitoring/
│ ├── kustomization.yaml
│ ├── prometheus-annotations.yaml
│ └── serviceMonitor.yaml
├── security/
│ ├── kustomization.yaml
│ ├── pod-security-policy.yaml
│ └── network-policy.yaml
└── ingress/
├── kustomization.yaml
└── ingress.yaml

2. Base 리소스 설계

원칙:

  • ✅ 모든 환경에 공통인 설정만 포함
  • ✅ 환경별 차이는 Overlay에서만 정의
  • ✅ 기본값은 가장 제한적이고 안전하게 설정
  • ✅ 리소스별로 파일을 분리하여 관리
  • ✅ 의존성이 없는 순수한 Kubernetes 매니페스트

예시:

# base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

# 리소스 순서 명시 (의존성 순서대로)
resources:
- namespace.yaml
- configmap.yaml
- secret.yaml
- service.yaml
- deployment.yaml

# 모든 리소스에 공통 레이블 추가
commonLabels:
app.kubernetes.io/managed-by: kustomize
app.kubernetes.io/part-of: myapp

# 공통 어노테이션
commonAnnotations:
documentation: "https://github.com/myorg/myapp"

3. Overlay 설계 패턴

환경별 분리 전략:

# overlays/dev/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

namespace: dev

namePrefix: dev-

bases:
- ../../base

# 개발 환경 특성
commonLabels:
environment: dev

# 낮은 리소스 설정
patchesStrategicMerge:
- replica-patch.yaml # replicas: 1
- resource-patch.yaml # 낮은 CPU/Memory

# 개발용 이미지 태그
images:
- name: myapp
newTag: dev-latest

# 개발 환경 ConfigMap
configMapGenerator:
- name: app-config
behavior: merge
literals:
- LOG_LEVEL=debug
- ENABLE_DEBUG=true
# overlays/prod/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

namespace: prod

namePrefix: prod-

bases:
- ../../base

# 프로덕션 환경 특성
commonLabels:
environment: prod
tier: production

# 프로덕션 보안 및 성능
patchesStrategicMerge:
- replica-patch.yaml # replicas: 5
- resource-patch.yaml # 높은 CPU/Memory
- security-patch.yaml # SecurityContext
- probe-patch.yaml # Liveness/Readiness

# 추가 리소스
resources:
- hpa.yaml
- network-policy.yaml
- pod-disruption-budget.yaml

# 프로덕션 이미지 (불변 태그)
images:
- name: myapp
newTag: v1.2.3

# 프로덕션 ConfigMap
configMapGenerator:
- name: app-config
behavior: merge
literals:
- LOG_LEVEL=warn
- ENABLE_DEBUG=false
- CACHE_ENABLED=true

# 모니터링 컴포넌트
components:
- ../../components/monitoring
- ../../components/security

4. ConfigMap/Secret 관리

ConfigMap 패턴:

# base/kustomization.yaml
configMapGenerator:
- name: app-config
literals:
- APP_NAME=myapp
- APP_VERSION=1.0.0
files:
- configs/app.properties

# Overlay에서 병합
# overlays/prod/kustomization.yaml
configMapGenerator:
- name: app-config
behavior: merge # 중요: merge 사용
literals:
- ENVIRONMENT=production

Secret 관리 Best Practices:

# 1. Secret 파일은 .gitignore에 추가
echo "overlays/*/secret*.yaml" >> .gitignore
echo "overlays/*/*.env" >> .gitignore

# 2. 외부 Secret 관리 도구 사용 (권장)
# - Azure Key Vault
# - HashiCorp Vault
# - Sealed Secrets
# - External Secrets Operator

# 3. Secret Generator 사용 시
cat <<EOF > overlays/prod/kustomization.yaml
secretGenerator:
- name: app-secrets
envs:
- secret.env # Git에 커밋하지 않음
options:
disableNameSuffixHash: false # 해시 접미사 유지
EOF

5. 이미지 버전 관리

태그 전략:

# ❌ 나쁜 예
images:
- name: myapp
newTag: latest # 예측 불가능, 롤백 어려움

# ✅ 좋은 예
images:
- name: myapp
newTag: v1.2.3 # Semantic Versioning
# 또는
- name: myapp
newTag: sha-7f2a1b9 # Git commit SHA
# 또는
- name: myapp
newTag: 2024-12-09-abc123 # 날짜 + 빌드 번호

이미지 레지스트리 변경:

images:
- name: myapp
newName: myregistry.azurecr.io/myapp
newTag: v1.2.3
# Docker Hub에서 ACR로 마이그레이션
- name: nginx
newName: myregistry.azurecr.io/nginx
newTag: 1.27

6. 패치 전략

Strategic Merge Patch (간단한 변경):

# replica-patch.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 5
template:
spec:
containers:
- name: myapp
resources:
requests:
cpu: 500m
memory: 512Mi
limits:
cpu: 1000m
memory: 1Gi

JSON 6902 Patch (정밀한 변경):

# kustomization.yaml
patchesJson6902:
- target:
group: apps
version: v1
kind: Deployment
name: myapp
patch: |-
- op: add
path: /spec/template/spec/containers/0/env/-
value:
name: NEW_ENV_VAR
value: "new-value"
- op: replace
path: /spec/replicas
value: 5

7. 네임스페이스 전략

네임스페이스 분리:

# overlays/dev/namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: dev
labels:
environment: dev
istio-injection: enabled
annotations:
owner: "dev-team@company.com"

# overlays/dev/kustomization.yaml
resources:
- namespace.yaml
- ../../base

namespace: dev # 모든 리소스에 적용

8. 검증 및 테스트

CI/CD 파이프라인 통합:

#!/bin/bash
# validate-kustomize.sh

set -e

ENVIRONMENTS=("dev" "staging" "prod")

for env in "${ENVIRONMENTS[@]}"; do
echo "🔍 Validating $env environment..."

# 1. Kustomize 빌드
kubectl kustomize "overlays/$env" > "/tmp/$env-manifests.yaml"

# 2. YAML 문법 검증
yamllint "/tmp/$env-manifests.yaml"

# 3. Kubernetes 스키마 검증
kubectl apply --dry-run=server -f "/tmp/$env-manifests.yaml"

# 4. 정책 검증 (OPA/Kyverno)
conftest test "/tmp/$env-manifests.yaml"

# 5. 보안 스캔
kubesec scan "/tmp/$env-manifests.yaml"

echo "✅ $env environment validated successfully"
done

9. 문서화 규칙

kustomization.yaml 주석:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

# =============================================================================
# Production Environment Configuration
# =============================================================================
# Owner: DevOps Team
# Contact: devops@company.com
# Updated: 2024-12-09
#
# Configuration:
# - Replicas: 5
# - Resources: High (CPU: 1000m, Memory: 1Gi)
# - Monitoring: Enabled (Prometheus)
# - Security: Pod Security Standards (Restricted)
# - High Availability: PodDisruptionBudget, Anti-Affinity
# =============================================================================

namespace: prod

resources:
- ../../base
- hpa.yaml
- pdb.yaml

# ... 나머지 설정

10. 리소스 명명 규칙

일관된 네이밍:

# namePrefix/nameSuffix 활용
namePrefix: myapp-
nameSuffix: -v1

# 결과:
# - Deployment: myapp-deployment-v1
# - Service: myapp-service-v1
# - ConfigMap: myapp-config-v1-<hash>

11. 버전 관리 전략

Git 브랜치 전략:

# 환경별 브랜치
main # 프로덕션
├── develop # 개발
├── staging # 스테이징

# 또는 환경별 디렉토리 (권장)
overlays/
├── dev/ (main 브랜치)
├── staging/ (main 브랜치)
└── prod/ (main 브랜치)

GitOps 통합:

# ArgoCD Application
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: myapp-prod
spec:
source:
repoURL: https://github.com/myorg/myapp
targetRevision: main
path: overlays/prod
destination:
server: https://kubernetes.default.svc
namespace: prod
syncPolicy:
automated:
prune: true
selfHeal: true

12. 성능 최적화

빌드 최적화:

# 큰 프로젝트의 경우 부분 빌드
kubectl kustomize overlays/prod --load-restrictor LoadRestrictionsNone

# 결과 캐싱
kustomize build overlays/prod > manifests/prod.yaml
kubectl apply -f manifests/prod.yaml

13. 보안 Best Practices

Pod Security Standards:

# overlays/prod/pod-security.yaml
apiVersion: v1
kind: Namespace
metadata:
name: prod
labels:
pod-security.kubernetes.io/enforce: restricted
pod-security.kubernetes.io/audit: restricted
pod-security.kubernetes.io/warn: restricted

SecurityContext 패치:

# security-patch.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
template:
spec:
securityContext:
runAsNonRoot: true
runAsUser: 1000
fsGroup: 1000
seccompProfile:
type: RuntimeDefault
containers:
- name: myapp
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities:
drop:
- ALL

문제 해결

일반적인 오류

1. 리소스를 찾을 수 없음:

# bases 경로 확인
cat overlays/dev/kustomization.yaml | grep bases

# 상대 경로가 올바른지 확인
ls -la ../../base

2. 패치가 적용되지 않음:

# 패치 대상 이름 확인
kubectl kustomize overlays/prod/ | grep "name: myapp"

# namePrefix/nameSuffix 고려

3. ConfigMap/Secret 해시 불일치:

# 해시는 내용이 변경될 때마다 변경됨
# 이전 ConfigMap/Secret 삭제 후 재배포
kubectl delete configmap -n dev --all
kubectl apply -k overlays/dev/

디버깅 팁

# 상세 출력
kubectl kustomize overlays/prod/ --enable-alpha-plugins

# 특정 리소스만 확인
kubectl kustomize overlays/prod/ | yq eval 'select(.kind == "Deployment")'

# JSON 형식으로 출력
kubectl kustomize overlays/prod/ -o json | jq

추가 학습 자료

다음 단계