发布于

给 Traefik 增加 Grafana 监控能力

作者
  • 姓名
    Twitter

前言

使用 Traefik 已经很多年,部署 Docker 服务变得非常简单,后来再配合上 Cloudflare 的自动 https,Traefik 中甚至连 SSL 证书都不再需要配置,Traefik 的自动配置 SSL 证书的能力也被浪费了。最近偶然看到 Traefik 升级了 3.0 版本,顺手升级了一下,因为正好在了解 Grafana 这一工具,顺便给自己的 Traefik 配置了一下,杀鸡用牛刀,使用 Prometheus 和 Grafana 实现一个服务监控界面,自娱自乐一下。

最终效果:

image

配置方式

我们通过 docker-compose 的方式安装 Traefik,在前期的文章中进行过详细说明,Traefik 3.0 和当时版本配置竟然差异不大,只需要在原来的 traefik.yaml​和dynamic.yaml​中添加以下内容即可:

core:
  defaultRuleSyntax: v2

之后,其他配置无需变化,即可正常使用 Traefik 3.0。

我们今天的主题不是配置 Traefik,我们的主题是为 Traefik 增加监控能力,使用 Traefik + Prometheus + Grafana 进行组合,主要流程大致有以下几步:

  1. 配置 Traefik 并启用 Prometheus 和 Grafana 集成
  2. 设置 Prometheus 以抓取 Traefik 的指标
  3. 设置 Grafana 以可视化 Prometheus 数据

下面我们就详细说明各步如何配置:

配置 Traefik 并启用 Prometheus 和 Grafana 集成

前期文章中,我们已经提到过,Traefik 的配置分为静态配置和动态配置,这里要处理的就是静态配置,静态配置可以通过在 docker-compose.yaml​ 文件通过 command 的方式增加,也可以在静态配置traefik.yaml​文件中配置,我们延续之前的选择,在traefik.yaml​文件中增加相关配置,配置示例如下:


core:
  defaultRuleSyntax: v2

providers:
  docker: {}
  file:
    directory: "/etc/traefik"
    filename: "dynamic.yml"
    watch: true

log:
  level: DEBUG

entryPoints:
  web:
    address: ":80"
  websecure:
    address: ":443"
  metrics:
    address: ":8082"

certificatesResolvers:
  mytlschallenge:
    acme:
      email:  "yourname@email.com"
      storage:  "/letsencrypt/acme.json"
      tlsChallenge: {}

api:
  dashboard: true

accessLog:
  filePath: "/log/access.log"
  format: json
  bufferingSize: 100

metrics:
  prometheus:
    entryPoint: metrics
    addEntryPointsLabels: true
    addRoutersLabels: true
    addServicesLabels: true
    buckets:
      - 0.1
      - 0.3
      - 1.2
      - 5.0

可以看到,主要是在原来的基础上,增加了 metrics 相关的字段,相关的配置参考网络配置,不详述,可自行查询了解。

回到docker-compose.yaml​所在目录中,修改其内容,增加 prometheus 和 grafana,示例如下:

version: '3'

services:
  traefik:
    image: traefik:v3.0.2
    # Enables the web UI and tells Traefik to listen to docker
    command: --api.insecure=true --providers.docker
    restart: always
    ports:
      # The HTTP and HTTPS port
      - "80:80"
      - "443:443"
      # The Web UI (enabled by --api.insecure=true)
      - "8080:8080"
      # The metrics port
      - "8082:8082"
    volumes:
      - "./letsencrypt:/letsencrypt"
      - "./config:/etc/traefik"
      - "./log:/log"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"

  prometheus:
    image: prom/prometheus
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    ports:
      - "9090:9090"

  grafana:
    image: grafana/grafana
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=admin
    volumes:
      - grafana-storage:/var/lib/grafana

volumes:
  grafana-storage:    

主要是增加了 8082 端口映射以及 prometheus 和 grafana 相关容器。

设置 Prometheus 以抓取 Traefik 的指标

在同一个目录下,创建所需的promethus.yaml​文件:

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'traefik'
    static_configs:
      - targets: ['traefik:8082']

之后通过docker-compose up -d​ 启动容器,不出意外的话会拉取镜像并启动。

我之前有容器正在运行,所以先通过docker-compose down​关闭相关服务,由于本次的配置文件中,将reverse-proxy​更名为了traefik​,会提示存在孤儿容器,按提示命令删除即可,如果有使用原容器网络的,会提示有活跃网络,需要去使用了 Traefik 的网络的容器中删除相关网络配置。

验证容器运行情况

打开浏览器,通过http://服务器IP:端口​来检查各服务的运行情况:

  • 访问 http://服务器IP:8080​,进入 Traefik 的仪表板,确保 Traefik 正常运行
  • 访问 http://服务器IP:9090​,进入 Prometheus 的 Web 界面。在“Status” -> “Targets” 页面,你应该能够看到 Traefik 的指标抓取目标,并且状态为“UP”。

image

  • 打开浏览器,访问 http://服务器IP:3000​,进入 Grafana 的 Web 界面。使用默认的用户名 admin​ 和密码 admin​ 登录,确保 Grafana 正常运行。

设置 Grafana 以可视化 Prometheus 数据

首次登录后修改默认密码,之后需要配置数据源并配置界面模板,大致流程如下,此处不详述,较为简单:

  • 通过顶部的搜索框,输入 Data Sources,找到数据源配置,点击“Add data source”按钮,选择“Prometheus”,将地址配置为 http://prometheus:9090
  • 进入左侧的 Dashboard 仪表盘配置,从右上方按钮中找到 Import 导入,我们直接导入 ID 即可,可自行选择,我使用了这个界面,ID 为17346
  • 之后可在设置中,自行将语言修改为中文,并将默认仪表盘设置为使用的仪表盘,这样打开后直接展示仪表盘。