Kustomize 고급 활용 기법

1. Kustomize 고급 활용 기법#

Kustomize는 쿠버네티스 리소스 커스터마이징을 위한 다양한 고급 기능을 제공합니다. 이 섹션에서는 Kustomize의 핵심 기능인 JSON Patch, Strategic Merge Patch와 함께 Kustomize 함수를 활용하는 방법에 대해 자세히 알아보겠습니다.

1.1 JSON Patch#

JSON Patch는 RFC 6902 표준을 따르는 패치 형식으로, JSON 문서를 수정하는 데 사용됩니다. Kustomize에서는 patchesJson6902 필드를 사용하여 JSON Patch를 적용할 수 있습니다.

장점:

  • 정밀한 제어: JSON Patch 연산을 사용하여 특정 설정 값을 정확하게 변경할 수 있습니다.
  • 다양한 작업 지원: 리소스 추가, 삭제, 변경 등 다양한 작업을 수행할 수 있습니다.

단점:

  • 복잡한 문법: JSON Patch 문법을 이해하고 사용해야 합니다.
  • 가독성 저하: YAML 형식에 비해 가독성이 떨어질 수 있습니다.

JSON Patch 연산:

  • add: 새로운 값을 추가합니다.
  • remove: 값을 삭제합니다.
  • replace: 기존 값을 새로운 값으로 대체합니다.
  • move: 값을 다른 위치로 이동합니다.
  • copy: 값을 복사합니다.
  • test: 값이 예상과 일치하는지 확인합니다.

사용법:

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

resources:
  - deployment.yaml

patchesJson6902:
  - target:
      kind: Deployment
      name: my-app-deployment
    patch: |-
      - op: replace
        path: /spec/template/spec/containers/0/image
        value: my-app:1.0.1  # 이미지 태그 변경
      - op: add
        path: /spec/template/spec/containers/0/env/-
        value:
          name: NEW_ENV_VAR
          value: "new_value"  # 새로운 환경 변수 추가
  • target: 패치를 적용할 리소스의 kind와 name을 지정합니다.
  • patch: JSON Patch 연산 목록을 정의합니다.

JSON Patch 활용 예시:

  • 리소스 추가:
- op: add
  path: /spec/template/spec/containers/0/ports/-
  value:
    containerPort: 8080
    protocol: TCP
  • 리소스 삭제:
- op: remove
  path: /spec/template/spec/containers/0/livenessProbe

1.2 Strategic Merge Patch#

Strategic Merge Patch는 Kubernetes Strategic Merge Patch 방식을 사용하여 설정을 변경합니다. 이 방식은 YAML 형식으로 작성된 패치 파일을 사용하며, Base 파일과 패치 파일을 병합하여 최종 설정을 생성합니다.

장점:

  • 직관적인 문법: YAML 형식을 사용하므로 가독성이 높고 이해하기 쉽습니다.
  • 간편한 설정 변경: 기존 설정 값을 변경하거나 새로운 설정을 추가하는 데 용이합니다.

단점:

  • 제한적인 기능: 복잡한 설정 변경 (예: 리소스 삭제)에는 사용하기 어려울 수 있습니다.

사용법:

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

resources:
  - deployment.yaml

patchesStrategicMerge:
  - deployment-patch.yaml
  • deployment-patch.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app-deployment
spec:
  template:
    spec:
      containers:
      - name: my-app-container
        image: my-app:1.0.1  # 이미지 태그 변경
        resources:
          requests:
            cpu: 50m  # CPU 요청량 변경
            memory: 64Mi  # 메모리 요청량 변경
          limits:
            cpu: 100m  # CPU 제한량 변경
            memory: 128Mi  # 메모리 제한량 변경
  • 패치 파일에는 변경할 설정만 정의합니다. Base 파일에 정의된 모든 설정을 다시 정의할 필요는 없습니다.
  • 패치 파일에 정의된 설정은 Base 파일의 설정을 덮어씁니다.

1.3 Kustomize 함수 (Kustomize Functions)#

Kustomize 함수(Functions)는 Kustomize 파이프라인 내에서 실행되는 실행 가능한 파일입니다. 함수를 사용하여 사용자 정의 로직을 구현하고, Kustomize의 기능을 확장할 수 있습니다.

Kustomize 함수 활용:

  • 자동화된 설정 생성: 복잡한 설정을 자동으로 생성하는 함수를 작성할 수 있습니다.
  • 유효성 검사: 설정 값의 유효성을 검사하는 함수를 작성할 수 있습니다.
  • 외부 데이터 소스 통합: 외부 데이터 소스 (예: API, 데이터베이스)에서 데이터를 가져와서 설정에 적용하는 함수를 작성할 수 있습니다.

Kustomize 함수 종류:

  • Generator: 쿠버네티스 리소스를 생성하는 함수입니다.
  • Transformer: 기존 리소스를 수정하는 함수입니다.

Kustomize 함수 사용법:

  • Kustomize 함수를 구현합니다. 함수는 실행 가능한 파일 (예: 쉘 스크립트, Go 프로그램)로 작성합니다.
  • kustomization.yaml 파일에 configurations 필드를 추가하고, 함수 파일을 지정합니다.
  • 함수를 실행하여 설정을 생성하거나 수정합니다.

예시:

#!/bin/bash

# 환경 변수에서 데이터베이스 URL 읽기
DATABASE_URL=$DATABASE_URL

# ConfigMap 생성
cat <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-app-config
data:
  database_url: $DATABASE_URL
EOF
  • kustomization.yaml:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
  - deployment.yaml

configurations:
  - ./generate-configmap.sh  # Kustomize 함수 지정

generatorOptions:
  disableNameSuffixHash: true  # 이름 해시 비활성화
  • Kustomize 적용:
DATABASE_URL="jdbc:mysql://mydb:3306/mydb" kubectl apply -k .