Kustomize를 이용한 배포 파이프라인 구축

1. Kustomize를 이용한 배포 파이프라인 구축 (예: kubectl apply -k를 활용한 배포 자동화)#

Kustomize는 쿠버네티스 애플리케이션 배포를 자동화하는 데 매우 효과적인 도구입니다. kubectl apply -k 명령어를 활용하면 CI/CD 파이프라인에서 Kustomize 설정을 기반으로 애플리케이션을 자동으로 배포할 수 있습니다. 이 섹션에서는 Kustomize를 이용한 배포 파이프라인 구축 방법에 대해 자세히 알아보겠습니다.

1.1 배포 파이프라인 개요#

배포 파이프라인은 애플리케이션의 코드 변경 사항을 자동으로 빌드, 테스트, 배포하는 프로세스입니다. Kustomize를 이용한 배포 파이프라인은 다음과 같은 단계를 포함합니다.

  • 코드 변경: 개발자가 애플리케이션 코드를 변경하고 Git 저장소에 커밋합니다.
  • 빌드: CI/CD 시스템이 코드 변경을 감지하고 애플리케이션을 빌드합니다 (예: Docker 이미지 빌드).
  • 테스트: CI/CD 시스템이 빌드된 애플리케이션을 테스트합니다.
  • 배포: CI/CD 시스템이 Kustomize 설정을 기반으로 애플리케이션을 쿠버네티스 클러스터에 배포합니다.
  • 검증: CI/CD 시스템이 배포된 애플리케이션을 검증합니다.

1.2 CI/CD 시스템 선택#

Kustomize를 이용한 배포 파이프라인을 구축하기 위해서는 CI/CD 시스템이 필요합니다. 다양한 CI/CD 시스템이 있으며, 각각의 장단점을 고려하여 적절한 시스템을 선택해야 합니다.

대표적인 CI/CD 시스템:

  • Jenkins: 오픈 소스 CI/CD 시스템으로, 다양한 플러그인을 지원하며 높은 확장성을 제공합니다.
  • GitLab CI: GitLab에 내장된 CI/CD 시스템으로, Git 저장소와 통합되어 편리하게 사용할 수 있습니다.
  • GitHub Actions: GitHub에 내장된 CI/CD 시스템으로, GitHub 저장소와 통합되어 편리하게 사용할 수 있습니다.
  • CircleCI: 클라우드 기반 CI/CD 시스템으로, 사용하기 쉽고 빠른 빌드 속도를 제공합니다.

1.3 CI/CD 파이프라인 구성#

CI/CD 시스템을 선택한 후, 배포 파이프라인을 구성합니다. 파이프라인은 일반적으로 다음과 같은 단계를 포함합니다.

  • 소스 코드 가져오기: Git 저장소에서 애플리케이션 소스 코드를 가져옵니다.
  • 빌드: 애플리케이션을 빌드합니다 (예: Docker 이미지 빌드).

docker build -t : .

docker push :

  • Kustomize 적용 및 배포: kubectl apply -k 명령어를 사용하여 Kustomize 설정을 기반으로 애플리케이션을 쿠버네티스 클러스터에 배포합니다.

kubectl apply -k overlays/

  • 테스트 및 검증: 배포된 애플리케이션을 테스트하고 검증합니다.

예시: GitLab CI 설정 파일 (.gitlab-ci.yml)

stages:
  - build
  - deploy

build:
  stage: build
  image: docker:latest
  services:
    - docker:dind
  before_script:
    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
  script:
    - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
    - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
  tags:
    - docker

deploy_dev:
  stage: deploy
  image:
    name: bitnami/kubectl:latest
    entrypoint: [""]
  dependencies:
    - build
  script:
    - kubectl config use-context <your-dev-cluster-context>
    - kubectl apply -k overlays/dev
  environment:
    name: development
  tags:
    - kubernetes
  • image: 사용할 Docker 이미지를 지정합니다 (예: bitnami/kubectl:latest).
  • script: 실행할 명령어를 지정합니다.

kubectl config use-context : 쿠버네티스 클러스터 컨텍스트를 설정합니다 (개발 환경).

  • kubectl apply -k overlays/dev: Kustomize 설정을 적용하여 개발 환경에 배포합니다.
  • environment: 배포 환경을 지정합니다.
  • tags: 실행할 runner를 지정합니다.

1.4 환경 변수 활용#

CI/CD 시스템은 환경 변수를 사용하여 설정을 관리합니다. Kustomize는 환경 변수를 직접 사용할 수 없지만, patches를 이용하여 간접적으로 환경 변수를 활용할 수 있습니다.

방법:

  • CI/CD 시스템에서 사용할 환경 변수를 정의합니다 (예: IMAGE_TAG).
  • kustomization.yaml 파일에서 patchesStrategicMerge 또는 patchesJson6902를 사용하여 환경 변수 값을 적용합니다.
  • 각 환경 변수가 달라지기 때문에 이미지 파일의 name, newName, newTag를 각각 지정해준다.

patchesStrategicMerge 예시:

  • overlays/dev/kustomization.yaml:
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
  - ../../base

patchesStrategicMerge:
  - deployment-patch.yaml

# namespace: production # namespace 이름
images:
  - name: my-app # 기본 이미지 이름
    newName: my-app # 바꿀 이미지 이름
    newTag: ${IMAGE_TAG} # 배포시 이미지 태그
  • 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:${IMAGE_TAG}

1.5 배포 전략#

배포 전략은 애플리케이션을 업데이트하는 방법을 정의합니다. 헬름과 마찬가지로 Kustomize도 다양한 배포 전략을 지원합니다.

  • Rolling Update: 기존 Pod를 점진적으로 새로운 버전의 Pod로 교체합니다.
  • Canary Deployment: 새로운 버전의 애플리케이션을 일부 사용자에게 먼저 배포하여 테스트하는 전략입니다.
  • Blue-Green Deployment: 새로운 버전의 애플리케이션을 완전히 새로운 환경에 배포하고, 트래픽을 한 번에 전환하는 전략입니다.

Kustomize는 배포 전략을 직접 지원하지 않지만, patches와 replicas 설정을 조합하여 다양한 배포 전략을 구현할 수 있습니다.