乐趣区

Prometehus自动发现Docker Swarm Overlay网络中的容器

原文地址
介绍如何使用 Prometheus 的 dns service discovery 机制,自动发现并抓取 Docker swarm overlay 网络中的容器所提供的指标。
使用 docker service create/docker stack deploy 能够很方便管理多个 docker host,并且对应用做扩缩容。那么我们如何抓取这些动态创建的容器应用所提供的指标呢?
在《使用 Prometheus+Grafana 监控 JVM》一文里我们使用了 static_config 静态配置指标抓取目标,这显然在 docker swarm 环境里是不合适的。我们需要一种动态发现容器的方法。
解决思路如下:

使用《一种生产环境 Docker Overlay Network 的配置方案》提到的方法配置 overlay 网络,并且把 docker service、stack、standalone container 都挂到这个 overlay 网络里。
把 Prometheus 也挂到这个 overlay 网络里。
使用 Prometheus 的 DNS service discovery 机制,半自动的发现容器。

本文所提到的脚本可以在这里下载
下面构建一个实验环境以说明方法。
第一步:构建 overlay network
根据《一种生产环境 Docker Overlay Network 的配置方案》里提到的方法,创建 Docker swarm,和一个 overlay 网络,名字叫做 test-overlay:
docker network create -d overlay –attachable test-overlay
第二步:启动容器
为了方便起见,使用 prometheus-mock-data 来模拟一个提供指标的应用,这样就能够避免繁琐的 jmx-exporter。
1) 新建一个目录,名字叫做 docker-swarm-demo
2) 新建一个文件 scrape-data.txt,这个文件就是我们要提供的假指标,内容如下:
# HELP x mock metric
# TYPE x gauge
x 1

# HELP x mock metric
# TYPE x gauge
x 2

# HELP x mock metric
# TYPE x gauge
x 3

# HELP x mock metric
# TYPE x gauge
x 4
3) 为了演示 docker service 和 standalone container 都能被采集到,会启动这两种形式的容器:
4) 使用 docker service create 启动一个 service,replicas=3(注意 –name 参数):
docker service create \
–name mock \
–replicas 3 \
–network test-overlay \
–limit-memory 96M \
–mount type=bind,src=$(pwd)/scrape-data.txt,dst=/home/java-app/etc/scrape-data.txt \
chanjarster/prometheus-mock-data:latest
4) 使用 docker run 启动一个 standalone container(注意 –name 参数):
docker run -d \
-v $(pwd)/scrape-data.txt:/home/java-app/etc/scrape-data.txt \
–network test-overlay \
–name standalone-mock \
chanjarster/prometheus-mock-data:latest
第三步:启动 Prometheus
1) 在之前新建目录 docker-swarm-demo 里创建文件 prom-config.yml,内容如下:
scrape_configs:
– job_name: ‘swarm-service’
scrape_interval: 30s
dns_sd_configs:
– names:
– tasks.mock
– standalone-mock
type: A
port: 8080
relabel_configs:
– source_labels: [‘__meta_dns_name’]
target_label: ‘service’
注意到上面的两个关键配置:
设定了两个 DNS A 记录,tasks.mock 和 standalone-mock。
tasks.mock 是 Docker 自动为 docker service mock 创建的,而 standalone-mock 就是容器名。文章最开始说到的半自动就是这个意思,我们得事先知道 DNS A 记录有哪些,然后让 Prometheus 去发现这些 DNS A 记录背后对应的容器有哪些。
把__meta_dns_name 的值设置到指标的 service 这个 label 里。
2) 启动 Prometheus:
docker run -d \
–name=prometheus \
–network test-overlay \
-p 9090:9090 \
-v $(pwd):/prometheus-config \
-v $(pwd)/prom-data:/prometheus \
prom/prometheus –config.file=/prometheus-config/prom-config.yml
3) 访问 http://localhost:9090 看看 Prometheus 是否启动成功,在输入框里输入 x 然后执行,应该可以看到如下图的结果:

其中 3 个 instance 是属于 tasks.mock 的,还有一个则是 standalone container(如果没有看到 4 个 instance,那么等一会儿再试)。

退出移动版