我有一个 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 的指标?
cAdvisor 在该机器上查看 Linux 提供的容器信息,它对 Swarm 一无所知。你会想让 Prometheus 刮掉你所有的机器。
实际上,问题在于 swarm 模式下的 docker 内部负载平衡。
正如我在最初的帖子中所写,我们正在将 cAdvisor 添加到我们的 docker-compose 文件中,并且我们正在通过实例化 docker-swarm
cAdvisor的配置与
导致每个节点一个实例,但通过 http://node2:9338/metrics 请求某个节点并不意味着您获得在该节点上运行的 cAdvisor 的结果。内部 docker 网络可能会将您的请求重新路由到 http://node1:9338/metrics,这样您就无法从 node2 中抓取真正的 cAdvisor 结果。
对我有用的解决方案是明确告诉
mode: host
docker 在我的 docker-compose 中的 cAdvisor 的端口部分中使用。我的最终配置如下所示:请注意更改的端口部分。