在 Kubernetes 上通过 VictoriaMetrics Cluster 与 Helm 构建高可用监控方案

📅 发布时间:2026/9/14 19:42:59
在 Kubernetes 上通过 VictoriaMetrics Cluster 与 Helm 构建高可用监控方案
在 Kubernetes 上通过 VictoriaMetrics Cluster 与 Helm 构建高可用监控方案【免费下载链接】VictoriaMetricsVictoriaMetrics: fast, cost-effective monitoring solution and time series database项目地址: https://gitcode.com/GitHub_Trending/vi/VictoriaMetrics本指南基于 docs/guides/k8s-ha-monitoring-via-vm-cluster/README.md 展开面向希望在 Kubernetes 中部署生产级高可用HA时序监控平台的工程师。文章将以 VictoriaMetrics 集群版vminsert / vmstorage / vmselect 三组件为核心通过 Helm 安装配置副本数与复制因子并用 vmagent 结合 Kubernetes 服务发现采集集群自身的指标读完你将掌握如何配置replicationFactor与dedup.minScrapeInterval实现数据双副本冗余如何通过主动停掉一个vmstorage节点验证故障切换能力以及如何解读查询响应的isPartial字段判断结果完整性。概述VictoriaMetrics 集群版的高可用原理VictoriaMetrics 集群版将时序数据库拆分为三个相互独立、可水平扩展的服务组件对应源码目录 app/vminsert、app/vmstorage、app/vmselectvminsert接收写入的指标并通过一致性哈希consistent hashing按指标名与标签将数据分发到各个vmstorage节点vmstorage存储原始数据按时间范围与标签过滤后响应查询vmselect执行查询跨所有配置的vmstorage节点拉取数据并聚合返回。在集群版中实现高可用的关键手段是数据复制replication。官方文档 Cluster-VictoriaMetrics.md 明确指出在vminsert上通过-replicationFactorN开启复制后每个写入的样本都会在N个不同的vmstorage节点上各存一份只要某条时间序列至少有一个副本可达数据就始终可用。换言之复制因子为 2 时集群可以容忍任意 1 个vmstorage节点宕机而不丢数据。本指南把replicationFactor配置为2这意味着每条摄入的数据点都会被写入两个不同的vmstoragePod因此存储用量约为非复制集群的两倍——这是为高可用付出的必要代价。复制带来一个必须处理的副作用由于同一份样本存在两份副本vmselect查询时会读回同一时间点的两个拷贝导致sum、count等聚合运算结果被翻倍。为此必须在vmselect上启用去重de-duplication把同一抓取间隔内的副本折叠为单个样本。集群版文档特别强调见 Cluster-VictoriaMetrics.md开启复制时vmselect必须传入-dedup.minScrapeInterval1ms如果数据来自多台配置完全相同的 vmagent/Prometheus 实例则应将此参数设为抓取配置中的scrape_interval。从源码看去重逻辑实现在 lib/storage/dedup.goSetDedupInterval会设置全局去重间隔毫秒DeduplicateSamples会移除时间戳彼此间距小于该间隔的样本保留每个离散间隔内最后一条。而dedup.minScrapeInterval这个命令行 flag 定义在 app/vmstorage/main.go由 vmstorage 在启动时通过storage.SetDedupInterval(*minScrapeInterval)生效。因此当你通过 Helm values 把该参数传给vmselect时实际作用链是vmselect将参数透传至查询路径最终在读取副本样本时执行上述折叠逻辑。前置条件本指南在 GKE 集群v1.35上验证通过但同样适用于任何 Kubernetes 集群例如 Amazon EKS 或本地自建集群。开始前请确保环境具备以下工具一个可用的 Kubernetes 集群Helmkubectljq用于格式化查询输出。注意以下所有命令默认在 default 命名空间执行如需其他命名空间请自行在命令中追加-n namespace。1. 添加 VictoriaMetrics Helm 仓库执行以下命令添加并更新 VictoriaMetrics 的 Helm 仓库helm repo add vm https://victoriametrics.github.io/helm-charts/ helm repo update然后验证图表是否可用helm search repo vm/正常情况下你会看到类似如下的图表列表NAME CHART VERSION APP VERSION DESCRIPTION vm/victoria-metrics-cluster 0.35.0 v1.136.0 VictoriaMetrics Cluster version - high-performa... vm/victoria-metrics-agent 0.32.0 v1.136.0 VictoriaMetrics Agent - collects metrics from v... vm/victoria-metrics-common 0.0.46 VictoriaMetrics Common - contains shared templa... ...(list continues)...其中vm/victoria-metrics-cluster是本指南要使用的集群版图表vm/victoria-metrics-agent将用于部署 vmagent 采集器。2. 从 Helm 图表安装 VictoriaMetrics ClusterHA 模式2.1 编写高可用 values 文件创建victoria-metrics-cluster-values.yml写入以下配置cat EOF victoria-metrics-cluster-values.yml vmselect: extraArgs: dedup.minScrapeInterval: 1ms replicationFactor: 2 podAnnotations: prometheus.io/scrape: true prometheus.io/port: 8481 replicaCount: 3 vminsert: extraArgs: replicationFactor: 2 podAnnotations: prometheus.io/scrape: true prometheus.io/port: 8480 replicaCount: 3 vmstorage: podAnnotations: prometheus.io/scrape: true prometheus.io/port: 8482 replicaCount: 3 EOF2.2 逐项解读高可用是如何达成的replicaCount: 3为 vmselect、vminsert、vmstorage 各创建 3 个副本 Pod保证任一组件单点故障时仍有冗余实例承接流量replicationFactor: 2vminsert与vmselect均需配置vminsert依据该值执行写放大fan out每个样本创建两份拷贝分发到两个不同的vmstoragePodvmselect也接收replicationFactor用于知道预期有多少份副本、以及何时把响应标记为partial部分结果后文详述。dedup.minScrapeInterval: 1ms为vmselect配置去重避免从多个vmstorage副本读回样本时发生重复计数。注意集群版要求在开启复制时该值至少为1mspodAnnotations: prometheus.io/scrape: true暴露抓取注解使你的监控端如后续部署的 vmagent可以抓取 VictoriaMetrics 集群自身的指标podAnnotations: prometheus.io/port: 8480/8481/8482指定各组件暴露指标的抓取端口。关于复制因子与节点规模的约束可参考集群版文档中的「Replication and data safety」章节集群至少需要2*N-1个vmstorage节点才能维持复制因子为 N 的完整数据冗余。以本指南replicationFactor2为例至少需要 3 个vmstorage节点与replicaCount: 3正好吻合。2.3 安装集群在 default 命名空间部署高可用集群helm install vmcluster vm/victoria-metrics-cluster -f victoria-metrics-cluster-values.yml安装完成后Helm 会输出类似下面的接入信息NAME: vmcluster LAST DEPLOYED: Mon Mar 2 12:50:25 2026 NAMESPACE: default STATUS: deployed REVISION: 1 DESCRIPTION: Install complete TEST SUITE: None NOTES: Write API: The VictoriaMetrics write api can be accessed via port 8480 with the following DNS name from within your cluster: vmcluster-victoria-metrics-cluster-vminsert.default.svc.cluster.local. Get the Victoria Metrics insert service URL by running these commands in the same shell: export POD_NAME$(kubectl get pods --namespace default -l appvminsert -o jsonpath{.items[0].metadata.name}) kubectl --namespace default port-forward $POD_NAME 8480 You need to update your Prometheus configuration file and add the following lines to it: prometheus.yml remote_write: - url: http://insert-service/insert/0/prometheus/ for example - inside the Kubernetes cluster: remote_write: - url: http://vmcluster-victoria-metrics-cluster-vminsert.default.svc.cluster.local:8480/insert/0/prometheus/ Read API: The VictoriaMetrics read api can be accessed via port 8481 with the following DNS name from within your cluster: vmcluster-victoria-metrics-cluster-vmselect.default.svc.cluster.local. Get the VictoriaMetrics select service URL by running these commands in the same shell: export POD_NAME$(kubectl get pods --namespace default -l appvmselect -o jsonpath{.items[0].metadata.name}) kubectl --namespace default port-forward $POD_NAME 8481 You need to specify the service URL in your Grafana: NOTE: you need to use the Prometheus Data Source Input this URL field into Grafana http://select-service/select/0/prometheus/ for example - inside the Kubernetes cluster: http://vmcluster-victoria-metrics-cluster-vmselect.default.svc.cluster.local.:8481/select/0/prometheus/这段输出包含两个关键接入点请记录下来后续配置 vmagent 与查询时都要用到写入端点Write APIvmcluster-victoria-metrics-cluster-vminsert.default.svc.cluster.local:8480/insert/0/prometheus/vmagent 的remoteWrite.url与之严格对应查询端点Read APIvmcluster-victoria-metrics-cluster-vmselect.default.svc.cluster.local:8481/select/0/prometheus/可作为 Grafana 的 Prometheus 数据源 URLURL 路径中的0是默认租户 ID参见集群版文档中的多租户multitenancy说明。2.4 验证 Pod 状态kubectl get pods -l app.kubernetes.io/instancevmcluster预期输出NAME READY STATUS RESTARTS AGE vmcluster-victoria-metrics-cluster-vminsert-788c76b69b-lphnn 1/1 Running 0 106s vmcluster-victoria-metrics-cluster-vminsert-788c76b69b-lxg2w 1/1 Running 0 106s vmcluster-victoria-metrics-cluster-vminsert-788c76b69b-qmtkp 1/1 Running 0 106s vmcluster-victoria-metrics-cluster-vmselect-65796bc88d-29cwm 1/1 Running 0 106s vmcluster-victoria-metrics-cluster-vmselect-65796bc88d-lz58p 1/1 Running 0 106s vmcluster-victoria-metrics-cluster-vmselect-65796bc88d-t42pr 1/1 Running 0 106s vmcluster-victoria-metrics-cluster-vmstorage-0 1/1 Running 0 106s vmcluster-victoria-metrics-cluster-vmstorage-1 1/1 Running 0 91s vmcluster-victoria-metrics-cluster-vmstorage-2 1/1 Running 0 76s注意 vminsert / vmselect 是 DeploymentPod 名带随机后缀而 vmstorage 是有状态副本集 StatefulSetPod 名为vmstorage-0/1/2与索引顺序对应这符合集群版各组件对状态管理的不同要求。3. 安装 vmagent 采集 Kubernetes 指标要采集 Kubernetes 集群自身的指标并送入 VictoriaMetrics Cluster需要部署 vmagent。vmagent 是 VictoriaMetrics 生态中的指标采集与远程写入代理负责抓取 Kubernetes 各组件API server、节点、cAdvisor、Service 端点、Pod 等的指标并通过remote_write推送到vminsert。使用官方示例 values 文件安装helm install vmagent vm/victoria-metrics-agent -f https://docs.victoriametrics.com/guides/examples/guide-vmcluster-vmagent-values.yaml也可以先把该文件下载到本地再安装或审阅wget https://docs.victoriametrics.com/guides/examples/guide-vmcluster-vmagent-values.yaml仓库内已随源码保留了一份该示例文件的副本位于 docs/guides/examples/guide-vmcluster-vmagent-values.yaml可直接对照阅读。下面解释其中的关键配置remoteWrite写入目标必须是 vminsert 端点。该值必须与第 2 步安装输出中的写入 URL 完全一致remoteWrite: - url: http://vmcluster-victoria-metrics-cluster-vminsert.default.svc.cluster.local:8480/insert/0/prometheus/config抓取配置。示例中设置了全局scrape_interval: 10s并通过 Kubernetes 服务发现kubernetes_sd_configs定义了以下抓取任务job_name发现角色 role抓取对象vmagentstatic_configsvmagent 自身指标localhost:8429kubernetes-apiserversendpointsKubernetes API serverkubernetes-nodesnode节点自身指标kubeletkubernetes-nodes-cadvisornode节点上的 cAdvisor 容器指标/metrics/cadvisorkubernetes-service-endpointsendpoints带有prometheus.io/scrape: true注解的 Service 端点kubernetes-service-endpoints-slowendpoints带有prometheus.io/scrape_slow: true注解的慢速端点scrape_interval: 5mkubernetes-servicesservice带有prometheus.io/probe: true注解的黑盒探测任务kubernetes-podspod带有prometheus.io/scrape: true注解的 Pod其中对 HTTPS 类任务API server、节点、cAdvisor使用 ServiceAccount 的 CA 证书与 bearer token 做 TLS 认证认证材料均取自 Pod 内自动挂载的/var/run/secrets/kubernetes.io/serviceaccount/。metric_relabel_configs指标级标签重写规则。示例在 cAdvisor 任务中定义了一组标签改写把原始标签整理为更规范的名称metric_relabel_configs: - action: replace source_labels: [pod] regex: (.) target_label: pod_name replacement: ${1} - action: replace source_labels: [container] regex: (.) target_label: container_name replacement: ${1} - action: replace target_label: name replacement: k8s_stub - action: replace source_labels: [id] regex: ^/system\.slice/(.)\.service$ target_label: systemd_service_name replacement: ${1}规则语义把pod标签复制为pod_name、container标签复制为container_name、为指标固定写入namek8s_stub、并从 cgroup 的id标签中通过正则^/system\.slice/(.)\.service$提取出 systemd 服务名作为systemd_service_name。此外kubernetes-service-endpoints与kubernetes-pods任务通过 relabel 把抓取目标上的标签映射为标准标签kubernetes_namespace、kubernetes_name、kubernetes_node、kubernetes_pod_name等其中的kubernetes_pod_name标签将在第 4 步的验证查询中直接使用。验证 vmagent 是否正常运行kubectl get pod -l app.kubernetes.io/instancevmagent预期输出NAME READY STATUS RESTARTS AGE vmagent-victoria-metrics-agent-6848c6b58d-87rf6 1/1 Running 0 32s4. 验证集群的指标采集与查询4.1 查看集群服务kubectl get svc -l app.kubernetes.io/instancevmcluster预期输出NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE vmcluster-victoria-metrics-cluster-vminsert ClusterIP 10.43.157.170 none 8480/TCP 4m41s vmcluster-victoria-metrics-cluster-vmselect ClusterIP 10.43.222.181 none 8481/TCP 4m41s vmcluster-victoria-metrics-cluster-vmstorage ClusterIP None none 8482/TCP,8401/TCP,8400/TCP 4m41s注意vmstorage的 Service 类型为 HeadlessCLUSTER-IP: None便于各存储节点按 Pod 序号被直接寻址。4.2 通过查询 API 验证指标已入库先把vmselect服务端口转发到本地kubectl port-forward svc/vmcluster-victoria-metrics-cluster-vmselect 8481:8481然后通过 VictoriaMetrics 查询 API 统计vmselect的 Pod 数curl -sg http://127.0.0.1:8481/select/0/prometheus/api/v1/query?querycount(up{kubernetes_pod_name~.*vmselect.*}) | jq命令拆解http://127.0.0.1:8481/select/0/prometheus/api/v1/query是集群版的 Prometheus 兼容查询 APIURL 格式参见集群版文档的「URL format」一节querycount(up{kubernetes_pod_name~.*vmselect.*})up指标表示抓取目标是否在线kubernetes_pod_name~.*vmselect.*正则匹配 Pod 名含vmselect的目标count对匹配结果计数——即统计vmselectPod 的数量管道交给jq格式化输出便于阅读。预期返回{ status: success, isPartial: false, data: { resultType: vector, result: [ { metric: {}, value: [ 1773419630, 3 ] } ] }, stats: { seriesFetched: 3, executionTimeMsec: 3 } }返回值为3与我们在 values 中配置的replicaCount: 3一致说明 3 个vmselectPod 都被 vmagent 成功发现并采集。4.3 用 VMUI 交互式验证你也可以在浏览器中打开http://localhost:8481/select/0/vmui/其中 0 为默认租户 ID输入count(up{kubernetes_pod_name~.*vmselect.*})并点击Execute query结果如下图所示vmselect副本数稳定保持在 3还可以进入ExplorePrometheus metrics浏览从 Kubernetes 集群采集到的各类指标例如下图展示的process_cpu_seconds_total来自jobvmagent、instancelocalhost:8429CPU 使用趋势5. 故障演练验证高可用真正生效5.1 模拟故障缩减 vmstorage 副本高可用是否真的可靠最好的检验方式就是主动制造故障。下面把vmstorage的 StatefulSet 从 3 个副本缩减到 2 个模拟一个存储节点宕机kubectl scale sts vmcluster-victoria-metrics-cluster-vmstorage --replicas2确认集群中现在只有两个vmstoragePodkubectl get pods -l appvmstorage预期输出NAME READY STATUS RESTARTS AGE vmcluster-victoria-metrics-cluster-vmstorage-0 1/1 Running 0 3h20m vmcluster-victoria-metrics-cluster-vmstorage-1 1/1 Running 0 3h20m5.2 验证数据仍可完整查询用同样的方式统计vmstoragePod 数量curl -sg http://127.0.0.1:8481/select/0/prometheus/api/v1/query?querycount(up{kubernetes_pod_name~.*vmstorage.*}) | jq返回 2 个节点{ status: success, isPartial: false, data: { resultType: vector, result: [ { metric: {}, value: [ 1773437033, 2 ] } ] }, stats: { seriesFetched: 2, executionTimeMsec: 5 } }关键在于isPartial: false由于每条数据同时存在于两个vmstoragePodreplicationFactor: 2丢一个 Pod 后每个时间序列仍有至少一个副本可达查询结果依然完整。这就是复制的价值——数据可用性不依赖任何单个存储节点。5.3 解读isPartial字段查询响应中的isPartial是判断结果完整性的直接依据isPartial: false响应在请求的时间范围与序列上完整——说明有足够多的存储副本按配置的replicationFactor返回了数据isPartial: truevmselect未能从vmstorage拉取到它预期的全部数据返回的序列与取值可能不完整或错误。其原理可追溯到集群版文档vmselect配置了-replicationFactorN后只要不可用的vmstorage节点少于 N 个它就假定剩余节点包含完整数据仍返回isPartial: false反之才会把响应标记为部分结果。这一点在 Cluster-VictoriaMetrics.md 中有明确说明。5.4 验证写入与其它查询不受影响即使少了一个存储节点vmselect相关查询仍应返回 3curl -sg http://127.0.0.1:8481/select/0/prometheus/api/v1/query?querycount(up{kubernetes_pod_name~.*vmselect.*}) | jq输出{ status: success, isPartial: false, data: { resultType: vector, result: [ { metric: {}, value: [ 1773437137, 3 ] } ] }, stats: { seriesFetched: 3, executionTimeMsec: 5 } }这说明单个存储 Pod 的“故障”不会影响指标查询与数据写入。5.5 恢复副本演练结束后把vmstorage缩放回 3 个副本恢复正常运行kubectl scale sts vmcluster-victoria-metrics-cluster-vmstorage --replicas3新副本加入后集群会通过复制机制重新补齐冗余度再次回到 3 副本的高可用状态。6. 总结与后续至此你已完成在 Kubernetes 上通过 Helm 部署了高可用的 VictoriaMetrics 集群vminsert/vmstorage/vmselect各 3 副本为集群配置了replicationFactor: 2数据双副本冗余与dedup.minScrapeInterval: 1ms防止副本重复计数部署 vmagent 并通过 Kubernetes 服务发现采集了集群自身与各工作负载的指标通过停掉一个vmstorage节点验证了高可用指标依然可查、响应完整isPartial: false。需要留意的是本指南的验证场景只覆盖了单个存储节点故障。若要抵御更大规模的故障如多节点同时宕机、整机架或可用区故障需要结合更高的复制因子同时保证vmstorage节点数不少于2*N-1、多可用区部署以及备份策略如 vmbackup来综合设计。后续可以继续深入的方向深入了解集群版各组件与复制、多租户机制参见 Cluster-VictoriaMetrics.md使用 vmctl 将已有监控数据迁移进 VictoriaMetrics参见 vmctl 文档通过 Helm 安装并接入 Grafana将第 2 步输出的vmselect查询地址配置为 Prometheus 数据源即可在 Grafana 中直接可视化这些高可用指标。【免费下载链接】VictoriaMetricsVictoriaMetrics: fast, cost-effective monitoring solution and time series database项目地址: https://gitcode.com/GitHub_Trending/vi/VictoriaMetrics创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考