Multi-cluster Prometheus: remote_write в централизованное хранилище

Published: 2026-05-10

В каждом кластере работает собственный Prometheus (через kube-prom-stack). Для долгосрочных трендов, кросс-кластерных сравнений и хранения метрик дольше, чем позволяет spoke-кластер, spoke-экземпляры Prometheus пишут через remote_write в центральный VictoriaMetrics на infra-кластере.

Конфигурация remote_write

Настройка живёт в values kube-prom-stack и применяется к каждому spoke-кластеру Kustomize-патчем:

yaml# patches/kube-prom-stack.yaml (окружение dev)
spec:
  values:
    prometheus:
      prometheusSpec:
        externalLabels:
          cluster: dev
          environment: dev
        remoteWrite:
          - url: "http://victoria-metrics.observability.infra.svc.cluster.local:8428/api/v1/write"
            queueConfig:
              capacity: 10000
              maxSamplesPerSend: 1000
              maxShards: 10
            writeRelabelConfigs:
              - sourceLabels: [__name__]
                regex: "(node_|container_|kube_|up|probe_).+"
                action: keep
        retention: 3d
        retentionSize: "10GB"

externalLabels.cluster: dev помечает каждую серию именем кластера — это важно для кросс-кластерных дашбордов, где нужна фильтрация по кластеру. retention: 3d держит spoke-хранилище компактным, поскольку исторические данные живут в VictoriaMetrics.

URL remote_write между кластерами

На YC-кластерах и on-prem k3s VictoriaMetrics недоступна через внутренний DNS (это другой кластер). Два варианта:

Вариант 1: опубликовать VictoriaMetrics через APISIX (проще)

yaml# ApisixRoute на infra
- name: vm-remote-write
  match:
    hosts:
      - vm-write.infra.test.antonnovikov.com
    paths:
      - /api/v1/write
  backends:
    - serviceName: victoria-metrics-victoria-metrics
      serviceNamespace: observability
      servicePort: 8428
yaml# URL remote_write в spoke patches
remoteWrite:
  - url: "https://vm-write.infra.test.antonnovikov.com/api/v1/write"

Вариант 2: WireGuard VPN между кластерами — spoke-кластеры подключаются к infra через VPN и обращаются к внутреннему ClusterIP напрямую.

writeRelabelConfigs для снижения трафика

Отправлять все серии Prometheus в центральное хранилище расточительно. writeRelabelConfigs фильтрует только самые полезные метрики:

yamlwriteRelabelConfigs:
  # Оставляем: инфраструктурные метрики
  - sourceLabels: [__name__]
    regex: "(node_|container_|kube_state_|up|probe_|kubelet_).+"
    action: keep
  # Отбрасываем: высококардинальные шумные метрики
  - sourceLabels: [__name__]
    regex: "(go_gc_|go_memstats_|process_).+"
    action: drop
  # Отбрасываем: метрики короткоживущих подов (заменяем recording rules)
  - sourceLabels: [__name__, pod]
    regex: "container_.+;.+-[a-z0-9]{10}-.+"
    action: drop

Это снижает трафик remote_write на ~60–70% по сравнению с отправкой всего подряд.

Кросс-кластерный дашборд в Grafana

Когда все кластеры пишут в VictoriaMetrics, один дашборд в Grafana позволяет сравнивать их:

sum by (cluster) (
  rate(container_cpu_usage_seconds_total{container!=""}[5m])
)

Добавляем template-переменную для фильтрации:

json{
  "name": "cluster",
  "type": "query",
  "query": "label_values(up, cluster)",
  "datasource": "VictoriaMetrics"
}

Переменная заполняется из лейбла cluster, который добавляет externalLabels.

Проверка работоспособности remote_write

bash# На spoke: проверяем очередь remote_write
kubectl port-forward -n observability svc/prometheus-operated 9090:9090
# Затем: http://localhost:9090/graph?g0.expr=prometheus_remote_storage_queue_length

# На infra: проверяем скорость приёма в VictoriaMetrics
kubectl port-forward -n observability svc/victoria-metrics-victoria-metrics 8428:8428
# Затем: http://localhost:8428/api/v1/query?query=sum(rate(vm_rows_inserted_total[5m]))

Ошибки remote_write отражаются в prometheus_remote_storage_failed_samples_total. Устойчивое ненулевое значение означает, что центральный VictoriaMetrics недоступен или отклоняет записи.


Срок хранения и размер хранилища VictoriaMetrics

VictoriaMetrics на infra-кластере хранит метрики от всех spoke. Настройки:

yaml# values HelmRelease VictoriaMetrics
server:
  retentionPeriod: 90d
  persistentVolume:
    size: 50Gi
  resources:
    requests:
      memory: 2Gi
      cpu: 500m
    limits:
      memory: 4Gi

При 3 spoke-кластерах, пишущих ~500k samples/min каждый, 90 дней помещается в ~30–40Gi. VictoriaMetrics сжимает данные значительно лучше, чем Prometheus TSDB (~10x), поэтому реальное потребление диска намного ниже.


Аутентификация для remote_write

Если VictoriaMetrics доступна из интернета (через APISIX), включить basic auth:

yaml# VictoriaMetrics: включить basic auth
server:
  extraArgs:
    httpAuth.username: "prom-writer"
    httpAuth.password: "strong-password"
yaml# Spoke Prometheus remote_write
remoteWrite:
  - url: "https://vm-write.infra.test.example.com/api/v1/write"
    basicAuth:
      username:
        name: vm-remote-write-secret
        key: username
      password:
        name: vm-remote-write-secret
        key: password

Секрет — SealedSecret, закоммиченный в spoke overlay.


Алертинг на задержку remote_write

PrometheusRule для алерта при росте очереди remote_write:

yaml- alert: RemoteWriteQueueFull
  expr: >
    prometheus_remote_storage_queue_length /
    prometheus_remote_storage_queue_capacity > 0.8
  for: 10m
  labels:
    severity: warning
  annotations:
    summary: "Очередь remote_write > 80% на {{ $labels.cluster }}"
    description: "VictoriaMetrics может быть недоступна или работать медленно"