Kustomize를 활용한 환경별 배포 구성
1. 개발 환경, 스테이징 환경, 프로덕션 환경별 Kustomize 구성#
Kustomize의 핵심 장점 중 하나는 환경별로 설정을 분리하여 관리할 수 있다는 것입니다. 이 섹션에서는 개발 환경, 스테이징 환경, 프로덕션 환경에 대한 Kustomize 구성을 어떻게 구성하는지 자세히 살펴보겠습니다.
1.1 기본 디렉토리 구조#
먼저 각 환경별 설정을 분리하기 위한 디렉토리 구조를 설정합니다. 일반적으로 다음과 같은 디렉토리 구조를 사용합니다.
my-app/
├── base/ # 기본 매니페스트 파일 (공통 설정)
│ ├── deployment.yaml
│ └── service.yaml
└── overlays/ # 환경별 설정
├── dev/ # 개발 환경
│ └── kustomization.yaml
├── staging/ # 스테이징 환경
│ └── kustomization.yaml
└── prod/ # 프로덕션 환경
└── kustomization.yaml- base: 기본 매니페스트 파일 (Deployment, Service 등)을 저장합니다. 이 디렉토리에는 환경에 관계없이 공통적으로 적용되는 설정을 정의합니다.
- overlays: 환경별 설정을 저장하는 디렉토리입니다. 이 디렉토리 아래에 각 환경 (dev, staging, prod)에 대한 디렉토리를 생성하고, 해당 환경에 대한 Kustomize 설정 파일 (kustomization.yaml)을 저장합니다.
1.2 base 디렉토리 구성#
base 디렉토리에는 애플리케이션의 기본 설정을 정의하는 매니페스트 파일을 저장합니다. 이 설정은 모든 환경에 공통적으로 적용됩니다.
base/deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app-deployment
spec:
replicas: 3 # 기본 Replica 수
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app-container
image: my-app:latest # 기본 이미지 태그
ports:
- containerPort: 80
resources:
requests:
cpu: 100m # 기본 CPU 요청량
memory: 128Mi # 기본 메모리 요청량
limits:
cpu: 200m # 기본 CPU 제한량
memory: 256Mi # 기본 메모리 제한량
env:
- name: MY_ENV_VAR
value: "default_value" # 기본 환경 변수 값base/service.yaml:
apiVersion: v1
kind: Service
metadata:
name: my-app-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP # 기본 Service 타입1.3 overlays/dev 디렉토리 구성 (개발 환경)#
overlays/dev 디렉토리에는 개발 환경에 적용할 설정을 정의합니다. 개발 환경에서는 일반적으로 디버깅을 위해 로그 레벨을 높이거나, 리소스 제한을 낮추는 등의 설정을 적용합니다.
overlays/dev/kustomization.yaml:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base
namespace: development # 네임스페이스 변경
namePrefix: dev- # 리소스 이름에 접두사 추가
images:
- name: my-app
newName: my-app
newTag: dev # 개발 환경용 이미지 태그
patchesStrategicMerge:
- deployment-patch.yaml # 리소스 제한 변경
# commonLabels:
# environment: development # 주석 처리 또는 삭제
# commonAnnotations:
# owner: john.doe@example.com # 주석 처리 또는 삭제overlays/dev/deployment-patch.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app-deployment # 변경할 Deployment 이름
spec:
template:
spec:
containers:
- name: my-app-container
resources:
requests:
cpu: 50m # 개발 환경용 CPU 요청량
memory: 64Mi # 개발 환경용 메모리 요청량
limits:
cpu: 100m # 개발 환경용 CPU 제한량
memory: 128Mi # 개발 환경용 메모리 제한량
env:
- name: MY_ENV_VAR
value: "dev_value" # 개발 환경용 환경 변수 값
- name: LOG_LEVEL
value: "DEBUG" # 개발 환경용 로그 레벨1.4 overlays/staging 디렉토리 구성 (스테이징 환경)#
overlays/staging 디렉토리에는 스테이징 환경에 적용할 설정을 정의합니다. 스테이징 환경에서는 프로덕션 환경과 유사한 환경을 구성하고, 배포 전 최종 테스트를 수행합니다.
overlays/staging/kustomization.yaml:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base
namespace: staging # 네임스페이스 변경
namePrefix: staging- # 리소스 이름에 접두사 추가
images:
- name: my-app
newName: my-app
newTag: staging # 스테이징 환경용 이미지 태그
replicas: 5 # 스테이징 환경용 Replica 수overlays/staging/replicas.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app-deployment # 수정할 Deployment 이름
spec:
replicas: 5 # Replica 수 5로 지정1.5 overlays/prod 디렉토리 구성 (프로덕션 환경)#
overlays/prod 디렉토리에는 프로덕션 환경에 적용할 설정을 정의합니다. 프로덕션 환경에서는 안정적인 서비스 운영을 위해 리소스 제한을 강화하고, 불필요한 기능을 비활성화하는 등의 설정을 적용합니다.
overlays/prod/kustomization.yaml:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base
namespace: production # 네임스페이스 변경
images:
- name: my-app
newName: my-app
newTag: 1.0.0 # 프로덕션 환경용 이미지 태그
replicas: 10 # 프로덕션 환경용 Replica 수
resources:
- deployment.yaml # 추가 설정
# patchesStrategicMerge:
# - replica.yaml # 패치 파일 추가overlays/prod/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app-deployment
spec:
replicas: 10 #프로덕션 Replica 10개로 늘리기
template:
spec:
containers:
- name: my-app-container
resources: #프로덕션에서는 더 많은 리소스 할당
requests:
cpu: 200m #최소
memory: 256Mi
limits:
cpu: 500m #최대
memory: 512Mi
env:
- name: MY_ENV_VAR
value: "prod_value"1.6 환경별 배포#
각 환경에 배포하려면 다음과 같이 kubectl apply -k 명령어를 실행합니다.
- 개발 환경 배포:
kubectl apply -k overlays/dev- 스테이징 환경 배포:
kubectl apply -k overlays/staging- 프로덕션 환경 배포:
kubectl apply -k overlays/prod2. patches를 이용한 환경별 설정 차이 관리#
Kustomize에서 patches는 Base 매니페스트 파일의 설정을 변경하는 강력한 도구입니다. patches를 사용하면 Base 파일을 직접 수정하지 않고도 환경별로 설정을 다르게 적용할 수 있습니다. 이 섹션에서는 patchesStrategicMerge와 patchesJson6902를 이용하여 환경별 설정 차이를 관리하는 방법에 대해 자세히 알아보겠습니다.
2.1 patches: Strategic Merge Patch#
patchesStrategicMerge는 Kubernetes Strategic Merge Patch 방식을 사용하여 설정을 변경합니다. 이 방식은 YAML 형식으로 작성된 패치 파일을 사용하며, Base 파일과 패치 파일을 병합하여 최종 설정을 생성합니다.
장점:
- 직관적인 문법: YAML 형식을 사용하므로 가독성이 높고 이해하기 쉽습니다.
- 간편한 설정 변경: 기존 설정 값을 변경하거나 새로운 설정을 추가하는 데 용이합니다.
단점:
- 제한적인 기능: 복잡한 설정 변경 (예: 리소스 삭제)에는 사용하기 어려울 수 있습니다.
사용법:
- kustomization.yaml 파일에 patchesStrategicMerge 필드를 추가하고, 패치 파일 목록을 지정합니다.
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base
patchesStrategicMerge:
- deployment-patch.yaml # Deployment에 적용할 패치 파일
- service-patch.yaml # Service에 적용할 패치 파일각 패치 파일 (deployment-patch.yaml, service-patch.yaml)에 변경할 설정을 YAML 형식으로 정의합니다.
deployment-patch.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app-deployment # 수정할 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 # 메모리 제한량 변경service-patch.yaml:
apiVersion: v1
kind: Service
metadata:
name: my-app-service # 수정할 Service 이름
spec:
type: NodePort # Service 타입 변경주의 사항:
- 패치 파일의 apiVersion, kind, metadata.name은 수정할 리소스와 일치해야 합니다.
- 패치 파일에는 변경할 설정만 정의합니다. Base 파일에 정의된 모든 설정을 다시 정의할 필요는 없습니다.
- 패치 파일에 정의된 설정은 Base 파일의 설정을 덮어씁니다.
2.2 patches: JSON Patch#
patchesJson6902는 JSON Patch 형식을 사용하여 설정을 변경합니다. 이 방식은 JSON Patch 표준을 따르며, JSON 형식으로 작성된 패치 파일을 사용합니다.
장점:
- 유연한 설정 변경: 리소스 추가, 삭제, 변경 등 다양한 작업을 수행할 수 있습니다.
- 정밀한 제어: JSON Patch 연산을 사용하여 특정 설정 값을 정확하게 변경할 수 있습니다.
단점:
- 복잡한 문법: JSON Patch 문법을 이해하고 사용해야 합니다.
- 가독성 저하: YAML 형식에 비해 가독성이 떨어질 수 있습니다.
사용법:
- kustomization.yaml 파일에 patchesJson6902 필드를 추가하고, 패치 파일 목록을 지정합니다.
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base
patchesJson6902:
- target:
kind: Deployment
name: my-app-deployment # 패치를 적용할 리소스 지정
patch: |-
- op: replace # Operation (replace, add, remove)
path: /spec/template/spec/containers/0/image # 변경할 설정 경로
value: my-app:1.0.1 # 새로운 값
- target:
kind: Service
name: my-app-service # 패치를 적용할 리소스 지정
patch: |-
- op: replace
path: /spec/type
value: NodePort # 새로운 값각 패치 파일에 JSON Patch 연산을 사용하여 변경할 설정을 정의합니다.
JSON Patch 연산:
- add: 새로운 값을 추가합니다.
- remove: 값을 삭제합니다.
- replace: 기존 값을 새로운 값으로 대체합니다.
- move: 값을 다른 위치로 이동합니다.
- copy: 값을 복사합니다.
- test: 값이 예상과 일치하는지 확인합니다.
주의 사항:
- target 필드는 패치를 적용할 리소스의 kind와 name을 정확하게 지정해야 합니다.
- path 필드는 변경할 설정의 경로를 JSON Pointer 형식으로 지정해야 합니다.
2.3 환경별 패치 구성 예시#
다음과 같이 개발 환경, 스테이징 환경, 프로덕션 환경에 대한 패치 파일을 구성할 수 있습니다.
- overlays/dev/kustomization.yaml:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base
patchesStrategicMerge:
- deployment-patch.yaml # 개발 환경용 Deployment 패치- overlays/dev/deployment-patch.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app-deployment
spec:
template:
spec:
containers:
- name: my-app-container
image: my-app:dev # 개발 환경용 이미지 태그
resources:
requests:
cpu: 50m
memory: 64Mi
limits:
cpu: 100m
memory: 128Mi- overlays/staging/kustomization.yaml:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base
patchesStrategicMerge:
- deployment-patch.yaml # 스테이징 환경용 Deployment 패치- overlays/staging/deployment-patch.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app-deployment
spec:
template:
spec:
containers:
- name: my-app-container
image: my-app:staging # 스테이징 환경용 이미지 태그
replicas: 5- overlays/prod/kustomization.yaml:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base
patchesJson6902:
- target:
kind: Deployment
name: my-app-deployment
patch: |-
- op: replace
path: /spec/template/spec/containers/0/image
value: my-app:1.0.0 # 프로덕션 환경용 이미지 태그
- op: replace
path: /spec/replicas
value: 10