You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker容器中Prometheus误报远程节点在线问题求助

问题分析与解决:AWS安全组关闭端口后Prometheus未检测到节点离线

现象回顾

在Ubuntu 20.04上使用Docker 23.0.1 + Docker Compose v2.16.0部署Prometheus,配置了对AWS主机上node_exporter(9100端口)的指标抓取:

  • 关闭AWS安全组9100端口的入站规则后,Prometheus长时间显示节点在线,仅重启Prometheus容器才触发离线告警
  • 保持端口开放但停止node_exporter服务时,Prometheus能正常检测到节点离线并触发告警

原因解析

这是TCP连接特性与Prometheus连接复用机制共同作用的结果:

  1. 安全组的阻断逻辑:AWS安全组关闭入站规则时,是静默丢弃所有发往9100端口的流量,不会向Prometheus发送TCP重置(RST)或连接终止(FIN)包。
  2. Prometheus的连接复用:Prometheus默认会复用TCP长连接来抓取指标,之前已建立的ESTABLISHED状态连接,在没有明确终止信号的情况下,会被判定为依然可用。TCP默认的keepalive超时时间长达数小时,在此期间Prometheus会持续尝试通过旧连接抓取数据,而静默丢弃的流量只会触发抓取请求超时,但默认的scrape_timeout(当前配置为10s)不足以覆盖TCP的底层重试逻辑,导致Prometheus误判节点仍在线。
  3. 停止服务的差异:当停止node_exporter服务时,服务会主动关闭TCP连接,向Prometheus发送RST/FIN包,Prometheus能立刻感知到连接失效,因此快速触发告警。
  4. 重启容器生效的原因:重启Prometheus后,所有旧连接被销毁,新建立的连接会被安全组直接阻断,Prometheus无法完成TCP握手,立刻判定抓取失败,触发告警。

解决办法

1. 禁用连接复用

在node_exporter的抓取配置中添加disable_keepalive: true,强制每次抓取都建立新连接。新连接会被安全组直接阻断,Prometheus能立刻检测到失败:

- job_name: 'node_exporter'
  scrape_interval: 30s
  scrape_timeout: 5s  # 缩短超时时间,加快失败判定
  disable_keepalive: true
  static_configs:
    - targets: ['x.x.x.x:9100']
      labels:
        instance: "production"

2. 调整TCP Keepalive参数

通过Docker修改Prometheus容器的TCP keepalive配置,让系统更快检测到失效连接:
在Docker Compose的prometheus服务中添加sysctl配置:

prometheus:
  image: prom/prometheus:latest
  container_name: prometheus
  volumes:
    - ./data/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
    - ./data/alerting/alertmanager_rules.yml:/etc/prometheus/alertmanager_rules.yml
  ports:
    - 9090:9090
  depends_on:
    - alertmanager
  networks:
    - monitor-net
  sysctls:
    - net.ipv4.tcp_keepalive_time=60  # 建立连接60秒后开始发送keepalive探测
    - net.ipv4.tcp_keepalive_intvl=10 # 每10秒发送一次探测包
    - net.ipv4.tcp_keepalive_probes=3 # 连续3次探测失败则判定连接失效

3. 优化抓取超时配置

缩短scrape_timeout,让Prometheus更快判定抓取失败:

- job_name: 'node_exporter'
  scrape_interval: 30s
  scrape_timeout: 5s  # 缩短超时,避免等待过长时间
  static_configs:
    - targets: ['x.x.x.x:9100']
      labels:
        instance: "production"

内容的提问来源于stack exchange,提问作者Souren Ghosh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 01:32:41