ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • VictoriaMetrics 운영 환경 업그레이드 가이드
    실제 경험과 인사이트를 AI와 함께 정리한 글 2025. 10. 21. 20:50

    VictoriaMetrics 운영 환경 업그레이드 가이드

    최소 설정 → 운영 환경 설정으로 업그레이드

    📋 변경 사항 요약

    컴포넌트 현재 (MVP) 변경 후 (운영) 이유
    Kube-State-Metrics ❌ 비활성화 ✅ 활성화 Pod 상태 모니터링 필수
    VMAlert ❌ 비활성화 ✅ 활성화 장애 알림 필요
    Alertmanager ❌ 비활성화 ✅ 활성화 알림 관리 필요
    VMSingle 보관 기간 1개월 3개월 트렌드 분석
    VMSingle 스토리지 10GB 20GB 3개월 보관
    VMSingle 메모리 512Mi-1Gi 1-2Gi 안정성
    총 리소스 (requests) 250m CPU, 912Mi 650m CPU, 1.8Gi +160%

    🔧 업그레이드 방법

    옵션 A: 다운타임 없는 업그레이드 (권장)

    기존 CRD를 수정하여 점진적으로 컴포넌트 추가

    # 1. Kube-State-Metrics 설치
    helm install kube-state-metrics prometheus-community/kube-state-metrics \
      --namespace monitoring \
      --set resources.requests.cpu=50m \
      --set resources.requests.memory=128Mi \
      --set resources.limits.cpu=200m \
      --set resources.limits.memory=256Mi
    
    # 2. VMSingle 업그레이드 (보관 기간 & 스토리지)
    kubectl edit vmsingle vm-victoria-metrics-k8s-stack -n monitoring
    # spec.retentionPeriod: "1" → "90"
    # spec.resources.limits.memory: 1Gi → 2Gi
    # spec.resources.requests.memory: 512Mi → 1Gi
    # spec.storage.resources.requests.storage: 10Gi → 20Gi
    
    # 3. VMAlert 추가
    kubectl apply -f - <<EOF
    apiVersion: operator.victoriametrics.com/v1beta1
    kind: VMAlert
    metadata:
      name: vm-victoria-metrics-k8s-stack
      namespace: monitoring
    spec:
      evaluationInterval: 30s
      datasource:
        url: http://vmsingle-vm-victoria-metrics-k8s-stack.monitoring.svc:8428
      notifier:
        url: http://vmalertmanager-vm-victoria-metrics-k8s-stack.monitoring.svc:9093
      resources:
        requests:
          cpu: 50m
          memory: 128Mi
        limits:
          cpu: 200m
          memory: 256Mi
      replicaCount: 1
    EOF
    
    # 4. Alertmanager 추가
    kubectl apply -f - <<EOF
    apiVersion: operator.victoriametrics.com/v1beta1
    kind: VMAlertmanager
    metadata:
      name: vm-victoria-metrics-k8s-stack
      namespace: monitoring
    spec:
      replicaCount: 1
      retention: 120h
      resources:
        requests:
          cpu: 25m
          memory: 64Mi
        limits:
          cpu: 100m
          memory: 128Mi
      storage:
        volumeClaimTemplate:
          spec:
            accessModes:
              - ReadWriteOnce
            resources:
              requests:
                storage: 1Gi
    EOF
    
    # 5. VMServiceScrape 추가 (Kube-State-Metrics 수집)
    kubectl apply -f - <<EOF
    apiVersion: operator.victoriametrics.com/v1beta1
    kind: VMServiceScrape
    metadata:
      name: kube-state-metrics
      namespace: monitoring
    spec:
      selector:
        matchLabels:
          app.kubernetes.io/name: kube-state-metrics
      endpoints:
        - port: http
          interval: 60s
    EOF
    
    # 6. 상태 확인
    kubectl get pods -n monitoring
    kubectl top pods -n monitoring

    옵션 B: Helm 차트 재설치 (다운타임 있음)

    기존 설정을 완전히 삭제하고 Helm으로 재설치

    # 1. 기존 리소스 백업 (Optional - 데이터 보존하려면)
    kubectl get vmsingle,vmagent,vmservicescrape -n monitoring -o yaml > backup.yaml
    
    # 2. 기존 리소스 삭제
    kubectl delete vmsingle,vmagent -n monitoring --all
    # ⚠️ VMSingle PVC는 보존됨 (데이터 유지)
    
    # 3. Helm 저장소 추가
    helm repo add vm https://victoriametrics.github.io/helm-charts/
    helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
    helm repo update
    
    # 4. Helm으로 재설치
    helm install victoria-metrics vm/victoria-metrics-k8s-stack \
      --namespace monitoring \
      --values victoriametrics-values-production.yaml \
      --timeout 10m
    
    # 5. 상태 확인
    kubectl get pods -n monitoring -w

    📊 업그레이드 후 확인 사항

    1. Pod 상태 확인

    kubectl get pods -n monitoring
    
    # 예상 Pod:
    # - vmsingle-vm-victoria-metrics-k8s-stack
    # - vmagent-vm-victoria-metrics-k8s-stack
    # - vmalert-vm-victoria-metrics-k8s-stack (신규)
    # - vmalertmanager-vm-victoria-metrics-k8s-stack (신규)
    # - vm-grafana
    # - vm-prometheus-node-exporter (4개)
    # - kube-state-metrics (신규)
    # - vm-victoria-metrics-operator

    2. 리소스 사용량 확인

    kubectl top pods -n monitoring
    
    # 예상 사용량:
    # VMSingle: ~400-600Mi (이전 398Mi에서 증가 예상)
    # VMAlert: ~50-100Mi (신규)
    # Alertmanager: ~30-50Mi (신규)
    # Kube-State-Metrics: ~80-150Mi (신규)

    3. Kube-State-Metrics 메트릭 수집 확인

    # VMSingle에 kube_pod_status_phase 메트릭이 있는지 확인
    kubectl port-forward -n monitoring svc/vmsingle-vm-victoria-metrics-k8s-stack 8428:8428 &
    curl -s 'http://localhost:8428/api/v1/query?query=kube_pod_status_phase' | jq
    
    # 결과에 데이터가 있어야 함

    4. VMAlert 상태 확인

    kubectl get vmalert -n monitoring
    # STATUS: operational
    
    # VMAlert가 규칙을 로드했는지 확인
    kubectl logs -n monitoring -l app.kubernetes.io/name=vmalert | grep "rules loaded"

    5. Alertmanager 설정 확인

    kubectl get vmalertmanager -n monitoring
    # STATUS: operational
    
    # Alertmanager UI 접속 (port-forward)
    kubectl port-forward -n monitoring svc/vmalertmanager-vm-victoria-metrics-k8s-stack 9093:9093 &
    # http://localhost:9093

    6. Grafana 대시보드 확인

    # Grafana에서 kube-state-metrics 대시보드 확인
    # https://grafana.imprun.dev
    # 1. Dashboards → Browse
    # 2. Kubernetes / Pods 대시보드 열기
    # 3. imprun-system 네임스페이스 선택
    # 4. Pod 상태가 표시되는지 확인

    🐛 트러블슈팅

    문제 1: VMSingle PVC 확장 실패

    증상:

    Failed to modify PVC: spec is immutable

    해결:

    # StorageClass가 volume expansion을 지원하는지 확인
    kubectl get sc -o json | jq '.items[] | {name: .metadata.name, allowVolumeExpansion: .allowVolumeExpansion}'
    
    # 지원하지 않는 경우: 새 PVC 생성 후 데이터 마이그레이션 필요
    # 1. VMSingle Pod 중지
    kubectl scale deploy vmsingle-vm-victoria-metrics-k8s-stack --replicas=0 -n monitoring
    
    # 2. 새 PVC 생성 (20GB)
    kubectl apply -f - <<EOF
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: vmsingle-new-pvc
      namespace: monitoring
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 20Gi
    EOF
    
    # 3. 임시 Pod로 데이터 복사
    # (복잡하므로 별도 문서 참조)

    문제 2: Kube-State-Metrics 메트릭이 수집되지 않음

    증상:

    curl 'http://localhost:8428/api/v1/query?query=kube_pod_status_phase'
    # {"data":{"result":[]}}  # 결과 없음

    확인:

    # 1. Kube-State-Metrics Pod가 Running인지
    kubectl get pods -n monitoring -l app.kubernetes.io/name=kube-state-metrics
    
    # 2. VMAgent가 Kube-State-Metrics를 발견했는지
    kubectl logs -n monitoring -l app.kubernetes.io/name=vmagent | grep kube-state-metrics
    
    # 3. VMServiceScrape가 생성되었는지
    kubectl get vmservicescrape -n monitoring kube-state-metrics

    해결:

    # VMServiceScrape 재생성
    kubectl delete vmservicescrape kube-state-metrics -n monitoring
    kubectl apply -f - <<EOF
    apiVersion: operator.victoriametrics.com/v1beta1
    kind: VMServiceScrape
    metadata:
      name: kube-state-metrics
      namespace: monitoring
    spec:
      selector:
        matchLabels:
          app.kubernetes.io/name: kube-state-metrics
      endpoints:
        - port: http
          interval: 60s
    EOF
    
    # VMAgent Pod 재시작
    kubectl delete pod -n monitoring -l app.kubernetes.io/name=vmagent

    문제 3: VMAlert가 Alertmanager를 찾지 못함

    증상:

    kubectl logs -n monitoring -l app.kubernetes.io/name=vmalert
    # ERROR: failed to send alerts to alertmanager: connection refused

    확인:

    # Alertmanager Service 존재 여부
    kubectl get svc -n monitoring | grep alertmanager
    
    # VMAlert 설정 확인
    kubectl get vmalert vm-victoria-metrics-k8s-stack -n monitoring -o yaml | grep notifier -A5

    해결:

    # VMAlert 설정 수정
    kubectl edit vmalert vm-victoria-metrics-k8s-stack -n monitoring
    # spec.notifier.url을 올바른 Service 이름으로 수정
    # url: "http://vmalertmanager-vm-victoria-metrics-k8s-stack.monitoring.svc:9093"

    📈 성능 모니터링

    리소스 사용량 추이

    # 1시간 후 리소스 사용량 확인
    kubectl top pods -n monitoring
    
    # 예상 증가량:
    # - 총 메모리: 835Mi → 1.5-2Gi (+80-140%)
    # - 총 CPU: 22m → 60-100m (+170-350%)

    메트릭 개수 증가

    # Kube-State-Metrics 추가 후 시계열 수 확인
    curl -s 'http://localhost:8428/api/v1/label/__name__/values' | jq '. | length'
    
    # 예상:
    # - 이전: ~500-1000 시계열
    # - 이후: ~2000-3000 시계열 (Kube-State-Metrics가 많은 메트릭 추가)

    ✅ 업그레이드 완료 체크리스트

    • Kube-State-Metrics Pod Running
    • VMAlert Pod Running
    • Alertmanager Pod Running
    • kube_pod_status_phase 메트릭 수집 확인
    • VMAlert 규칙 로드 확인
    • Alertmanager UI 접속 확인
    • Grafana 대시보드에서 Pod 상태 표시 확인
    • 리소스 사용량이 예상 범위 내 (총 메모리 <3Gi)
    • 모든 Pod가 CrashLoopBackOff 없이 안정적 동작

    📚 참고 자료

Designed by Tistory.