我有一个 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 服务的主机的固件中设置一条规则(在我的例子中只有一个,没有副本)以允许端口 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,它很好地满足了我的需求;-)