搜索中...
🔍

未找到相关结果

Akemi

Promxy:让多个Prometheus/VM集群看起来像一个API

字数统计: 1.3k阅读时长: 5 min
2026/06/07

手里有两套监控集群——一套 kube-prometheus-stack,一套 VictoriaMetrics k8s-stack。想用一个 PromQL 入口同时查两边的数据,不想记两套地址、切两个 Grafana 数据源。Promxy 就是干这个的。

Promxy 是什么

Promxy 是一个 Prometheus 聚合代理。它不存储数据,只做查询代理。收到 PromQL 请求后,scatter 到多个下游 Prometheus/VM 实例,gather 合并结果,返回给调用方。

1
2
3
Grafana → Promxy → Prometheus A
→ VM B
→ VM C

核心定位:让多个 Prometheus/VM API 端点看起来像一个。

关键特性

  • 纯 HTTP 调用:下游暴露标准 Prometheus HTTP API 就行,没有特殊协议
  • 不存储数据:只转发和合并,状态全在下游
  • 兼容 Prometheus 和 VM:可以混合聚合 Prometheus + VictoriaMetrics
  • 支持 recording rules 和 alerting rules:输出通过 remote_write 推到后端
  • 支持 Kubernetes 服务发现:自动发现下游实例

为什么需要 Promxy

场景一:多集群监控

多个 K8s 集群各自部署了 Prometheus 或 VM,需要统一查询入口。

场景二:Prometheus 迁移到 VM

过渡期 Prometheus 和 VM 并存,需要一个统一入口同时查两边数据。

场景三:高可用

同一组下游实例放多个副本,Promxy 自动去重合并。

场景四:冷热分离

历史数据在低成本存储(如 S3),近期数据在高性能存储,Promxy 按时间范围路由查询。

核心配置:ServerGroup

Promxy 的配置围绕 ServerGroup 展开。一个 ServerGroup 是一组同配置的下游实例:

1
2
3
4
5
6
7
8
9
10
11
server_groups:
- static_configs:
- targets:
- vmselect-1:8481
- vmselect-2:8481 # HA 对
scheme: http
anti_affinity: 10s
remote_read: false
query_params:
nocache: 1
ignore_error: false

关键参数

参数 说明 建议值
anti_affinity 合并同一组内多个实例的时间序列阈值 设为 scrape interval
remote_read 是否用 remote_read API VM=false,Prometheus=true
query_params 给下游请求加查询参数 VM 加 nocache: 1
ignore_error 该组不可用时是否忽略错误 关键组=false,可选组=true
relative_time_range 只查该组某时段的数据 冷热分离场景用
relabel_configs 修改返回的标签 需要时用
path_prefix 下游 API 路径前缀 VM 集群版需要设

remote_read 的区别

  • remote_read=true:用 Prometheus 的 remote_read API,一次请求拿所有数据,效率更高。Prometheus 支持。
  • remote_read=false:用标准 PromQL API(/api/v1/query),逐指标查询。VM 不支持 remote_read,必须设 false。

VM 集群版的坑

单机版 VM 的 API 路径是 /api/v1/query,但集群版 vmselect 的路径是 /select/0/prometheus/api/v1/query。需要加 path_prefix

1
2
3
4
5
- static_configs:
- targets:
- vmselect:8481
path_prefix: /select/0/prometheus
remote_read: false

不加的话 Promxy 会 404。

完整配置示例

下面是一个同时聚合 Prometheus + VictoriaMetrics 的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
global:
evaluation_interval: 15s

server_groups:
# ws-k8s 集群的 Prometheus(同集群,支持 remote_read)
- name: ws-k8s-prometheus
static_configs:
- targets:
- prometheus-kube-prometheus-prometheus.monitoring.svc:9090
scheme: http
remote_read: true
anti_affinity: 15s

# test-cluster 的 VM 集群版(跨集群,不支持 remote_read)
- name: test-cluster-vm
static_configs:
- targets:
- localhost:18481 # port-forward 的 vmselect
scheme: http
remote_read: false
path_prefix: /select/0/prometheus
anti_affinity: 15s
query_params:
nocache: 1

部署方式

二进制

