apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: minio-vpa
namespace: minio-operator
spec:
targetRef:
apiVersion: "apps/v1"
kind: StatefulSet
name: minio
updatePolicy:
updateMode: "Off"
resourcePolicy:
containerPolicies:
- containerName: "minio"
minAllowed:
cpu: "2"
memory: "4Gi"
maxAllowed:
cpu: "16"
memory: "64Gi"
controlledValues: RequestsAndLimits
---
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: spark-worker-vpa
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: spark-worker
updatePolicy:
updateMode: "Initial"
resourcePolicy:
containerPolicies:
- containerName: "spark-kubernetes-executor"
minAllowed:
cpu: "1"
memory: "2Gi"
controlledResources: ["cpu", "memory"]
---
helm install prometheus-adapter prometheus-community/prometheus-adapter \
--set prometheus.url=http://prometheus-service.monitoring.svc.cluster.local \
--set prometheus.port=9090
Gemini said
대규모 클러스터 운영 및 데이터 레이크하우스의 안정성을 고려하여, 주요 워크로드에 적용할 수 있는 VPA 설정 예시와 Prometheus 연동 아키텍처를 정리해 드립니다.
1. 주요 워크로드별 VPA 설정 예시 (YAML)
안정성이 중요한 환경에서는 VPA가 포드를 강제로 재시작하지 않도록 updateMode: "Off" 설정을 통해 권장 사양만 모니터링하는 것이 권장됩니다.
① MinIO AIStor (StatefulSet) 전용 VPA
스토리지 엔진인 MinIO는 리소스 변동에 민감하므로, 갑작스러운 재시작을 방지하기 위해 관찰 모드로 설정합니다.
YAML
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: minio-vpa
namespace: minio-operator
spec:
targetRef:
apiVersion: "apps/v1"
kind: StatefulSet
name: minio
updatePolicy:
updateMode: "Off"
resourcePolicy:
containerPolicies:
- containerName: "minio"
minAllowed:
cpu: "2"
memory: "4Gi"
maxAllowed:
cpu: "16"
memory: "64Gi"
controlledValues: RequestsAndLimits
② 데이터 분석 엔진 (예: Spark Executor / Trino Worker)
분석 워크로드는 작업량에 따라 메모리 사용량 변화가 큽니다. Initial 모드를 사용하면 포드가 새로 생성될 때만 VPA가 개입하여 적절한 리소스를 할당합니다.
YAML
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: spark-worker-vpa
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: spark-worker
updatePolicy:
updateMode: "Initial"
resourcePolicy:
containerPolicies:
- containerName: "spark-kubernetes-executor"
minAllowed:
cpu: "1"
memory: "2Gi"
controlledResources: ["cpu", "memory"]
2. Prometheus와 VPA Recommender 연동 방법
VPA Recommender는 기본적으로 Kubernetes Metrics API를 통해 데이터를 가져옵니다. 하지만 Metrics Server는 실시간 데이터만 보유하므로, 장기적인 추세를 반영한 정교한 추천을 받으려면 Prometheus와의 연동이 필수적입니다.
연동 아키텍처 구조
VPA Recommender -> Custom Metrics API (Prometheus Adapter) -> Prometheus
적용 단계
1) Prometheus Adapter 설치
Prometheus에 저장된 지표를 Kubernetes Metrics API 규격으로 변환해주는 어댑터가 필요합니다. Helm을 사용하는 경우 아래와 같이 설정할 수 있습니다.
Bash
helm install prometheus-adapter prometheus-community/prometheus-adapter \
--set prometheus.url=http://prometheus-service.monitoring.svc.cluster.local \
--set prometheus.port=9090
2) VPA Recommender 플래그 설정
VPA Recommender가 Metrics API를 통해 충분한 과거 데이터를 조회할 수 있도록 실행 옵션을 조정해야 합니다. VPA 배포 매니페스트의 recommender 컨테이너 인자에 다음 설정을 추가합니다.
--storage=prometheus: (지원되는 버전의 경우) 직접 프로메테우스를 바라보게 하거나,
일반적인 방식: Metrics Server 대신 Prometheus Adapter가 제공하는 API를 참조하도록 합니다. 이때 Recommender가 더 긴 시간의 지표를 보게 하려면 아래 인자를 조정합니다.
--recommendation-margin-fraction: 권장치에 여유분을 얼마나 둘 것인지 (기본 0.15)
--pod-recommendation-min-cpu-millicores: 최소 CPU 권장 단위
--pod-recommendation-min-memory-mb: 최소 메모리 권장 단위
3) 데이터 신뢰도 확보
VPA Recommender는 기본적으로 최근 8일간의 데이터를 분석합니다. Prometheus Adapter를 통해 이 데이터가 잘 전달되면, kubectl describe vpa <이름> 명령 시 Recommendation 항목에 과거 패턴이 반영된 Target 수치가 나타나게 됩니다.
운영 팁
300노드 이상의 환경에서는 모든 포드에 VPA를 거는 것보다 **리소스 소모가 큰 핵심 모듈(MinIO, DB, 분석 엔진)**에 먼저 Off 모드로 적용하여 1~2주간 데이터를 수집하는 것을 추천합니다. 이후 Grafana 대시보드에서 Actual Usage vs VPA Target을 비교 분석하면 최적의 튜닝 포인트를 잡을 수 있습니다.