我有一个 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 swarm 运行一个 docker,该服务器用于运行 Prometheus 和 Grafana。Prometheus 配置为仅抓取 node1:9338 资源以获取 cAdvisor 信息。
我偶尔会遇到这样的问题:当抓取 node1:9338 时,并非所有在节点 1 和 2 上运行的容器都会显示在 cAdvisor 统计信息中。
我假设 cAdvisor 正在群中同步其信息,以便我能够配置 Prometheus 仅使用 node1:9338 作为进入 docker 群的入口点并抓取信息。
或者我是否还必须将 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 的指标?
答案1
cAdvisor 查看该机器上 Linux 提供的容器信息,但它对 Swarm 一无所知。您需要让 Prometheus 抓取所有机器的数据。
答案2
事实上,问题出在 Swarm 模式下的 docker-internal 负载平衡。
正如我在第一篇文章中所写,我们将 cAdvisor 添加到我们的 docker-compose 文件中,并通过以下方式实例化 docker-swarm
docker stack deploy --prune --with-registry-auth -c docker-compose.yml MY_STACK
cAdvisor 的配置
deploy:
mode: global
导致每个节点只有一个实例,但通过 http://node2:9338/metrics 请求某个节点并不意味着您会获得在该节点上运行的 cAdvisor 的结果。内部 docker 网络可能会将您的请求重新路由到 http://node1:9338/metrics,这样您就无法从 node2 抓取真正的 cAdvisor 结果。
对我有用的解决方案是在我的 docker-compose 中的 cAdvisor 端口部分中明确告诉 docker 使用mode: host
。我的最终配置如下:
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:
- target: 8080
published: 9338
protocol: tcp
mode: host
deploy:
mode: global
resources:
limits:
cpus: "1"
memory: 128M
reservations:
memory: 64M
请注意改变的端口部分。