1
./promxy --config=config.yaml  # 默认监听 :8082

Docker

1
2
3
4
5
docker run \
-v /path/to/config.yaml:/etc/promxy/config.yaml \
-p 8082:8082 \
quay.io/jacksontj/promxy:v0.0.93 \
--config=/etc/promxy/config.yaml

注意:master tag 不存在,latest tag 有 panic bug(index out of range)。建议用具体版本如 v0.0.93

K8s(Helm)

Promxy 社区有 Helm chart,但版本较旧。实测中遇到的问题:

  • master tag 不存在 → 改用具体版本
  • latest 有 bug → 用 v0.0.93

实操:跨集群聚合查询

环境

  • ws-k8s:Kind 集群,跑 kube-prometheus-stack(Prometheus v3.9.1)
  • test-cluster:Kind 集群,跑 VM k8s-stack(VictoriaMetrics 集群版)

步骤

  1. 暴露 test-cluster 的 vmselect

Kind 集群网络隔离,需要 port-forward:

1
2
kubectl --context kind-test-cluster -n victoria-metrics \
port-forward svc/vmselect-vm-stack-victoria-metrics-k8s-stack 18481:8481 &
  1. 准备 Promxy 配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# promxy-config.yaml
global:
evaluation_interval: 15s

server_groups:
- name: ws-k8s-prometheus
static_configs:
- targets:
- prometheus-kube-prometheus-prometheus.monitoring.svc:9090
scheme: http
remote_read: true
anti_affinity: 15s

- name: test-cluster-vm
static_configs:
- targets:
- localhost:18481
scheme: http
remote_read: false
path_prefix: /select/0/prometheus
anti_affinity: 15s
query_params:
nocache: 1
  1. 部署 Promxy
1
helm upgrade --install promxy ./ -f values.yaml -n victoria-metrics
  1. 验证

在 Grafana 添加 Promxy 为数据源(http://promxy:8082),查询 node_uname_info

1
2
{instance="ws-k8s-worker", job="node-exporter"}  ← 来自 Prometheus
{instance="test-cluster-worker", job="node-exporter"} ← 来自 VM

两个集群的节点数据同时出现在一个查询结果里。

与公司监控架构的关系

在实际生产环境中,Promxy 通常不是单独使用的。一个典型的架构:

1
2
3
4
5
6
7
8
9
Nginx 反代(统一入口 + 认证 + 限流)

Promxy(多源数据聚合)

VM(核心存储)+ Prometheus(遗留数据源)

Consul(配置管理)→ consul-template → 配置自动同步

Alertmanager(告警通知)+ Grafana(可视化)

Promxy 在这个架构中承担查询聚合层的角色:

  • 对上(Grafana / Nginx):统一的 PromQL API
  • 对下(VM / Prometheus):scatter-gather 查询合并
  • 配置来源:Consul KV,通过 consul-template 自动同步

注意事项

  1. Promxy 本身无本地存储:recording rules 输出必须配 remote_write 推到后端
  2. 性能开销:scatter-gather 模式,下游组多时有一定网络开销
  3. VM 必须设 remote_read=false:VM 不支持 remote_read API
  4. 集群版路径前缀:VM 集群版 vmselect 需要 path_prefix: /select/0/prometheus
  5. 版本选择:避免 latest tag,用具体版本号

参考

CATALOG
  1. 1. Promxy 是什么
    1. 1.1. 关键特性
  2. 2. 为什么需要 Promxy
    1. 2.1. 场景一:多集群监控
    2. 2.2. 场景二:Prometheus 迁移到 VM
    3. 2.3. 场景三:高可用
    4. 2.4. 场景四:冷热分离
  3. 3. 核心配置:ServerGroup
    1. 3.1. 关键参数
    2. 3.2. remote_read 的区别
    3. 3.3. VM 集群版的坑
  4. 4. 完整配置示例
  5. 5. 部署方式
    1. 5.1. 二进制
    2. 5.2. Docker
    3. 5.3. K8s(Helm)
  6. 6. 实操:跨集群聚合查询
    1. 6.1. 环境
    2. 6.2. 步骤
  7. 7. 与公司监控架构的关系
  8. 8. 注意事项
  9. 9. 参考