-
VictoriaMetrics K8s Stack 설치 가이드실제 경험과 인사이트를 AI와 함께 정리한 글 2025. 10. 21. 20:52
VictoriaMetrics K8s Stack 설치 가이드
개요
imprun.dev 플랫폼의 모니터링 인프라로 VictoriaMetrics를 선택했습니다.
선택 이유
- 리소스 효율성: Prometheus 대비 메모리/CPU 사용량 50% 이하
- 높은 성능: 쿼리 속도 7배 빠름, 압축률 높음 (장기 보존 비용 절감)
- Prometheus 호환: PromQL, Grafana, ServiceMonitor 등 기존 생태계 활용
- 단순한 운영: VMSingle(단일 노드)로 시작, 필요 시 VMCluster로 확장
설치된 구성 요소
monitoring 네임스페이스 ├── VictoriaMetrics Operator # CRD 관리 ├── VMSingle # 메트릭 스토리지 (단일 노드) ├── VMAgent # 메트릭 수집 에이전트 ├── Grafana # 시각화 대시보드 └── Prometheus Node Exporter # 노드 메트릭 수집 (각 노드에 DaemonSet)비활성화된 컴포넌트 (리소스 절약):
- VMAlert (알림 규칙 엔진)
- VMAlertmanager (알림 관리자)
- Kube-State-Metrics (쿠버네티스 리소스 메트릭)
설치 방법
1. Helm Repository 추가
helm repo add vm https://victoriametrics.github.io/helm-charts/ helm repo update2. 설치
cd k8s # 최소 사양 환경 (4코어, 24GB, 100GB) helm install vm vm/victoria-metrics-k8s-stack \ --namespace monitoring \ --create-namespace \ --values victoriametrics-values-minimal.yaml \ --timeout 15m \ --wait3. 설치 확인
# Pod 상태 확인 kubectl get pods -n monitoring # 기대 출력: # NAME READY STATUS RESTARTS AGE # vm-grafana-xxx 2/2 Running 0 1m # vm-prometheus-node-exporter-xxx (각 노드별) 1/1 Running 0 1m # vm-victoria-metrics-operator-xxx 1/1 Running 0 1m # vmagent-vm-victoria-metrics-k8s-stack-xxx 2/2 Running 0 1m # vmsingle-vm-victoria-metrics-k8s-stack-xxx 1/1 Running 0 1m # 리소스 사용량 확인 kubectl top pods -n monitoring리소스 사용량
예상 리소스 (최소 사양 기준)
컴포넌트 CPU (requests) CPU (limits) Memory (requests) Memory (limits) VM Operator 25m 100m 64Mi 128Mi VMSingle 100m 500m 512Mi 1Gi VMAgent 50m 200m 128Mi 256Mi Grafana 50m 300m 192Mi 384Mi Node Exporter 25m (per node) 50m 16Mi 32Mi 총합 250m 1150m 912Mi 1.8Gi 스토리지
- VMSingle: 10Gi (메트릭 데이터, 1개월 보존)
- Grafana: 2Gi (대시보드 설정)
- 총 12Gi
Grafana 접근
로컬 접근 (Port Forward)
kubectl port-forward -n monitoring svc/vm-grafana 3000:80브라우저에서
http://localhost:3000접속- Username:
admin - Password:
admin(⚠️ 반드시 변경 필요!)
프로덕션 접근 (Ingress)
victoriametrics-values-minimal.yaml에서 Ingress 활성화:grafana: ingress: enabled: true ingressClassName: nginx hosts: - grafana.imprun.dev tls: - secretName: grafana-tls hosts: - grafana.imprun.devcert-manager를 사용한 TLS 인증서 자동 발급:
grafana: ingress: annotations: cert-manager.io/cluster-issuer: "letsencrypt-cloudflare"메트릭 수집 설정
imprun-server 메트릭 노출
imprun-server에서 Prometheus 메트릭을 노출하도록 설정:
1. NestJS 메트릭 라이브러리 설치
cd server pnpm add @willsoto/nestjs-prometheus prom-client2. Prometheus 모듈 추가
// server/src/app.module.ts import { PrometheusModule } from '@willsoto/nestjs-prometheus'; @Module({ imports: [ PrometheusModule.register({ defaultMetrics: { enabled: true, }, path: '/metrics', // /metrics 엔드포인트 }), // ... 기타 모듈 ], }) export class AppModule {}3. ServiceMonitor 생성
# deploy/helm/imprun-server/templates/servicemonitor.yaml apiVersion: v1 kind: Service metadata: name: {{ include "imprun-server.fullname" . }}-metrics labels: {{- include "imprun-server.labels" . | nindent 4 }} spec: ports: - name: metrics port: 3000 targetPort: 3000 selector: {{- include "imprun-server.selectorLabels" . | nindent 4 }} --- apiVersion: operator.victoriametrics.com/v1beta1 kind: VMServiceScrape metadata: name: {{ include "imprun-server.fullname" . }} labels: {{- include "imprun-server.labels" . | nindent 4 }} spec: selector: matchLabels: {{- include "imprun-server.selectorLabels" . | nindent 6 }} endpoints: - port: metrics path: /metrics interval: 30s자동 발견 확인
VMAgent가 자동으로 ServiceMonitor를 발견하여 메트릭을 수집합니다:
# VMAgent 로그 확인 kubectl logs -n monitoring -l app.kubernetes.io/name=vmagent # VMSingle에서 메트릭 확인 kubectl port-forward -n monitoring svc/vmsingle-vm-victoria-metrics-k8s-stack 8429:8429 # 브라우저: http://localhost:8429/vmui # 쿼리 예시: up{job="imprun-server"}주요 PromQL 쿼리
시스템 메트릭
# CPU 사용률 (노드별) 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) # 메모리 사용률 (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 # 디스크 사용률 (1 - (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"})) * 100애플리케이션 메트릭
# HTTP 요청 속도 (초당) rate(http_requests_total[5m]) # HTTP 응답 시간 (p95) histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])) # 에러율 rate(http_requests_total{status=~"5.."}[5m]) / rate(http_requests_total[5m])대시보드
기본 대시보드
설치 시 자동으로 포함되는 대시보드:
- Node Exporter Full: 노드 하드웨어 메트릭 (CPU, 메모리, 디스크, 네트워크)
- VictoriaMetrics: VMSingle, VMAgent 상태 모니터링
- Kubernetes Cluster: Pod, Deployment, Service 메트릭
커스텀 대시보드 추가
Grafana UI에서:
- + → Import
- Grafana.com에서 대시보드 ID 입력 (예: 13770 - VictoriaMetrics Single)
- Data Source: VictoriaMetrics 선택
- Import
알림 설정 (선택적)
리소스가 충분하면 VMAlert 활성화:
# victoriametrics-values-minimal.yaml vmalert: enabled: true spec: datasource: url: "http://vmsingle-vm-victoria-metrics-k8s-stack.monitoring.svc:8429" notifier: url: "http://vmalertmanager-vm-victoria-metrics-k8s-stack.monitoring.svc:9093" resources: limits: cpu: 200m memory: 256Mi requests: cpu: 50m memory: 128Mi alertmanager: enabled: true config: global: slack_api_url: 'YOUR_SLACK_WEBHOOK_URL' route: receiver: 'slack' receivers: - name: 'slack' slack_configs: - channel: '#alerts' title: '[{{ .Status | toUpper }}] {{ .GroupLabels.alertname }}' text: '{{ range .Alerts }}{{ .Annotations.summary }}\n{{ end }}'유지보수
업그레이드
# 차트 업데이트 helm repo update # 새 버전 확인 helm search repo vm/victoria-metrics-k8s-stack --versions | head -5 # 업그레이드 (dry-run) helm upgrade vm vm/victoria-metrics-k8s-stack \ -n monitoring \ -f victoriametrics-values-minimal.yaml \ --dry-run --debug # 실제 업그레이드 helm upgrade vm vm/victoria-metrics-k8s-stack \ -n monitoring \ -f victoriametrics-values-minimal.yaml \ --wait백업
# VMSingle 데이터 백업 kubectl exec -n monitoring vmsingle-vm-victoria-metrics-k8s-stack-xxx -- \ /victoria-metrics-prod \ -snapshotCreateURL=http://localhost:8428/snapshot/create # Grafana 대시보드 백업 kubectl get configmap -n monitoring -l grafana_dashboard=1 -o yaml > grafana-dashboards-backup.yaml삭제
# Helm release 삭제 helm uninstall vm -n monitoring # PVC 수동 삭제 (데이터 삭제됨!) kubectl delete pvc -n monitoring --all # Namespace 삭제 kubectl delete namespace monitoring트러블슈팅
VMAgent가 메트릭을 수집하지 못함
# VMAgent 로그 확인 kubectl logs -n monitoring -l app.kubernetes.io/name=vmagent # ServiceMonitor 확인 kubectl get vmservicescrape -n monitoring kubectl get vmservicescrape -n imprun-system # imprun-server가 있는 네임스페이스 # VMAgent 설정 확인 (selectAllByDefault: true인지) kubectl get vmagent -n monitoring vm-victoria-metrics-k8s-stack -o yaml | grep selectAllByDefaultGrafana 대시보드에 데이터가 없음
# VictoriaMetrics 데이터소스 확인 kubectl port-forward -n monitoring svc/vmsingle-vm-victoria-metrics-k8s-stack 8429:8429 # 브라우저: http://localhost:8429/vmui # 쿼리: up (모든 타겟 확인) # Grafana에서 데이터소스 테스트 # Configuration → Data Sources → VictoriaMetrics → Test디스크 부족
# 메트릭 보존 기간 단축 kubectl edit vmsingle -n monitoring vm-victoria-metrics-k8s-stack # spec.retentionPeriod: "1" → "0.5" (2주) # 또는 PVC 확장 kubectl edit pvc -n monitoring vmsingle-vm-victoria-metrics-k8s-stack # spec.resources.requests.storage: 10Gi → 20Gi참고 자료
'실제 경험과 인사이트를 AI와 함께 정리한 글' 카테고리의 다른 글
Helm 차트 관리 Best Practices: Umbrella Chart부터 Secret 관리까지 (0) 2025.10.22 클러스터 전체 모니터링을 위한 VictoriaMetrics 설치 및 관리 (0) 2025.10.21 victoria-metrics-k8s-stack vs victoria-metrics-single (0) 2025.10.21 VictoriaMetrics 운영 환경 업그레이드 가이드 (0) 2025.10.21 Prometheus vs VictoriaMetrics 비교 분석 (0) 2025.10.21