前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Prometehus自动发现Docker Swarm Overlay网络中的容器

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

作者头像
颇忒脱
发布2019-03-13 16:19:42
9270
发布2019-03-13 16:19:42
举报

介绍如何使用Prometheus的dns service discovery机制,自动发现并抓取Docker swarm overlay网络中的容器所提供的指标。

使用docker service create/docker stack deploy能够很方便管理多个docker host,并且对应用做扩缩容。那么我们如何抓取这些动态创建的容器应用所提供的指标呢?

《使用Prometheus+Grafana监控JVM》一文里我们使用了static_config静态配置指标抓取目标,这显然在docker swarm环境里是不合适的。我们需要一种动态发现容器的方法。

解决思路如下:

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

本文所提到的脚本可以在这里下载

下面构建一个实验环境以说明方法。

第一步:构建overlay network

根据《一种生产环境Docker Overlay Network的配置方案》里提到的方法,创建Docker swarm,和一个overlay网络,名字叫做test-overlay

代码语言:javascript
复制
docker network create -d overlay --attachable test-overlay

第二步:启动容器

为了方便起见,使用prometheus-mock-data来模拟一个提供指标的应用,这样就能够避免繁琐的jmx-exporter。

1) 新建一个目录,名字叫做docker-swarm-demo

2) 新建一个文件scrape-data.txt,这个文件就是我们要提供的假指标,内容如下:

代码语言:javascript
复制
# 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参数):

代码语言:javascript
复制
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参数):

代码语言:javascript
复制
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,内容如下:

代码语言:javascript
复制
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'

注意到上面的两个关键配置:

  1. 设定了两个DNS A记录,tasks.mockstandalone-mock

tasks.mock是Docker自动为docker service mock创建的,而standalone-mock就是容器名。文章最开始说到的半自动就是这个意思,我们得事先知道DNS A记录有哪些,然后让Prometheus去发现这些DNS A记录背后对应的容器有哪些。

  1. __meta_dns_name的值设置到指标的service 这个label里。

2) 启动Prometheus:

代码语言:javascript
复制
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然后执行,应该可以看到如下图的结果:

clipboard.png
clipboard.png

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第一步:构建overlay network
  • 第二步:启动容器
  • 第三步:启动Prometheus
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档