搜索中...
🔍

未找到相关结果

Akemi

VictoriaMetrics从零到告警邮件实战

字数统计: 1.1k阅读时长: 5 min
2026/06/01

一直听说 VM 压缩率比 Prometheus 高 7 倍,手上正好有套 kube-prometheus-stack 跑在 Kind 集群,从零搭一套把告警链路跑通。

单机版部署与接入Prometheus

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# clone helm chart,国内需要代理
export http_proxy="http://192.168.10.238:7897"
export https_proxy="http://192.168.10.238:7897"
git clone https://github.com/VictoriaMetrics/helm-charts.git
unset http_proxy
unset https_proxy

# 进chart目录,拉依赖(不拉会报错:missing in charts/ directory)
cd helm-charts/charts/victoria-metrics-single/
helm dependency build

# values.yaml 只改一个字段试水
# server.scrape.enabled: true ← 开启自监控抓取

# 部署
helm upgrade --install vm-single . -f values.yaml -n victoria-metrics --create-namespace

# kind集群需要port-forward
kubectl port-forward --address 0.0.0.0 -n victoria-metrics svc/victoria-metrics-single-server 8428:8428 &

# 访问 http://192.168.10.100:8428/vmui
# 接下来接入现有Prometheus,remote_write到VM
# kube-prometheus-stack的values.yaml加:
# prometheus.prometheusSpec.remoteWrite:
# - url: http://victoria-metrics-single-server.victoria-metrics.svc.cluster.local:8428/api/v1/write
# Grafana加个新数据源,URL指向VM即可

# **scrape.enabled和remote_write不能同时开,否则同一批指标写两遍**
# VM自己采集 → scrape开,remote_write关
# Prometheus采集→VM存储 → scrape关,remote_write开

VMUI查询界面

Targets页面

8428端口入口

Grafana查询VM数据

MetricsQL

VM 的查询语言,兼容 PromQL,加了几个好用的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# WITH 表达式,复杂查询不用复制粘贴
WITH (
errors = sum(rate(http_requests_total{status=~"5.."})),
total = sum(rate(http_requests_total))
)
errors / total * 100

# 默认 range selector,不用写 [5m]
rate(http_requests_total)

# rollup 函数族,一个函数搞定多种聚合
rollup(metric, "max")
rollup(metric, "avg")

# keep_last_value,采集丢点时填充前一个有效值
keep_last_value(up)

# 管道语法,从左到右读
sum by (instance) (rate(node_cpu_seconds_total{mode!="idle"})) | topk(5)
特性 PromQL MetricsQL
默认 range ❌ 必须写[5m] ✅ 自动
WITH 语法
rollup
keep_last_value
管道语法

通过 Promxy 查 VM 时用标准 PromQL API,不会走 MetricsQL。

k8s-stack 集群版部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 删掉单机版
helm delete vm-single -n victoria-metrics

# 进k8s-stack目录,拉依赖
cd /root/victoria-metrics/charts/victoria-metrics-k8s-stack/
helm dependency build

# values.yaml 关键改动:
# vmsingle.enabled: false
# vmcluster.enabled: true
# vmcluster.spec.replicationFactor: 1(学习环境各1副本)
# prometheus-node-exporter.enabled: false(端口跟Prometheus冲突,9100被占了)
# defaultRules.create: false(Kind环境部分告警规则不兼容)

# 部署
helm upgrade --install victoria-metrics-k8s-stack ./ -f values.yaml -n victoria-metrics

# port-forward关键端口
kubectl port-forward --address 0.0.0.0 -n victoria-metrics svc/vmselect-victoria-metrics-k8s-stack 8481:8481 &
kubectl port-forward --address 0.0.0.0 -n victoria-metrics svc/vmalert-victoria-metrics-k8s-stack 8080:8080 &
kubectl port-forward --address 0.0.0.0 -n victoria-metrics svc/vmagent-victoria-metrics-k8s-stack 8429:8429 &

# **集群版VMUI路径带租户ID:http://192.168.10.100:8481/select/0/vmui**
# 第一次访问直接404,看了报错才明白

集群版三组件:vminsert 写入路由,vmstorage 存储,vmselect 查询。可独立扩缩容。

k8s-stack 用 Operator 模式,跟 kube-prometheus-stack 套路一样:

kube-prometheus-stack victoria-metrics-k8s-stack
添加监控目标 ServiceMonitor VMServiceScrape
配置告警规则 PrometheusRule VMRule

Operator 自动兼容 Prometheus Operator 的 CRD,迁移基本不用改。

告警实战与邮件通知

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 让vmagent采集宿主机的process-exporter(端口9256)
# 创建VMStaticScrape CRD
# apiVersion: operator.victoriametrics.com/v1beta1
# kind: VMStaticScrape
# targetEndpoints.targets: ["192.168.10.100:9256"]
# kubectl apply -f process-exporter-scrape.yaml
# 去vmagent targets页面确认状态是UP

# 写VMRule,关键指标 namedprocess_namegroup_memory_bytes,标签memtype="resident"
# 机器上milvus约5.3GB,阈值5GB
# expr: namedprocess_namegroup_memory_bytes{memtype="resident"} > 5000000000
# for: 1m
# kubectl apply -f process-memory-alert.yaml

# stress压测触发
stress --vm 1 --vm-bytes 6500M --timeout 600s
# 一两分钟后vmalert页面ProcessHighMemory变firing

# 告警链路:process-exporter(宿主机) → vmagent(K8s) → VM(vmstorage) → vmalert → firing

# 邮件通知,values.yaml里配置alertmanager:
# smtp_smarthost: 'smtp.163.com:25'
# smtp_from: 'alertwarning@163.com'
# smtp_auth_password: 'xxxx'(服务授权码)
# receivers里配email_configs,to: '1320991378@qq.com'
# **values.yaml有两个receivers段,YAML重复key后面覆盖前面,邮件不生效,删掉多余的就好了**

vmagent targets页面

vmalert firing状态

收到邮件告警

整体链路:采集(vmagent) → 存储(VM) → 查询(MetricsQL) → 告警(vmalert) → 通知(Alertmanager → 邮件)

Helm依赖缺失helm dependency build 不能省。node-exporter端口冲突:kube-prometheus-stack已占用9100。defaultRules不兼容:Kind环境部分告警规则表达式不匹配。集群版VMUI路径:要带租户ID /select/0/vmui

环境版本

组件 版本
kube-prometheus-stack (Helm) 80.13.2
Prometheus v3.9.1
Grafana 12.3.1
VM k8s-stack (Helm) 0.81.0
VM App Version v1.144.0
process-exporter v0.8.1

遗留任务

  • 存储压缩率实测(VM vs Prometheus 磁盘占用对比)
  • vmbackup/vmrestore 备份恢复
  • vmagent 替代 Prometheus scrape(完全迁移)
  • vmauth 多租户
CATALOG
  1. 1. 单机版部署与接入Prometheus
  2. 2. MetricsQL
  3. 3. k8s-stack 集群版部署
  4. 4. 告警实战与邮件通知
  5. 5. 环境版本
  6. 6. 遗留任务