Ssoon

Kustomize : 여러 환경에 배포하기 본문

CICD Study [1기]

Kustomize : 여러 환경에 배포하기

구구달스 2025. 10. 14. 00:27

🌍 Kustomize로 여러 환경(Namespace)에 배포하기

애플리케이션을 개발할 때, 동일한 애플리케이션을 여러 다른 환경에 배포해야 하는 상황은 매우 흔합니다. 예를 들어, staging 환경은 테스트용으로, production 환경은 실제 서비스용으로 사용될 수 있습니다.

문제 (Problem): Kustomize를 사용하여 동일한 애플리케이션을 **서로 다른 namespace**에 배포하고 싶습니다.

해결책 (Solution): kustomization.yaml 파일의 namespace 필드를 사용하고, **base와 overlay**라는 계층적 디렉터리 구조를 활용합니다.

이 두 환경은 namespace, 일부 구성 파라미터, 컨테이너 버전 등 최소한의 변경 사항만 있을 뿐, 대부분의 기본 Kubernetes 파일은 동일합니다. Kustomize는 공통 base 위에 namespace 필드를 사용하여 각 환경(overlay)별로 변경 사항을 덧씌울 수 있게 해줍니다.


🏛️ Base와 Overlay를 사용한 디렉터리 구조

효율적인 환경 관리를 위해 먼저 공통 리소스와 환경별 리소스를 디렉터리로 분리합니다.

base 디렉터리에는 모든 환경에서 공통으로 사용되는 Kubernetes 리소스 파일(예: deployment.yaml)을 배치합니다.

production이나 staging과 같은 각 환경을 위한 새로운 디렉터리(overlay)를 만들고, 여기에는 해당 환경에만 특화된 kustomization.yaml 파일을 둡니다.

Figure 4-2. Kustomize 레이아웃

.
├── base                  # 
│  ├── deployment.yaml
│  └── kustomization.yaml
├── production            # 
│   └── kustomization.yaml 
└── staging               # 
   └── kustomization.yaml 
  • base: 공통 파일
  • production: Production 환경 전용 변경 사항
  • staging: Staging 환경 전용 변경 사항

base 디렉터리의 kustomization.yaml 파일은 자신이 포함할 리소스를 단순하게 나열합니다.

