如何在Prometheus中采集Swarm集群Nginx多副本指标并接入Grafana?
解决方案:采集Swarm集群中Nginx副本的指标到Grafana
当然可行!你遇到的主机名问题,核心原因是Docker Swarm里单个副本的网络标识没法直接通过服务名访问,而nginx-exporter需要精准指向每个Nginx实例。下面提供两种靠谱的实现方案:
方案一:Sidecar模式(推荐)
把nginx-exporter作为Nginx服务的sidecar容器部署,每个Nginx副本都会伴随一个专属的exporter——两者共享网络命名空间,exporter可以直接用localhost访问对应的Nginx实例,完美解决主机名问题。
修改你的Swarm部署配置如下:
version: '3.8' services: nginx: image: registry:5000/nginx:2 ports: - "80:80" - "443:443" deploy: replicas: 2 volumes: - ./nginx.conf:/etc/nginx/nginx.conf # 需确保Nginx开启stub_status模块 command: ["nginx", "-g", "daemon off;"] nginx-exporter: image: nginx/nginx-prometheus-exporter:latest command: ["-nginx.scrape-uri", "http://localhost:80/stub_status"] deploy: replicas: 2 # 和Nginx副本数保持一致 depends_on: - nginx network_mode: "service:nginx" # 关键配置:共享Nginx服务的网络命名空间
配置要点:
- 先确保Nginx开启
stub_status模块,这是exporter采集指标的基础:server { listen 80; location /stub_status { stub_status on; allow 127.0.0.1; # 因sidecar共享网络,localhost访问完全安全 deny all; } } network_mode: "service:nginx"让exporter直接复用Nginx的网络空间,无需额外配置主机名,直接用localhost就能访问对应副本的状态端点。- 部署完成后,每个Nginx副本都会绑定一个专属exporter,Prometheus可以通过Swarm的服务发现(比如
tasks.nginx-exporter)自动识别所有exporter实例。
方案二:Swarm服务发现+动态采集
如果不想用sidecar模式,也可以通过Swarm的DNS服务发现,让Prometheus自动识别所有Nginx副本的IP,再配置采集规则。不过这种方式相对复杂,仅作备选:
- 确保Nginx的
stub_status模块允许Swarm overlay网络的IP段访问(比如allow 10.0.0.0/8;)。 - 在Prometheus配置中添加Swarm任务级别的服务发现:
scrape_configs: - job_name: 'nginx' docker_swarm_sd_configs: - host: unix:///var/run/docker.sock role: task relabel_configs: - source_labels: [__meta_docker_swarm_service_name] regex: nginx action: keep - target_label: __address__ replacement: '$__meta_docker_swarm_task_address:80' - source_labels: [__meta_docker_swarm_task_id] target_label: instance - 部署独立的
nginx-exporter服务,配置它批量采集所有Nginx副本的stub_status端点。这种方式需要确保exporter能访问到所有副本的IP,不如sidecar模式直观可靠。
接入Grafana
完成exporter部署和Prometheus配置后,只需在Grafana中添加Prometheus数据源,再导入官方的Nginx仪表板(比如ID为12900的预设仪表板),就能看到每个Nginx副本的请求量、连接数、响应时间等详细指标了。
内容的提问来源于stack exchange,提问作者TheFatal
相关产品推荐
相关产品推荐

