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環境裏是不合適的。我們需要一種動態發現容器的方法。

解決思路如下:

  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

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'

注意到上面的兩個關鍵配置:

  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:

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

其中3個instance是屬於tasks.mock的,還有一個則是standalone container(如果沒有看到4個instance,那麼等一會兒再試)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章