我有一个 docker swarm 运行我们在两台服务器(节点)上的 docker-compose.yml 中定义的业务堆栈。docker-compose 定义了从两个节点中的每一个开始的 cAdvisor,如下所示:
cadvisor:
image: gcr.io/google-containers/cadvisor:latest
command: "--logtostderr --housekeeping_interval=30s"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- /:/rootfs:ro
- /var/run:/var/run
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
- /dev/disk:/dev/disk/:ro
ports:
- "9338:8080"
deploy:
mode: global
resources:
limits:
memory: 128M
reservations:
memory: 64M
在第三台服务器上,我在节点 1 和 2 上分别运行 docker 与 docker swarm,该服务器用于运行 Prometheus 和 Grafana。Prometheus 配置为仅抓取 node1:9338 资源以获取 cAdvisor 信息。
我偶尔会遇到这样的问题,即在抓取 node1:9338 时,并非所有在节点 1 和 2 上运行的容器都显示在 cAdvisor 统计信息中。
我假设 cAdvisor 正在 swarm 中同步其信息,以便我能够将 Prometheus 配置为仅使用 node1:9338 作为 docker swarm 的入口点并抓取信息。
或者我是否还必须将 node2:9338 放入我的 Prometheus 配置中才能始终获取所有节点的所有信息?如果是,那么应该如何扩展,因为我需要将每个新节点添加到 Prometheus 配置中。
将 Prometheus 与业务堆栈一起运行在一个集群中是没有选择的。
编辑:我今天在打开 cAdvisor 指标 URL http://node1:9338/metrics 以及 http://node2:9338/metrics 时遇到了一种奇怪的行为,因为我在两个 URL 上看到 node1 上运行的所有容器的相同信息. 请求 http://node2:9338/metrics 时缺少 node2 上运行的容器信息。
可能是 docker-internal 负载平衡正在将请求从 http://node2:9338/metrics 路由到 node1:9338 cAdvisor,因此尽管请求了 node2,但仍显示了 node1 的指标?