1---2name: victoriametrics-operator3description: Use when creating or managing VictoriaMetrics Operator CRDs — VMAgent, VMSingle, VMCluster, VMAlert, VMAlertmanager, VMAuth, VMUser, VMServiceScrape, VMPodScrape, VMRule, VMProbe, VMNodeScrape, VMScrapeConfig, VMStaticScrape, VMAlertmanagerConfig, VLogs, VLAgent, VLCluster, VMDistributed.4---56# VictoriaMetrics Operator CRDs78Helm chart: `oci://ghcr.io/victoriametrics/helm-charts/victoria-metrics-operator` 9Latest chart: **0.63.1** | API: `v1beta1` (metrics), `v1` (logs)1011All CRDs are namespaced. Operator must be installed with `crds.enabled=true keep=true` to retain CRDs on chart uninstall.1213## CRD Reference1415### Metrics — Storage1617| CRD | API | Purpose | Key Fields |18|-----|-----|---------|------------|19| **VMSingle** | `v1beta1` | Single-node metrics storage. Good for small-medium scale. Vertical scaling. | `retentionPeriod`, `storage`, `extraArgs`, `dedup.minScrapeInterval`, `nodeSelector`, `resources`, `securityContext`, `image.tag`, `license` |20| **VMCluster** | `v1beta1` | Multi-node cluster with vminsert/vmselect/vmstorage. For large scale, multi-tenant. | `vmstorage` (replicationFactor, dedup), `vmselect`, `vminsert`, `serviceScrape`, `topologySpreadConstraints` |2122### Metrics — Collection2324| CRD | API | Purpose | Key Fields |25|-----|-----|---------|------------|26| **VMAgent** | `v1beta1` | Metrics scraper/collector — pulls from scrape targets, pushes to remote storage. Supports Deployment, StatefulSet, or DaemonSet mode. | `remoteWrite[]`, `selectAllByDefault`, `serviceScrapeSelector`, `podScrapeSelector`, `nodeScrapeNamespaceSelector`, `daemonSetMode`, `hostNetwork`, `inlineScrapeConfig`, `scrapeInterval`, `scrapeClasses[]`, `additionalScrapeConfigs` |2728### Metrics — Scrape Configuration2930| CRD | API | Purpose | Key Fields |31|-----|-----|---------|------------|32| **VMServiceScrape** | `v1beta1` | Scrape targets from Service endpoints. Drop-in replacement for Prometheus ServiceMonitor. | `selector.matchLabels`, `endpoints[]` (port, interval, path, scheme, tlsConfig, basicAuth), `namespaceSelector` (any:true) |33| **VMPodScrape** | `v1beta1` | Scrape targets from Pods directly (no Service needed). | `selector.matchLabels`, `podMetricsEndpoints[]`, `namespaceSelector` |34| **VMNodeScrape** | `v1beta1` | Scrape targets from all nodes in cluster. Useful for node_exporter. | `selector`, `endpoints[]` |35| **VMStaticScrape** | `v1beta1` | Static scrape targets with known addresses. | `targets[]` (static address list) |36| **VMProbe** | `v1beta1` | Probe configuration for blackbox-exporter style checks. | `endpoint` (host, port, scheme), `module`, `targets` (static, ingress, prometheusDiscovery) |37| **VMScrapeConfig** | `v1beta1` | Custom scrape config with full Prometheus service discovery support (consul, nomad, ec2, gce, azure, etc.). | `scrapeConfig` (inline YAML), `sdConfigs` |3839### Alerting4041| CRD | API | Purpose | Key Fields |42|-----|-----|---------|------------|43| **VMAlert** | `v1beta1` | Alerting/recording rules engine — evaluates rules against datasource, sends alerts to notifier. | `datasource.url`, `remoteWrite.url`, `remoteRead.url`, `notifier.url`, `evaluationInterval`, `selectAllByDefault`, `ruleSelector`, `ruleNamespaceSelector` |44| **VMAlertmanager** | `v1beta1` | Alert notification dispatcher — handles dedup, grouping, silencing, routing. | `replicaCount`, `configRawYaml` (alertmanager YAML config), `configSecret`, `nodeSelector`, `resources` |45| **VMAlertmanagerConfig** | `v1beta1` | Alertmanager routing config CRD. Defines routes, receivers, time intervals, mute time intervals, inhibition rules. | `route`, `receivers[]`, `timeIntervals[]`, `muteTimeIntervals[]`, `inhibitRules[]` |46| **VMRule** | `v1beta1` | Alerting and recording rule definitions. | `groups[].rules[]` (alert, expr, for, labels, annotations) |4748### Auth4950| CRD | API | Purpose | Key Fields |51|-----|-----|---------|------------|52| **VMAuth** | `v1beta1` | Auth proxy/router — routes requests to backend VM components based on path/user. | `userSelector`, `userNamespaceSelector`, `unauthorizedAccessSpec`, `extraArgs` |53| **VMUser** | `v1beta1` | User definition for VMAuth. Each user gets a generated or static password. | `username`, `password`/`generatePassword`, `targetRefs[]` (crd.kind, crd.name, crd.namespace, paths[]), `bearerToken` |5455### Logs (API `v1`)5657| CRD | API | Purpose | Key Fields |58|-----|-----|---------|------------|59| **VLSingle** | `v1` | Single-node VictoriaLogs storage. | `retentionPeriod`, `storage`, `nodeSelector`, `resources`, `extraArgs`, `removeAnnotations` |60| **VLAgent** | `v1` | Log collector — scrapes K8s pod logs via k8sCollector, ships to VLSingle. | `remoteWrite[]`, `k8sCollector` (enabled, includePodLabels, excludeFilter), `remoteWriteSettings`, `image.tag` |61| **VLCluster** | `v1` | Multi-node VictoriaLogs cluster (vlinsert, vlselect, vlstorage). | `vlstorage`, `vlselect`, `vlinsert`, `replicationFactor` |6263### Advanced6465| CRD | API | Purpose |66|-----|-----|---------|67| **VMDistributed** | `v1beta1` | Distributed setup across zones — manages VMAgent, VMCluster, VMAlert, VMAlertmanager, VMAuth per zone. Automates multi-zone deployment. |68| **VMAnomaly** | `v1beta1` | Anomaly detection engine (vmanomaly) — ML-based anomaly detection for metrics. |6970## Common Patterns7172### VMAgent — DaemonSet + HostNetwork (Talos)7374VMAgent runs on every node, uses host networking (no CNI dependency for scraping):7576```yaml77apiVersion: operator.victoriametrics.com/v1beta178kind: VMAgent79metadata:80 name: vmagent81spec:82 selectAllByDefault: true83 serviceScrapeNamespaceSelector: {}84 podScrapeNamespaceSelector: {}85 daemonSetMode: true86 hostNetwork: true87 dnsPolicy: ClusterFirstWithHostNet88 remoteWrite:89 - url: http://vmsingle:8428/api/v1/write90 inlineScrapeConfig: |91 - job_name: default-pods92 kubernetes_sd_configs:93 - role: pod94```9596### VMSingle — Storage with Dedup9798```yaml99apiVersion: operator.victoriametrics.com/v1beta1100kind: VMSingle101metadata:102 name: vmetrics103spec:104 retentionPeriod: "30d"105 storage:106 storageClassName: ceph-block107 resources:108 requests:109 storage: 50Gi110 extraArgs:111 dedup.minScrapeInterval: 30s112 memory.allowedPercent: "60"113 nodeSelector:114 kubernetes.io/hostname: worker-01115```116117### VMServiceScrape — Auto-Discover Service118119```yaml120apiVersion: operator.victoriametrics.com/v1beta1121kind: VMServiceScrape122metadata:123 name: my-app124spec:125 selector:126 matchLabels:127 app.kubernetes.io/name: my-app128 endpoints:129 - port: http130 interval: 30s131```132133### VMAlert + VMRule — Alerting Pipeline134135```yaml136apiVersion: operator.victoriametrics.com/v1beta1137kind: VMAlert138metadata:139 name: vmalert140spec:141 datasource:142 url: http://vmsingle:8428143 notifier:144 url: http://vmalertmanager:9093145 evaluationInterval: 20s146 selectAllByDefault: true147---148apiVersion: operator.victoriametrics.com/v1beta1149kind: VMRule150metadata:151 name: alerts152spec:153 groups:154 - name: k8s155 rules:156 - alert: InstanceDown157 expr: up == 0158 for: 1m159 labels:160 severity: critical161```162163### VLogs + VLAgent — Log Pipeline164165```yaml166apiVersion: operator.victoriametrics.com/v1167kind: VLSingle168metadata:169 name: vlogs170spec:171 retentionPeriod: "30d"172 storage:173 storageClassName: ceph-block174 resources:175 requests:176 storage: 30Gi177---178apiVersion: operator.victoriametrics.com/v1179kind: VLAgent180metadata:181 name: vlagent182spec:183 remoteWrite:184 - url: http://vlsingle:9428/insert/native185 k8sCollector:186 enabled: true187 includePodLabels: true188```189190### VMUser + VMAuth — Access Control191192```yaml193apiVersion: operator.victoriametrics.com/v1beta1194kind: VMAuth195metadata:196 name: vmauth197spec:198 userNamespaceSelector: {}199 userSelector: {}200---201apiVersion: operator.victoriametrics.com/v1beta1202kind: VMUser203metadata:204 name: grafana205spec:206 username: grafana207 generatePassword: true208 targetRefs:209 - crd:210 kind: VMSingle211 name: vmetrics212 namespace: monitoring213 paths:214 - "/select/.*"215 - "/vmui.*"216```217218## Quick Reference219220| Need | Use CRD |221|------|---------|222| Store metrics | VMSingle or VMCluster |223| Scrape metrics from services | VMServiceScrape |224| Scrape metrics from pods directly | VMPodScrape |225| Scrape metrics from nodes | VMNodeScrape |226| Probe endpoints (blackbox) | VMProbe |227| Custom scrape configs | VMScrapeConfig |228| Alert rules | VMRule |229| Evaluate rules & send alerts | VMAlert |230| Route/group/silence alerts | VMAlertmanager + VMAlertmanagerConfig |231| Auth proxy with user mgmt | VMAuth + VMUser |232| Store logs | VLSingle or VLCluster |233| Collect K8s pod logs | VLAgent |234| Multi-zone HA | VMDistributed |235| ML anomaly detection | VMAnomaly |236237## Common Mistakes238239- **Scrape config not picked up** — VMAgent uses selectors (`serviceScrapeSelector`, `podScrapeSelector`). If `selectAllByDefault: true` is not set, must match labels. Empty `{}` selectors match all.240- **VMSingle dedup not set** — Without `dedup.minScrapeInterval`, HA VMAgent sends duplicate data. Set on VMSingle `extraArgs`.241- **VMServiceScrape role deprecated** — `endpointslices` role is deprecated as of v0.67.0. Use `endpointslice` instead.242- **VMAgent DaemonSet on Talos** — Use `daemonSetMode: true` + `hostNetwork: true`. No CNI needed. Set `dnsPolicy: ClusterFirstWithHostNet`.243- **VMAgent hostNetwork port conflict** — Default VMAgent port is `8429`. Explicitly set `port: "8429"` to avoid conflicts.244- **VMAgent nodes/proxy RBAC** — Scraping K8s API (/api/v1/nodes/...) needs `nodes/proxy` ClusterRole.245- **Alertmanager configRawYaml vs configSecret** — Use `configRawYaml` for inline config (simple). Use `configSecret` for complex/versioned configs.246- **VLAgent image tag** — Must set `image.tag` explicitly; operator may not default to latest. Defaults may lag.247- **VMAuth user path patterns** — Use regex paths (`"/select/.*"`), not globs. Test with target service.248- **Prometheus CRD compatibility** — VM Operator can convert `ServiceMonitor`/`PodMonitor`/`PrometheusRule`/`Probe`/`ScrapeConfig` from prometheus-operator. Set `-controller.disableReconcileFor` to disable unwanted converters.