docker swarm 中的 Prometheus 未监控自己节点中的节点导出器

问题描述 投票:0回答:1

我有一个 docker swarm,包含三个节点、一个管理器和两个工作器。 每个节点都在本地容器(不属于任何 swarm 堆栈的一部分)中运行节点导出器。用于在每个节点中分别创建这个容器的compose文件如下:

version: '3'

services:
  node_exporter:
    image: quay.io/prometheus/node-exporter:latest
    container_name: node_exporter
    command:
      - '--path.rootfs=/host'
    network_mode: host
    pid: host
    restart: unless-stopped
    volumes:
      - '/:/host:ro,rslave'

Prometheus 使用如下堆栈在集群中运行:

version: '3'

services:
  prometheus:
    image: prom/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
        delay: 10s
        max_attempts: 5
    volumes:
      - /home/ubuntu/monitor/etc/prometheus:/etc/prometheus
      - /home/ubuntu/monitor/prometheus:/prometheus
    networks:
      - monitnw
      
networks:
  monitnw:
    external: true

其中 prometheus.yml 包含一个“作业”,用于从三个节点中的节点导出器获取指标:

- job_name: Node-exporter metrics
    static_configs:
      - targets: ['X.Y.Z.178:9100', 'X.Y.Z.218:9100', 'X.Y.Z.93:9100']

在所有三个节点中,防火墙都配置为允许来自其他两个对等节点的所有流量。

在 Grafana 中,我可以看到运行 Prometheus 的节点的两个对等点的指标报告正确,但没有运行 Prometheus 的节点的报告。无论运行 Prometheus 的节点如何,这都是相同的。

我在这里缺少什么?,

为什么 Prometheus 没有“看到”来自其运行节点的节点导出器的指标?

任何提示将不胜感激。

prometheus prometheus-node-exporter
1个回答
0
投票

我只需在运行 prometheus 服务的主机的固件中设置一条规则(在我的例子中只有一个,没有副本)以允许端口 9100 上的 172.18.0.0/16。

原因在主机内的容器中运行的Docker堆栈服务使用网络docker_gwbridge与主机进行通信。就我而言,端口 9100 仅对对等 Swarm 节点开放,但不对 docker_gwbridge 开放。在我的例子中,这个 docker 网络使用子网 172.18.0.0/16。

显然,这是一个群,当我删除堆栈并再次运行它时,相同的服务可能会在不同的主机上运行。如果服务副本重新启动,这种情况也可能随时发生。为了安全起见,我在集群中的所有节点中配置了 docker_gwbridge,如下所示:

docker network create \
--subnet 172.18.0.0/16 \
--opt com.docker.network.bridge.name=docker_gwbridge \
--opt com.docker.network.bridge.enable_icc=false \
--opt com.docker.network.bridge.enable_ip_masquerade=true \
docker_gwbridge

此处所述。

可能不是最优雅的解决方案,但我发现在这种情况下唯一有效的解决方案。 无论如何,我已将项目的这一部分移至 GrafanaLabs,它很好地满足了我的需求;-)

© www.soinside.com 2019 - 2024. All rights reserved.