VictoriaMetrics Operator: VMAgent, VMSingle, VMServiceScrape

Published: 2026-03-06

VictoriaMetrics Operator — альтернатива Prometheus Operator. CRD у него аналогичные по смыслу (VMServiceScrape вместо ServiceMonitor, VMRule вместо PrometheusRule), но бэкенд хранения — VictoriaMetrics. Отсюда лучшее сжатие, устойчивость к высокой кардинальности и простое однопроцессное развёртывание.


Почему kube-prom-stack и VM Operator одновременно

На большинстве кластеров работает kube-prom-stack (ради Grafana и экосистемы Alertmanager). VictoriaMetrics — центральное долгосрочное хранилище: spoke-Prometheus делают remote_write в VMSingle на infra-кластере, обеспечивая 6 месяцев хранения без нагрузки на диски spoke-кластеров.

Архитектура:

  • Spoke-кластеры: kube-prom-stack → сбор метрик, алерты → remote_write в центральный VMSingle
  • Infra-кластер: VMSingle хранит исторические данные, Grafana запрашивает оба источника

VMSingle

yamlapiVersion: operator.victoriametrics.com/v1beta1
kind: VMSingle
metadata:
  name: victoria-metrics
  namespace: observability
spec:
  retentionPeriod: "6"  # months
  storage:
    accessModes:
      - ReadWriteOnce
    resources:
      requests:
        storage: 50Gi
    storageClassName: yc-network-ssd
  resources:
    requests:
      cpu: 500m
      memory: 1Gi
    limits:
      cpu: 2
      memory: 3Gi
  extraArgs:
    selfScrapeInterval: "10s"
    dedup.minScrapeInterval: "30s"

VMSingle — однопроцессное развёртывание: без Thanos, без compactor, без querier. Для 6 кластеров с ~100k активными сериями один узел справляется без проблем.

dedup.minScrapeInterval дедуплицирует семплы от нескольких реплик Prometheus, пишущих одни и те же серии. Задайте равным интервалу скрейпинга.


VMAgent

VMAgent заменяет Prometheus как скрейпер. Легче, умеет шардировать, отправляет только через remote_write — без query engine:

yamlapiVersion: operator.victoriametrics.com/v1beta1
kind: VMAgent
metadata:
  name: vmagent
  namespace: observability
spec:
  selectAllByDefault: true
  remoteWrite:
    - url: "http://victoria-metrics-victoria-metrics.observability.svc.cluster.local:8428/api/v1/write"
      queueConfig:
        capacity: 10000
        maxSamplesPerSend: 2000
  resources:
    requests:
      cpu: 200m
      memory: 256Mi

selectAllByDefault: true — VMAgent автоматически обнаруживает все VMServiceScrape и VMPodScrape в кластере.

У VMAgent есть встроенный WAL (write-ahead log): при недоступности удалённого эндпоинта он буферизует данные локально и отправляет их после восстановления соединения. Буфер по умолчанию — 1 час.


VMServiceScrape

Замена ServiceMonitor:

yamlapiVersion: operator.victoriametrics.com/v1beta1
kind: VMServiceScrape
metadata:
  name: apisix
  namespace: ingress-apisix
spec:
  selector:
    matchLabels:
      app.kubernetes.io/name: apisix
  endpoints:
    - port: prometheus
      interval: 30s
      path: /apm/prometheus
      metricRelabelConfigs:
        - sourceLabels: [__name__]
          action: keep
          regex: "apisix_.*"

Внутри оператор преобразует этот манифест в обычную конфигурацию скрейпинга Prometheus.


VMPodScrape

Для подов без Service:

yamlapiVersion: operator.victoriametrics.com/v1beta1
kind: VMPodScrape
metadata:
  name: my-app
  namespace: app
spec:
  selector:
    matchLabels:
      app: my-app
  podMetricsEndpoints:
    - port: metrics
      interval: 30s

VMRule для алертов

yamlapiVersion: operator.victoriametrics.com/v1beta1
kind: VMRule
metadata:
  name: node-alerts
  namespace: observability
spec:
  groups:
    - name: node
      rules:
        - alert: NodeDiskFull
          expr: |
            (node_filesystem_avail_bytes{mountpoint="/"} /
             node_filesystem_size_bytes{mountpoint="/"}) < 0.1
          for: 10m
          labels:
            severity: warning
          annotations:
            description: "Node {{ $labels.instance }} disk < 10%"

        - record: node:disk_usage:ratio
          expr: |
            1 - (node_filesystem_avail_bytes{mountpoint="/"} /
                 node_filesystem_size_bytes{mountpoint="/"})

Datasource для Grafana

yamldatasources:
  - name: VictoriaMetrics
    type: prometheus
    url: http://victoria-metrics-victoria-metrics.observability.svc.cluster.local:8428
    isDefault: false
    jsonData:
      timeInterval: "30s"

  - name: Local-Prometheus
    type: prometheus
    url: http://kube-prom-stack-prometheus.monitoring.svc.cluster.local:9090
    isDefault: true

Долгосрочные дашборды (30d, 90d) ходят в VictoriaMetrics, дашборды реального времени — в локальный Prometheus. Так диски spoke-Prometheus остаются небольшими.


Сравнение VictoriaMetrics vs Prometheus

Функция Prometheus VictoriaMetrics
Сжатие хранилища ~3–5x ~10–20x
Query engine PromQL MetricsQL (надмножество PromQL)
Долгосрочное хранение Нужен Thanos/Cortex Встроено
HA-режим Federation/Thanos VMCluster
Single binary Нет VMSingle

Для установок < 1M активных серий VMSingle проще и эффективнее по диску, чем Prometheus + Thanos.


Отладка

bashkubectl describe vmagent vmagent -n observability

kubectl port-forward -n observability svc/vmagent 8429:8429
curl -s http://localhost:8429/metrics | grep vm_remotewrite_queue

kubectl port-forward -n observability svc/victoria-metrics-victoria-metrics 8428:8428
curl -s 'http://localhost:8428/api/v1/query?query=up' | jq '.data.result | length'