Ssoon
Kustomize : 여러 환경에 배포하기 본문
🌍 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 파일입니다.
(⎈|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**를 사용하면 모든 리소스의 이름에 자동으로 접두사/접미사를 추가하여 환경별로 리소스를 명확하게 구분할 수 있습니다.
'CICD Study [1기]' 카테고리의 다른 글
| Helm : 5.1 - Helm 프로젝트 생성 (0) | 2025.10.19 |
|---|---|
| Kustomize : Kustomize에서 ConfigMap 생성하기 (0) | 2025.10.18 |
| Kustomize : Kustomize에서 Kubernetes 필드 업데이트하기 (0) | 2025.10.14 |
| Kustomize : Kustomize에서 컨테이너 이미지 업데이트하기 (0) | 2025.10.14 |
| Kustomize : Kustomize를 사용한 Kubernetes 리소스 배포 (0) | 2025.10.14 |