본문 바로가기
사이드 프로젝트

[CI/CD 프로젝트] Kustomize 사용하여 다양한 환경에서 쉽게 배포하기

by 간장공장공차장 2024. 11. 19.
반응형

Kustomize란?

❈ kubernetes 1.14부터 kustomize는 내장되었다.

Kustomize는 Kubernetes 리소스를 YAML 파일로 관리하면서, 중복 없이 다양한 환경에 맞춰 쉽게 리소스를 커스터마이징할 수 있는 도구입니다. Base와 Overlay 개념을 통해 공통 리소스를 정의하고, Overlay에 대한 내용을 상속받아 환경별로 다르게 적용 가능하다.

Kustomize와 Helm 비교

kubernetes를 사용하면서, 대표적인 배포 도구 helm, kustomize 에 대해서 비교해 본다.

  • Helm: 패키징된 Chart를 사용해 전체 애플리케이션을 배포하고 관리하며, 변수화와 템플릿화를 지원한다.
  • Kustomize: 기존 YAML 파일을 커스터마이징하는 방식으로, 패키징된 차트가 필요하지 않다. 또한, kustomize를 통해서 쿠버네티스 오브젝트(ConfigMap, Secret)을 선언적으로 관리할 수 있다.
  • 장단점 비교
    • Helm의 장점: 템플릿화된 구성을 사용하여 복잡한 애플리케이션을 쉽게 배포 가능해진다. (잘 세팅된 내용을 가져오기 용이함)
    • Kustomize의 장점: 단순하고 선언적인 방식으로 YAML 파일을 관리, 로직이 없이 순수 YAML 파일만 사용한다. 상속을 통해 커스터마이징이 용이하다.

디렉터리

  • patch에는 deployment, service에 대한 규격을 맞출 필요 없이 변경되는 부분만 작성한다.
  • base이미지에, patch에서 변경되는 내역이 상속되어 배포된다.
  • kustomization.yaml에는, base가 될 내용과, patch 내용이 포함되면 된다. ConfigMap, Secret도 포함된다.
my-app/
├── base/
│   ├── deployment.yaml
│   ├── service.yaml
│   └── kustomization.yaml
└── overlays/
    ├── dev/
    │   ├── kustomization.yaml
    │   └── patch.yaml
    └── prod/
        ├── kustomization.yaml
        └── patch.yaml

Kustomize 동작 방식

  • 패치(patch) 방식
    • 패치는 기존 Kubernetes 리소스의 일부를 수정하거나 덮어쓸 때 사용된다. kustomize파일에 패치 리소스를 추가하여 기본 리소스의 속성을 변경할 수 있다.
    • 환경에 따라 리소스의 특정 필드만 수정할 때 유용하다.
  • overlay 방식
    • overlay는 기본 리소스(base) 위에 추가적인 설정을 덧붙여 최종 리소스를 생성하는 방식이다. 기본 리소스에 여러 개의 오버레이를 적용할 수 있어 환경별로 리소스를 쉽게 관리할 수 있다.
    • 공통 리소스(base) 설정을 유지하면서 환경별로 필요한 설정을 오버레이하여 각각의 환경에 적합한 Kubernetes 리소스를 추가로 생성할 수 있다.

실습

💡kustomize를 통해 config, secret을 선언적으로 생성해보고, overlay를 통해 환경마다 다른 nodeport를 설정해본다.

  • v1.21부터는 Kustomize 기능이 내장되어 있어 별도의 설치 없이 사용할 수 있다.
  • kubectl kustomize ./
  • Base와 Overlay 구조
    • 디렉토리 구조
    • ➜ hellospring . ├── base │ ├── deployment.yaml │ ├── kustomization.yaml │ └── service.yaml ├── dev │ ├── dev.properties │ ├── kustomization.yaml │ └── service.yaml └── prod ├── kustomization.yaml ├── prod.properties └── service.yaml
    • Base 디렉토리 내 파일 생성
    • # /base/deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: hellospring-deployment spec: replicas: 3 selector: matchLabels: app: backend template: metadata: labels: app: backend spec: containers: - name: hellospring-container image: suhyeonsong/hellospring:latest ports: - containerPort: 3000 # /base/service.yaml apiVersion: v1 kind: Service metadata: name: hellospring-service spec: type: NodePort selector: app: backend ports: - port: 3000 targetPort: 3000 nodePort: 30001 # /base/kustomization.yaml resources: - deployment.yaml - service.yaml
  • kustomize를 통한 k8s리소스 출력
kubectl kustomize ./

아래와 같이 kustomize파일에 넣은 service, deployment가 출력된다.

  • Overlay 적용 (개발 환경):
    kubectl apply -k ./overlays/dev
  • 이제, base를 기반하여 dev환경에 맞춘 service 구성과, config파일을 overlay한다.
# dev/dev.properties
FOO=dev

# dev/kustomization.yaml
namePrefix: dev-

resources:
  - ../base

patches:
  - path: service.yaml  # 패치할 파일 경로
    target:
      kind: Service      # 패치할 리소스의 종류
      name: hellospring-service  # 패치할 리소스의 이름

configMapGenerator:
  - name: test-configuration
    files:
      - dev.properties

# dev/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: hellospring-service
spec:
  ports:
    - port: 3000
      nodePort: 30002
  • 이제, overlay가 올바르게 되었는지 확인을 진행한다.

아래와 같이

  1. config 파일 생성
  2. dev에 대한 모든 자원에 prefix로 dev가 붙여 네이밍 되었다.
  3. nodeport가 변경되었다.

  • 이제 의도된 바와 같이 설정된 것을 확인하였으니, 배포를 시작해본다.
kubectl apply -k ./

아래와 같이 정상적으로 배포된 것을 볼 수 있다.

  • 삭제를 진행할때는 아래와 같이 진행한다.
kubectl delete -k ./
  • 나머지 운영계도 배포를 진행한다.
# prod/kustomization.yaml
namePrefix: prod-

resources:
  - ../base

patches:
  - path: service.yaml  # 패치할 파일 경로
    target:
      kind: Service      # 패치할 리소스의 종류
      name: hellospring-service  # 패치할 리소스의 이름

configMapGenerator:
- name: prod-configuration
  files:
  - prod.properties

# prod/prod.properties
FOO=prod

# prod/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: hellospring-service
spec:
  ports:
    - port: 3000
      nodePort: 30003
➜  prod git:(main) ✗

반응형