ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 클러스터 전체 모니터링을 위한 VictoriaMetrics 설치 및 관리
    실제 경험과 인사이트를 AI와 함께 정리한 글 2025. 10. 21. 21:35

    VictoriaMetrics K8s Stack

    클러스터 전체 모니터링을 위한 VictoriaMetrics 설치 및 관리

    📊 아키텍처

    monitoring 네임스페이스 (Infrastructure Layer)
    ├── VictoriaMetrics Operator
    ├── VMSingle (메트릭 스토리지)
    ├── VMAgent (메트릭 수집 - 모든 네임스페이스)
    ├── VMAlert (알림 규칙 엔진)
    ├── Alertmanager (알림 관리)
    ├── Grafana (시각화)
    ├── Kube-State-Metrics (K8s 리소스 상태)
    └── Node Exporter (노드 메트릭)

    🎯 모니터링 범위

    클러스터 전체

    • ✅ 모든 네임스페이스의 Pod 메트릭
    • ✅ 모든 노드의 시스템 메트릭
    • ✅ Kubernetes 리소스 상태 (Deployment, StatefulSet, Service 등)

    imprun.dev 앱 모니터링

    • ✅ imprun-server, imprun-console (imprun-system 네임스페이스)
    • ✅ MongoDB, Redis (KubeBlocks)
    • ✅ 사용자 앱 런타임 (동적 생성)

    🚀 설치

    사전 요구사항

    1. Helm Repository 추가

      helm repo add vm https://victoriametrics.github.io/helm-charts/
      helm repo update
    2. cert-manager 및 ClusterIssuer (Grafana HTTPS용)

      • ClusterIssuer letsencrypt-cloudflare 필요

    설치 방법

    cd k8s/victoriametrics
    
    # 1. Dry-run으로 검증
    helm install vm vm/victoria-metrics-k8s-stack \
      --namespace monitoring \
      --create-namespace \
      --values values-production.yaml \
      --dry-run --debug
    
    # 2. 실제 설치
    helm install vm vm/victoria-metrics-k8s-stack \
      --namespace monitoring \
      --create-namespace \
      --values values-production.yaml \
      --timeout 10m

    📝 설치 확인

    Pod 상태 확인

    kubectl get pods -n monitoring
    
    # 예상 출력:
    # NAME                                           READY   STATUS    RESTARTS   AGE
    # vmalertmanager-vm-...                          2/2     Running   0          2m
    # vmalert-vm-...                                 2/2     Running   0          2m
    # vm-grafana-...                                 3/3     Running   0          2m
    # vm-kube-state-metrics-...                      1/1     Running   0          2m
    # vm-prometheus-node-exporter-...                1/1     Running   0          2m
    # vm-victoria-metrics-k8s-stack-operator-...     1/1     Running   0          2m
    # vm-victoria-metrics-operator-...               1/1     Running   0          2m
    # vmagent-vm-...                                 2/2     Running   0          2m
    # vmsingle-vm-...                                2/2     Running   0          2m

    VMSingle 데이터 수집 확인

    # VMSingle이 메트릭을 수집하는지 확인
    kubectl port-forward -n monitoring svc/vmsingle-vm-victoria-metrics-k8s-stack 8428:8428
    
    # 브라우저에서 열기: http://localhost:8428/vmui
    # 쿼리 예시: up

    Grafana 접속

    방법 1: Port Forward (로컬)

    kubectl port-forward -n monitoring svc/vm-grafana 3000:80
    
    # 브라우저: http://localhost:3000
    # 로그인: admin / admin

    방법 2: HTTPS (프로덕션)

    https://grafana.imprun.dev
    
    # 로그인: admin / admin (⚠️ 변경 필수!)

    🔧 업그레이드

    cd k8s/victoriametrics
    
    # Helm Repository 업데이트
    helm repo update
    
    # 업그레이드
    helm upgrade vm vm/victoria-metrics-k8s-stack \
      --namespace monitoring \
      --values values-production.yaml \
      --timeout 10m

    🗑️ 삭제

    # Helm release 삭제
    helm uninstall vm -n monitoring
    
    # PVC 삭제 (데이터 완전 삭제 시)
    kubectl delete pvc -n monitoring -l app.kubernetes.io/instance=vm
    
    # Namespace 삭제
    kubectl delete namespace monitoring

    📊 리소스 사용량

    운영 환경 (values-production.yaml)

    총 요청 (requests): 650m CPU, 1.8Gi Memory
    총 제한 (limits): 2.3 CPU, 4.2Gi Memory
    스토리지: 23GB (VMSingle 20GB + Grafana 2GB + Alertmanager 1GB)

    주요 컴포넌트별

    컴포넌트 CPU (requests) Memory (requests) Storage
    VMSingle 200m 1Gi 20Gi
    VMAgent 50m 128Mi -
    Grafana 50m 192Mi 2Gi
    Kube-State-Metrics 50m 128Mi -

    🔍 주요 메트릭 쿼리 (PromQL)

    시스템 메트릭

    # CPU 사용률 (노드별)
    100 - (avg by (instance) (irate(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

    Kubernetes 메트릭

    # Pod CPU 사용량
    sum(rate(container_cpu_usage_seconds_total{namespace="imprun-system"}[5m])) by (pod)
    
    # Pod 메모리 사용량
    sum(container_memory_working_set_bytes{namespace="imprun-system"}) by (pod)
    
    # Pod 재시작 횟수
    kube_pod_container_status_restarts_total{namespace="imprun-system"}

    imprun.dev 앱 메트릭

    # 앱별 CPU 사용량
    sum(rate(container_cpu_usage_seconds_total{namespace="imprun-system",pod=~".*-runtime-.*"}[5m])) by (pod)
    
    # 앱별 메모리 사용량
    sum(container_memory_working_set_bytes{namespace="imprun-system",pod=~".*-runtime-.*"}) by (pod)

    ⚙️ 커스터마이징

    Grafana 비밀번호 변경

    # values-production.yaml
    grafana:
      adminPassword: "your-secure-password"

    데이터 보존 기간 변경

    # values-production.yaml
    vmsingle:
      spec:
        retentionPeriod: "180"  # 90일 → 180일 (6개월)

    스크래핑 간격 조정

    # values-production.yaml
    vmagent:
      spec:
        scrapeInterval: 30s  # 60s → 30s (더 자주 수집)

    🐛 트러블슈팅

    VMAgent가 메트릭을 수집하지 못함

    # VMAgent 로그 확인
    kubectl logs -n monitoring -l app.kubernetes.io/name=vmagent --tail=100
    
    # 일반적인 원인:
    # 1. VMSingle URL 오류 → remoteWrite.url 확인
    # 2. RBAC 권한 부족 → ServiceAccount 확인
    # 3. 네트워크 정책 차단 → NetworkPolicy 확인

    Grafana에 데이터가 보이지 않음

    # Grafana 데이터소스 확인
    kubectl exec -n monitoring <grafana-pod> -- curl http://vmsingle-vm-victoria-metrics-k8s-stack.monitoring.svc:8428/api/v1/query?query=up
    
    # 정상: {"status":"success","data":...}
    # 실패: connection refused → VMSingle 상태 확인

    Certificate 발급 실패

    # Certificate 상태 확인
    kubectl describe certificate grafana-imprun-dev-tls -n monitoring
    
    # cert-manager 로그
    kubectl logs -n cert-manager -l app=cert-manager --tail=100

    📚 참고 문서

    💡 팁

    1. 대시보드 추천

    • Kubernetes / Compute Resources / Cluster: 클러스터 전체 리소스 사용량
    • Kubernetes / Compute Resources / Namespace (Pods): 네임스페이스별 Pod 리소스
    • Node Exporter Full: 노드 상세 메트릭

    2. 알림 설정

    Alertmanager를 통해 Slack, Email, PagerDuty 등으로 알림 전송 가능

    • values-production.yaml의 alertmanager.config 섹션 수정

    3. 백업 전략

    # VMSingle 데이터 백업
    kubectl exec -n monitoring <vmsingle-pod> -- tar czf /tmp/backup.tar.gz /storage
    kubectl cp monitoring/<vmsingle-pod>:/tmp/backup.tar.gz ./backup.tar.gz

    🔐 보안 권장사항

    1. Grafana 비밀번호 변경: 기본 admin/admin 즉시 변경
    2. Ingress TLS: 프로덕션에서는 반드시 HTTPS 사용
    3. RBAC 최소 권한: ServiceAccount 권한 최소화
    4. NetworkPolicy: 필요한 트래픽만 허용

    📈 성능 최적화

    메모리 부족 시

    vmsingle:
      spec:
        resources:
          limits:
            memory: 4Gi  # 2Gi → 4Gi

    디스크 부족 시

    vmsingle:
      spec:
        retentionPeriod: "30"  # 90일 → 30일
        storage:
          resources:
            requests:
              storage: 50Gi  # 20Gi → 50Gi
Designed by Tistory.