Consul Connect网格中Nomad部署的Spring Boot Actuator Prometheus采集问题
问题场景说明
当前核心矛盾是未接入Consul服务网格的Prometheus,无法直接访问网格内没有主机端口映射的Spring Boot应用,以下是可落地的解决方案和通用实践:
解决方案
方案1:将Prometheus接入Consul服务网格(安全性最高)
- 给Prometheus的Nomad任务配置Consul Connect sidecar,让Prometheus也运行在服务网格内
# Prometheus对应的Nomad配置新增部分 service { name = "prometheus" port = "9090" connect { sidecar_service {} } } network { mode = "bridge" }
- 配置Consul意图,允许Prometheus访问
api服务的9966端口
Kind = "service-intentions" Name = "api" Sources = [ { Name = "prometheus" Action = "allow" } ]
- 原有Prometheus采集配置无需大幅调整,服务发现拿到的
api服务地址会被Prometheus的sidecar自动代理到目标实例,即可正常采集指标。
方案2:通过Sidecar暴露指标路径(无需修改应用,生产常用)
无需把Prometheus接入网格,直接在api服务的Sidecar配置中暴露指标路径,自动分配主机端口供Prometheus采集:
- 修改
api服务的Nomad配置:
network { mode = "bridge" # 新增指标端口声明,自动分配主机端口 port "metrics" { to = -1 } } service { name = "api" port = "9966" connect { sidecar_service { proxy { expose { path { path = "/api/actuator/prometheus" local_path_port = 9966 listener_port = "metrics" } } } } } # 可选:添加元数据方便Prometheus自动识别采集配置 meta { metrics_path = "/api/actuator/prometheus" metrics_port = "metrics" } }
- 修改Prometheus采集配置,通过Consul服务发现读取自动分配的指标端口:
- job_name: 'actuator' metrics_path: /api/actuator/prometheus consul_sd_configs: - server: '本地Consul客户端地址:8500' services: ['api'] relabel_configs: # 替换采集端口为Sidecar暴露的metrics端口 - source_labels: [__meta_consul_service_port_metrics] target_label: __address__ regex: (.*) replacement: $1
服务网格内无端口映射应用指标采集通用实践
- 安全优先:优先选择采集端接入网格的方案,全程流量都在网格内加密传输,不需要对外暴露任何应用端口,权限由服务网格统一管控
- 端口隔离:业务端口和指标端口完全拆分,即使需要暴露指标端口,也只会暴露Sidecar的指标端口,不会直接暴露应用本身的业务端口
- 自动适配:通过服务元数据标记指标路径、端口等信息,采集端通过重标记规则自动适配,不需要每次新增服务都修改采集配置
- 权限管控:如果采用Sidecar暴露指标的方案,可配合主机防火墙、安全组规则,限制只有采集端的IP段可以访问指标端口
内容的提问来源于stack exchange,提问作者Jawahar
相关产品推荐
相关产品推荐

