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'