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/livenessProbe1.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 필드를 추가하고, 함수 파일을 지정합니다.
- 함수를 실행하여 설정을 생성하거나 수정합니다.
예시:
- Kustomize 함수 (generate-configmap.sh):
#!/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 .