지난 글에서 우리는 로컬 minikube 클러스터 위에서 Kubernetes Ingress를 직접 적용하고 기본적인 트래픽 라우팅도 경험했습니다.
이번에는 Kubernetes 리소스가 아닌 클라우드 네이티브 툴을 minikube 클러스터에서 사용해볼 건데요. 특히 Kustomize를 활용한 간단한 Kubernetes 설정 관리를 다뤄보겠습니다.
이번 가이드를 통해 여러분은
- Kustomize가 무엇이고,
- 어떻게 Kubernetes 배포 설정을 체계적이고 쉽게 관리할 수 있는지에 대해
minikube 환경에서 경험하실 수 있을 겁니다.
어렵지 않게 따라하실 수 있도록 최대한 직관적인 구성으로 준비한 가이드이니, Kustomize에 대해 궁금했거나 Kubernetes 배포 설정 관리에 대해 관심 있다면 꼭 활용해보세요!
✨Kustomize란?
Kustomize는 Kubernetes 애플리케이션의 설정을 템플릿 없이 YAML 파일 그대로 관리할 수 있도록 도와주는 툴입니다.
복잡한 템플릿 언어를 별도로 배울 필요 없이, 리소스 배포를 위한 기존 YAML 파일들은 그대로 사용하면서 환경별로 필요한 부분만 수정하는 방식인데요.
또한 kubectl(1.14
버전 이상)에 내장되어 있어 별도 설치 없이도 바로 사용 가능하기 때문에 Kustomize는 접근성이 좋습니다.
Kustomize를 활용하려면 아래와 같이 Base 설정과 Overlays 설정, 그리고 kustomization.yaml
이란 명세 파일이 필요합니다.
- Base 설정: Kubernetes 리소스를 배포하는 기본 YAML 파일들(예: Deployment, Service)
- Overlay 설정: Base 설정 중 환경별로 변경되어야 할 사항을 정의한 파일들을 디렉토리로 구분(예: dev, staging, prod)
kustomization.yaml
:- Kustomize가 참조할 리소스 목록, 이미지 정보 등을 정의
- Base 설정이 포함된 디렉토리와 Overlay 설정이 포함된 디렉토리 모두에 필요
Kustomize를 도입하면 Kubernetes 리소스를 배포하는 기존 YAML 파일들은 Base 설정에서 한 번만 정의하면 되기 때문에 코드 중복을 피하고 유지보수하기 좋습니다.
또한 각 환경별로 필요한 변경 사항만 별도로 명시하고 관리할 수 있기 때문에 환경 간의 차이점을 쉽게 파악하고 추적도 가능합니다.
이런 특징은 GitOps 워크플로우와도 잘 어울리기 때문에, 선언적 방식으로 Kubernetes 리소스를 관리하는 데에 도움이 됩니다.
🖥️Kustomize로 Nginx 앱 배포 설정 관리하기
그럼 이제부터 직접 Kustomize를 사용해서 Kubernetes 배포 설정을 관리해보겠습니다. 실습은 저희가 그동안 사용했던 minikube 클러스터 위에서 진행할 예정인데요.
- Base 설정으로 기본 Nginx 앱을 먼저 정의하고,
- Nginx 앱의 replica 수를 환경별(dev, prod)로 다르게 명시한 다음,
- kubectl의 Kustomize 명령어로 Nginx 앱을 dev 또는 prod 환경에 맞춰 변경해보겠습니다.
1️⃣Base 설정 명시를 위한 YAML 파일 생성
방금 살펴본 것처럼, 모든 환경에서 공통으로 사용될 Base 설정들을 먼저 만들어보겠습니다.
저는 본 실습을 위해 kustoimize-test
디렉토리를 먼저 생성했는데요.
그 안에 base
디렉토리를 생성해서 아래와 같이 설정 파일들을 작성할 예정입니다.
base/
├── nginx-deployment.yaml # Nginx의 Deployment와 Service 정의
└── kustomization.yaml
Nginx Deployment 매니페스트를 생성하기 전에, 터미널에서 아래 명령어로 테스트용 Namespace를 먼저 생성합니다.
kubectl create ns kustomize-test
이렇게 실습이나 테스트할 땐 별도의 Namespace를 만든 다음 그 안에서 진행하는 것이 좋습니다.
다시 Nginx 앱 매니페스트로 돌아와서, base/nginx-deployment.yaml
에는 Nginx Pod 2개를 실행하는 Deployment와 ClusterIP 타입의 Service를 정의합니다.
# base/nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-app
namespace: kustomize-test # 테스트용 Namespace 지정
labels:
app: nginx
spec:
replicas: 2 # 기본 replica 수
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
namespace: kustomize-test
spec:
type: ClusterIP
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
그리고 base/kustomization.yaml
파일의 내용은 아래와 같이 Nginx 배포를 위한 매니페스트를 포함하도록 작성합니다.
# base/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- nginx-deployment.yaml
그럼 아래와 같은 구조의 base
디렉토리가 만들어지겠죠.
이렇게 base
디렉토리 안에 생성한 설정들은 각 환경에서 변경 사항을 적용할 때의 기준이 되는 겁니다.
2️⃣Overlay 설정을 위한 YAML 파일 생성
Nginx 앱 배포를 위한 Base 설정을 마쳤으니, 이제 각기 다른 환경에서 이 Nginx 앱을 어떻게 변경할지 먼저 정의해보겠습니다.
base
에서 정의한 Nginx Deployment의 Replica 수(기본 2개)를 개발(dev
) 환경에서는 1로, 프로덕션(prod
) 환경에서는 4로 변경하고 싶다고 가정해봅시다.
dev
: Nginx의 Deployment의 Replica 수를 1로 수정prod
: Nginx의 Deployment의 Replica 수를 4로 수정
먼저 각 환경을 위한 Overlay 설정을 생성하기 위해, kustomize-test
디렉토리로 다시 돌아온 다음, overlays
디렉토리를 새로 생성합니다.
overlays
디렉토리 안에 dev
디렉토리와 prod
디렉토리를 생성합니다. 이 디렉토리 안에 각 환경의 변경 사항을 정의하게 되는 것인데요.
지금까지의 kustomize-test
디렉토리의 구조는 아래와 같겠죠?
이제 dev
환경에서 Nginx 앱의 Replica 수를 1로 줄이는 변경 사항을 YAML 파일로 정의해보겠습니다.
우리는 이 YAML 파일 이름을 replicas-patch.yaml
로 지정할게요.
replicas-patch.yaml
파일에는 base
에서 정의한 Deployment에서 spec.replicas
값을 1로 변경하는 내용을 다음과 같이 작성합니다.
Info
replicas-patch.yaml
의metadata.name
필드와metadata.namespace
필드의 값은base
의 Deployment에서 정의한 값과 일치해야 합니다.
# overlays/dev/replicas-patch.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-app # base에 정의된 Deployment 이름
namespace: kustomize-test # 테스트용 Namespace 지정
spec:
replicas: 1 # dev 환경에서 필요한 Replica 수 지정
그 다음, 동일한 경로에 kustomization.yaml
파일을 아래와 같이 생성합니다.
# overlays/dev/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base # base 디렉토리의 경로
patches:
- path: replicas-patch.yaml
여기서 patches
란, base
에서 정의한 리소스 YAML 파일의 특정 부분만 선택적으로 수정하거나 추가할 때 사용하는 필드입니다.
본 실습에서는 base/deployment.yaml
파일 내용 중 Replica 수를 변경하는 내용만 담긴 replicas-patch.yaml
로 리소스 패치를 진행하는 것입니다.
prod
디렉토리 안에도 아래와 같이 replicas-patch.yaml
와 kustomization.yaml
파일을 생성합니다.
# overlays/prod/replicas-patch.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-app # base에 정의된 Deployment 이름
namespace: kustomize-test # 테스트용 Namespace 지정
spec:
replicas: 4 # prod 환경에서 필요한 Replica 수 지정
# overlays/prod/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../../base # base 디렉토리의 경로
patches:
- path: replicas-patch.yaml
그럼 아래와 같이 Overlay 설정 파일들도 모두 준비가 되었는데요.
이제 kubectl 명령어로 각 환경에 따라 Nginx Deployment를 배포해보겠습니다.
3️⃣각 환경별 Nginx 앱 배포하기
먼저 base
디렉토리에서 정의했던 기본 매니페스트 파일로 Nginx 앱을 배포해보겠습니다.
현재 경로의 터미널에서 아래 명령어로 Nginx Deployemnt와 Service를 배포합니다.
kubectl apply -f base/nginx-deployment.yaml
그럼 위 이미지에서 보이는 것처럼, base
디렉토리 내 매니페스트에서 정의했던 Deployment(Replica 2개)와 Service가 배포된 걸 확인할 수 있습니다.
이 상태에서 dev
환경의 Overlay 설정을 적용해보겠습니다.
Kustomize로 정의된 특정 환경의 설정을 Kubernetes 클러스터에 배포하려면, 터미널에서 해당하는 Overlay 디렉토리를 대상으로 kubectl apply -k {overlay 디렉토리 경로}
명령어를 사용하는데요.
우리는 dev
환경의 Overlay 설정을 사용할 것이기 때문에 아래와 같은 명령어를 실행하면 됩니다.
kubectl apply -k overlays/dev
방금 전 정의한 dev
환경의 설정이 제대로 적용되었다면 Deployment의 Replica 수가 1개로 감소해야 하는데요. 실제로 줄어들었을까요?
dev
환경에서의 Nginx 앱 배포 설정이 제대로 적용되었습니다!
kubectl -n kustomize-test describe deployment nginx-app
명령어로 Deployment의 Event를 살펴보면 Replica 수가 2에서 1로 줄었다고 나오네요.
이제 prod
환경의 설정을 적용해보겠습니다. 해당 설정은 Nginx Deployment의 Replica 수가 4개로 지정되어 있는데요. 실제로 반영되는지 확인해보겠습니다.
아까 dev
환경 적용 때와 마찬가지로 kubectl apply -k {overlay 디렉토리 경로}
명령어를 사용하면 되는데요. 이번엔 아래와 같이 prod
디렉토리 경로를 지정하면 되겠죠?
kubectl apply -k overlays/prod
위 명령어를 터미널에 실행하면…
우리가 기대했던 대로 Nginx Deployment의 Pod 수가 4개로 늘어나면서 차근차근 켜지고 있네요!
Nginx Deployment의 Event 현황을 kubectl describe 명령어로 살펴보면, 아래처럼 Replica 수가 1에서 4로 늘어났다고 표시됩니다!🎉
지금까지 살펴본 것처럼 Kustomize를 활용하면 Kubernetes 클러스터에 배포된 리소스를 원하는 환경별로 다르게 업데이트하면서 상황에 따른 유동적인 리소스 관리가 가능합니다.
본 가이드에선 Kustomize에 대해 빠르게 감을 잡고 이해할 수 있도록 Replica 수와 같이 간단한 설정만 다뤘는데요.
실제로 ConfigMap이나 Secret과 같은 Kubernetes 리소스도 Kustomize로 관리할 수 있으니, Kubernetes를 운영 중이거나 학습하고 있다면 Kustomize에 대해 짚고 넘어가시는 걸 추천드립니다.
🔭마무리
이번 아티클에서는 Kustomize를 이용해서 환경별로 앱을 다르게 배포해보는 실습을 minikube 클러스터 위에서 진행해봤습니다.
총 3회에 걸쳐서 minikube 설치부터 Kubernetes 실습과 Cloud Native 툴 실습까지 다뤄봤는데요.
Kubernetes가 이미 널리 사용되고 있는 만큼 중요하다보니, 여러분들이 minikube로 Kubernetes를 공부하고 테스트할 수 있는 기회를 제공해드리고 싶었습니다.
minikube 실습 가이드 시리즈는 여기서 마치려고 하는데요. 혹시 minikube나 Kubernetes, Cloud Native와 관련해서 궁금하거나 다뤘으면 하는 주제가 있다면 언제든 알려주세요.
그러면 다음 아티클에서 새로운 주제로 찾아뵙겠습니다.
오늘도 읽어주셔서 감사합니다!