로컬에서 Kubernetes 시작하기: Minikube를 설치부터 HPA/VPA 실습까지
들어가며
저는 현재 데이터 엔지니어로서 Airflow, Datahub 등의 데이터 플랫폼 도구를 사용하고 있습니다. 이 도구들은 모두 GCP VM 환경 위에서 동작하며 Docker 기반으로 관리 중인데요, 최근에는 리소스 최적화와 확장성 측면에서 Kubernetes와 같은 오케스트레이션 도구의 필요성을 느끼고 있어 Minikube 실습을 진행해 보았습니다.
1. Minikube 설치
Minikube는 로컬에서 단일 노드 Kubernetes 클러스터를 구성할 수 있는 도구입니다. macOS ARM64 기준 설치 과정은 다음과 같습니다.
curl -LO https://github.com/kubernetes/minikube/releases/latest/download/minikube-darwin-arm64
sudo install minikube-darwin-arm64 /usr/local/bin/minikube
minikube start
- 권장 사양: CPU 2코어 이상, 메모리 2GB 이상, 디스크 20GB 이상
기본적으로 Docker 기반 단일 노드 클러스터가 생성됩니다. 생성된 클러스터는 default 네임스페이스에서 실행됩니다.
1-1. 대시보드 실행
웹 기반 대시보드로 클러스터 리소스 상태를 실시간으로 확인할 수 있습니다. 다음 명령어로 백그라운드에서 실행합니다.
minikube dashboard > /dev/null 2>&1 &
2. 확장성 테스트
2-1. Metrics Server 활성화
테스트에 앞서 Metrics Server를 활성화해 클러스터 내 리소스 사용량을 확인하고 자동 확장 기능을 사용할 수 있도록 합니다.
minikube addons list | grep metrics # 현재 상태 확인
minikube addons enable metrics-server # 활성화
*kubectl top 명령어로 node나 pod의 리소스(CPU, Memory) 사용량을 확인할 수 있습니다.
2-2. 수평 확장
수평 확장은 실행중인 Pod의 레플리카 수를 필요에 따라 늘리는 것을 의미합니다.
✅ 수동 확장
명령어로 직접 Pod의 개수를 조정합니다. 아래 예시는 특정 디플로이먼트의 레플리카를 3개로 늘립니다.
kubectl scale deployment [DEPLOYMENT] --replicas=3 -n [NAMESPACE]
kubectl get deployments --namespace [NAMESPACE] # 확인
다만 서비스의 부하가 증가할 때 Minikube 클러스터에서 이를 자동으로 감지하고 Pod를 배치한다면 운영이 더 수월해질 것입니다. 이를 위해 HPA를 사용합니다.
✅ 자동 확장 (HPA, Horizontal Pod Autoscaler)
HPA를 사용해 리소스에 따라 자동으로 Pod의 개수를 조정합니다. 아래 예시는 특정 디플로이먼트의 파드 수를 최소 1개에서 최대 3개로 지정하고, 파드의 평균 CPU 사용률을 50%로 유지하기 위해 파드 수를 늘리거나 줄입니다.
kubectl autoscale deployment [DEPLOYMENT] --min=1 --max=3 --cpu-percent=50 -n [NAMESPACE]
kubectl get hpa -n [NAMESPACE] # 확인
HPA가 정상 동작하기 위해서는 Deployment의 리소스 설정이 필요합니다.
kubectl edit deployment [DEPLOYMENT] -n [NAMESPACE]
# 예시
resource:
requests:
cpu: "250m"
memory: "512Mi"
limits:
cpu: "500m"
memory: "1Gi"
- limits: 최대 자원 사용 제한
- requests: 최소 보장 자원
2-3. 수직 확장
수직 확장은 실행중인 Pod에 더 많은 리소스를 할당하는 것을 의미합니다.
✅ 수동 확장
Helm을 사용하는 경우 values.yaml 파일에서 리소스 설정 값을 조정해 수직 확장이 가능합니다.
helm show values <RELEASE_NAME>/<CHART_NAME> > values.yaml
vim values.yaml # 리소스 요청/제한 추가
helm upgrade <RELEASE_NAME> <CHART_NAME> -f values.yaml
* 쿠버네티스에서는 upgrade 명령어를 통해 배포하고, rollback 명령어를 통해 복구할 수 있습니다.
수평 확장에서 처럼 수직 확장도 부하에 따라 리소스를 자동으로 조정할 수 있습니다.
✅ 자동 확장 (VPA, Vertical Pod Autoscaler)
VPA를 설치하면 부하에 따라 Pod의 리소스가 자동으로 조정됩니다. 깃 레포지토리에서 소스 코드를 다운로드할 수 있습니다.
git clone https://github.com/kubernetes/autoscaler.git
cd autoscaler/vertical-pod-autoscaler/
./hack/vpa-up.sh
kubectl get pods -n kube-system # 확인
VPA 리소스 또한 YAML 파일에 정의해 적용합니다.
kubectl apply -f [FILENAME].yaml
kubectl describe vpa [FILENAME] --namespace [NAMESPACE] # 확인
*실제 운영 시 HPA와 VPA를 동시에 사용하면 충돌이 발생할 수 있으니 주의해야합니다.
3. 질문과 답변
Q1. ✋ Minikube 클러스터는 실제 Kubernetes 클러스터와 같은가요?
A. 동일한 리소스 타입과 쿠버네티스 컴포넌트를 사용한다는 점에서 기본 개념은 동일합니다. 다만, Minikube는 모든 구성이 단일 노드 내에서 실행된다는 점에서 차이가 있습니다.
Q2. ✋ HPA 사용 시 Pod IP가 자주 바뀌는데, 외부에서 어떻게 접근하나요?
A. 쿠버네티스의 Service 리소스를 사용하면, 특정 레이블의 Pod를 하나의 가상 IP로 묶을 수 있습니다. 이 IP는 파드가 교체되어도 유지됩니다.
Q3. ✋ Minikube에서도 여러 노드를 만들 수 있나요?
A. minikube node add 명령어를 통해 가능합니다. 단, 모든 노드가 하나의 VM에 속해 있어 실제 멀티 노드환경과는 다르며 고가용성(HA) 구현에는 제약이 있습니다.
Q4. ✋ Minikube 설치 시 Docker를 꼭 사용해야 하나요?
A. macOS 및 Windows에서는 Docker 또는 VM 환경이 필수입니다.
Linux에서는 --driver=none 옵션으로 설치할 수 있지만, 이 경우 다음과 같은 제약이 있습니다.
- 리소스 제한 없이 파드가 호스트 전체 리소스를 사용할 수 있음
- dashboard, mount, ssh 등의 일부 명령어가 작동하지 않음
5. 마무리
Minikube를 통해 로컬 환경에서 Kubernetes 클러스터를 구성하고 실습할 수 있었습니다. 특히 직접 서비스를 배포하고 HPA, VPA와 같은 자동 확장 기능이 어떻게 동작하는지 확인할 수 있었던 시간이었습니다. 다만 공식문서에도 나와있듯 Minikube는 학습과 테스트 용도로 적합하며, 실제 서비스 환경에서는 네트워크 구성, 리소스 관리, Kubernetes 오브젝트 운영 등에서 추가적인 어려움이 있을 것으로 예상됩니다. 이번 글이 도움이 되셨길 바랍니다. 감사합니다🙇♂️
minikube start
minikube is local Kubernetes, focusing on making it easy to learn and develop for Kubernetes. All you need is Docker (or similarly compatible) container or a Virtual Machine environment, and Kubernetes is a single command away: minikube start What you’ll
minikube.sigs.k8s.io