(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ mkdir base production staging

(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ cat <<EOF > base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - ./deployment.yaml
EOF
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ cat base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - ./deployment.yaml

"base 디렉터리에는 모든 환경이 공유하는 핵심 리소스 정의를, overlay 디렉터리에는 각 환경의 고유한 변경 사항을 정의합니다."


📝 환경별 Overlay 구성하기 (Staging vs. Production)

이제 각 환경(staging, production)의 kustomization.yaml 파일에서 공통 base를 참조하고, 해당 환경에 필요한 변경 사항(namespace, image 태그)을 지정합니다.

staging 환경 구성:

staging 환경을 위한 kustomization.yaml 파일입니다.

YAML
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ cat <<EOF > staging/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - ../base           #

namespace: staging      #

images:
  - name: lordofthejars/pacman-kikd
    newTag: 1.2.0-beta  #
EOF
  • resources: - ../base: 상위 디렉터리의 base 디렉터리를 참조하여 모든 공통 리소스를 가져옵니다.
  • namespace: staging: base의 모든 리소스에 namespace: staging을 주입합니다.
  • images.newTag: 1.2.0-beta: Staging 환경에서는 1.2.0-beta 태그의 컨테이너 이미지를 사용하도록 설정합니다.

production 환경 구성:

production 환경을 위한 kustomization.yaml 파일입니다. staging과 유사하지만 namespace와 이미지 tag가 다릅니다.

(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ cat <<EOF > production/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - ../base
namespace: prod       #

images:
  - name: lordofthejars/pacman-kikd
    newTag: 1.1.0       #
EOF
  • namespace: prod: Production 환경의 namespace를 prod로 설정합니다.
  • images.newTag: 1.1.0: Production 환경에서는 안정화 버전인 1.1.0 태그를 사용합니다.

"overlay의 kustomization.yaml 파일은 base를 참조하고, namespace와 images 같은 환경별 차이점만 간결하게 정의합니다."


🔬 빌드 결과를 통해 환경별 차이 확인하기

kustomize 명령어는 실행되는 디렉터리에 따라 다른 출력을 생성합니다.

Staging 환경 빌드:

staging 디렉터리에서 kustomize build를 실행하면 staging 구성이 적용된 결과가 나옵니다.

(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ kustomize build staging/
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/name: pacman-kikd
  name: pacman-kikd
  namespace: staging
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: pacman-kikd
  template:
    metadata:
      labels:
        app.kubernetes.io/name: pacman-kikd
    spec:
      containers:
      - image: lordofthejars/pacman-kikd:1.2.0-beta 📌
        imagePullPolicy: Always
        name: pacman-kikd
        ports:
        - containerPort: 8080
          name: http
          protocol: TCP

출력 결과 (Staging):

  • namespace 값으로 staging이 주입되었습니다.
  • 컨테이너 이미지가 1.2.0-beta 태그로 설정되었습니다.

Production 환경 빌드:

production 디렉터리에서 실행하면 production 구성에 맞게 조정된 출력이 생성됩니다.

(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ kustomize build production/
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/name: pacman-kikd
  name: pacman-kikd
  namespace: prod
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: pacman-kikd
  template:
    metadata:
      labels:
        app.kubernetes.io/name: pacman-kikd
    spec:
      containers:
      - image: lordofthejars/pacman-kikd:1.1.0 📌
        imagePullPolicy: Always
        name: pacman-kikd
        ports:
        - containerPort: 8080
          name: http
          protocol: TCP

출력 결과 (Production):

  • namespace 값으로 prod가 주입되었습니다.
  • 컨테이너 이미지가 1.1.0 태그로 설정되었습니다.

"kustomize build <디렉터리> 명령은 해당 디렉터리의 kustomization.yaml 파일을 기준으로 base와 overlay를 병합하여 최종 YAML을 생성합니다."


🏷️ namePrefix와 nameSuffix로 리소스 이름 관리하기

Kustomize는 모든 리소스의 name과 관련 참조(reference)에 **접두사(prefix)**나 **접미사(suffix)**를 자동으로 추가하는 기능을 제공합니다.

이는 환경별로 리소스 이름을 다르게 하거나, 배포된 버전을 이름에 명시하고 싶을 때 유용합니다.

staging 환경의 kustomization.yaml 파일에 namePrefix와 nameSuffix를 추가해 보겠습니다.

(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ cat <<EOF >> staging/kustomization.yaml
namePrefix: staging-   #
nameSuffix: -v1-2-0    #
EOF
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ cat staging/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  - ../base           #

namespace: staging      #

images:
  - name: lordofthejars/pacman-kikd
    newTag: 1.2.0-beta  #
namePrefix: staging-   #
nameSuffix: -v1-2-0    #

빌드 출력 결과:

Deployment의 name이 변경된 것을 확인할 수 있습니다.

(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ kustomize build staging/
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/name: pacman-kikd
  name: staging-pacman-kikd-v1-2-0   📌
  namespace: staging
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: pacman-kikd
  template:
    metadata:
      labels:
        app.kubernetes.io/name: pacman-kikd
    spec:
      containers:
      - image: lordofthejars/pacman-kikd:1.2.0-beta
        imagePullPolicy: Always
        name: pacman-kikd
        ports:
        - containerPort: 8080
          name: http
          protocol: TCP

"namePrefix와 nameSuffix를 사용하면, 환경별로 리소스 이름을 고유하게 만들어 리소스 충돌을 방지하고 식별을 용이하게 할 수 있습니다."


📌 핵심 요약

  • Kustomize의 base와 overlay 구조는 공통 구성(base)을 재사용하고 환경별 차이(overlay)만 관리하는 효율적인 방법입니다.
  • overlay의 kustomization.yaml 파일에서 namespace 필드를 설정하여 모든 리소스에 특정 namespace를 주입할 수 있습니다.
  • overlay의 images 섹션을 사용하여 각 환경에 맞는 컨테이너 이미지 태그를 지정할 수 있습니다.
  • kustomize build <디렉터리> 명령으로 각 환경(staging, production)에 맞는 최종 매니페스트를 생성할 수 있습니다.
  • **namePrefix**와 **nameSuffix**를 사용하면 모든 리소스의 이름에 자동으로 접두사/접미사를 추가하여 환경별로 리소스를 명확하게 구분할 수 있습니다.
Comments