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/prod

2. 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