스터디(Study)/CI·CD Study

GitOps Cookbook 4장: 커스터마이즈

Chann._.y 2025. 10. 18.
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

댓글