乐趣区

关于网关:Traefik监控系统搭建

Traefik 监控零碎搭建

背景

  • 前边的文章 Traefik 学习中曾经介绍了 Traefik 的应用,然而如果没有一个可视化的 Traefik 拜访状态与 Acces Log 的 Dashboard 界面的话,对于一个网关来说实际上是不残缺的,这篇文章就来介绍应用 Prometheus + Grafana + Promtail+ Loki 构建 Traefik 的监控核心
  • Prometheus 是云原生时代事实上的零碎(服务)状态监测规范,通过基于 HTTP 的 pull 形式采集时序数据,能够通过服务发现或者动态配置去获取要采集的指标服务器,反对单主节点工作,反对多种可视化图表及仪表盘 –在本文中 Prometheus 用来收集 Traefik Metrics 数据
  • Grafana 是一个开源的度量剖析与可视化套件。纯 Javascript 开发的前端工具,通过拜访库(如 InfluxDB、Prometheus),展现自定义报表、显示图表等。Grafana 的 UI 更加灵便,有丰盛的插件,功能强大 –在本文中 Grafana 用来展现来自 Prometheus 和 Loki 的数据
  • Promtail 是一个日志收集的代理,它会将本地日志的内容发送到一个 Loki 实例,它通常部署到须要监督应用程序的每台机器 / 容器上。Promtail 次要是用来发现指标、将标签附加到日志流以及将日志推送到 Loki–本文中 Promtail 用来收集 Traefik Access Log
  • Grafana Loki 是一组能够组成一个功能齐全的日志堆栈组件,与其它日志零碎不同的是,Loki 只建设日志标签的索引而不索引原始日志音讯,而是为日志数据设置一组标签,这意味着 Loki 的经营老本更低,效率也能进步几个数量级,一句话形容下 Loki 就是 like Prometheus, but for logs– 本文中Loki 用来整合来自 Promtail 的日志数据

Traefik 配置

  • 对于 Traefik 的配置,最要害的就是开启 Metrics 与 Access Log 的配置,动态配置文件 traefik.toml 如下

    [log]
      level = "WARN"
      format = "common"
      filePath = "/logs/traefik.log"
    [accessLog]
      filePath = "/logs/access.log"
      bufferingSize = 100
      format = "json"
      [accessLog.fields.names]
          "StartUTC" = "drop"
      [accessLog.filters]
        retryAttempts = true
        minDuration = "10ms"
    • 这里只展现日志相干的要害配置
    • StartUTC的设置是为了设置日志应用的时区工夫,配合 TZ 环境变量应用
  • traefik 部署的 Docker Compose 配置文件 traefik.yaml 如下:

    version: '3'
    services:
      reverse-proxy:
        image: traefik
        restart: always
        environment:
          - TZ=Asia/Shanghai
        ports:
          - "80:80"
          - "443:443"
        networks:
          - traefik
        volumes:
          - ./traefik.toml:/etc/traefik/traefik.toml
          - /var/run/docker.sock:/var/run/docker.sock
          - ./config/:/etc/traefik/config/:ro
          - ./acme.json:/letsencrypt/acme.json
          - ./logs:/logs/:rw
        container_name: traefik
        # 网关健康检查
        healthcheck:
          test: ["CMD-SHELL", "wget -q --spider --proxy off localhost:8080/ping || exit 1"]
          interval: 3s
          timeout: 5s
    # 创立内部网卡 docker network create traefik
    networks:
      traefik:
        external: true
    • 要害的局部是:

      • 指定日志应用的时区的环境变量TZ
      • 挂载本地的日志目录./logs

监控零碎搭建

  • Prometheus 配置文件 prometheus-conf.yaml 如下:

    global:
      scrape_interval:     15s
      external_labels:
        monitor: 'codelab-monitor'
    
    scrape_configs:
      - job_name: 'node'
        scrape_interval: 5s
        static_configs:
          - targets: ['traefik:8080']
  • Loki 配置文件loki.yaml

    auth_enabled: false
    
    server:
      http_listen_port: 3100
    
    ingester:
      wal:
        dir: /loki/wal
      lifecycler:
        address: 127.0.0.1
        ring:
          kvstore:
            store: inmemory
          replication_factor: 1
        final_sleep: 0s
      chunk_idle_period: 1h       # Any chunk not receiving new logs in this time will be flushed
      max_chunk_age: 1h           # All chunks will be flushed when they hit this age, default is 1h
      chunk_target_size: 1048576  # Loki will attempt to build chunks up to 1.5MB, flushing first if chunk_idle_period or max_chunk_age is reached first
      chunk_retain_period: 30s    # Must be greater than index read cache TTL if using an index cache (Default index read cache TTL is 5m)
      max_transfer_retries: 0     # Chunk transfers disabled
    
    schema_config:
      configs:
        - from: 2020-10-24
          store: boltdb-shipper
          object_store: filesystem
          schema: v11
          index:
            prefix: index_
            period: 24h
    
    storage_config:
      boltdb_shipper:
        active_index_directory: /loki/boltdb-shipper-active
        cache_location: /loki/boltdb-shipper-cache
        cache_ttl: 24h         # Can be increased for faster performance over longer query periods, uses more disk space
        shared_store: filesystem
      filesystem:
        directory: /loki/chunks
    
    compactor:
      working_directory: /loki/boltdb-shipper-compactor
      shared_store: filesystem
    
    limits_config:
      reject_old_samples: true
      reject_old_samples_max_age: 168h
    
    chunk_store_config:
      max_look_back_period: 0s
    
    table_manager:
      retention_deletes_enabled: false
      retention_period: 0s
    
    ruler:
      storage:
        type: local
        local:
          directory: /loki/rules
      rule_path: /loki/rules-temp
      alertmanager_url: http://localhost:9093
      ring:
        kvstore:
          store: inmemory
      enable_api: true
    frontend:
      max_outstanding_per_tenant: 2048
  • promatil 配置文件promtail.yaml:

    server:
      http_listen_port: 9080
      grpc_listen_port: 0
    
    positions:
      filename: /tmp/positions.yaml
    
    clients:
      - url: http://loki:3100/loki/api/v1/push
    
    scrape_configs:
    - job_name: app
      static_configs:
      - targets:
          - localhost
        labels:
          job: app
          __path__: /var/log/*log
    • 留神这里的 lables 标签中设置的 job 的名字是app,前面在 Grafana 中设置 Dashboard 时须要应用这个值
  • Docker Compose 配置文件 prometheus.yaml 如下:

    version: "3"
    services: 
      prometheus:
        restart: always
        image: prom/prometheus:v2.28.0
        container_name: prometheus
        volumes:
          - ./:/etc/prometheus/
        command:
          - "--config.file=/etc/prometheus/prometheus-conf.yaml"
          - "--storage.tsdb.path=/prometheus"
          - "--web.console.libraries=/etc/prometheus/console_libraries"
          - "--web.console.templates=/etc/prometheus/consoles"
          - "--storage.tsdb.retention.time=720h"
          - "--web.enable-lifecycle"
        ports:
          - 9090:9090
      grafana:
        image: grafana/grafana:8.1.2
        container_name: grafana
        restart: always
        ports:
          - 3000:3000
        depends_on:
          - prometheus
          - loki
      loki:
        image: grafana/loki
        expose:
          - "3100"
        volumes:
          - ./loki.yaml:/etc/loki/local-config.yaml
          - loki_data:/loki
        command: -config.file=/etc/loki/local-config.yaml
    
      promtail:
        image: grafana/promtail
        depends_on:
          - loki
        volumes:
          - /root/traefik/logs:/var/log
          - ./promtail.yaml:/etc/promtail/config.yml
        command: -config.file=/etc/promtail/config.yml
    networks:
      default:
        external:
          name: traefik
    
    volumes:
      loki_data:

Grafana 配置

  • 拜访到 Grafana 后,应用 admin:admin 登录

配置数据源

  • Prometheus:左侧菜单Configuration → Data Sources,点击 / 编辑默认 Prometheus 数据源,配置 URL 为:http://prometheus:9090,Save & Test
  • Loki:左侧菜单Configuration → Data Sources,点击 / 编辑默认 Loki 数据源,配置 URL 为:http://loki:3100,Save & Test
  • 引入两个数据源后能够在左侧面板的 Explore 中查看是否能查问到数据,以 Loki 为例,抉择 Log browser,抉择日志文件,随后点击 Show Logs 应能看到收集到的日志数据

配置 Dashboard

  • 在左侧面板中抉择 Create->Import 能够应用 ID 引入 Grafana Dashboard 市场中提供的反对 Traefik Metrics 的 Dashboard

    • 给 Dashboard 加上星标,就能够在 Configuration->Preferences->Home Dashboard 中设置为首页 Dashboard
  • 在左侧面板中 Create->Import 能够应用 ID:13713引入 Traefik Via Loki 这个 Dashboard,用来展现 Traefik 的 Log

    • 这个 Dashboard 的应用须要做两个配置:

      • 引入 Dashboar 后会发现没数据,此时点击右上角的⚙键,进行 Dashboard 配置,进入 Json Model,将 JSON 配置文件中的所有 {job="/var/log/traefik.log"} 替换成{job="app"}(源于上边的 promtail 的配置),随后 Save Changes->Save Dashboard

      • Dashboard 的 Request Route 局部会报错显示 Panel plugin not found: grafana-piechart-panel,此时执行命令docker exec -i grafana sh -c 'grafana-cli plugins install grafana-piechart-panel' 在容器内装置该插件,随后重启容器 docker restart grafana 即可

其余

  • Grafana 如果仅供本人应用,不倡议将服务裸露在公网,能够参考端口映射将服务映射到本地服务器

参考

  • Traefik 2 监控零碎之 Grafana Prometheus Promtail Loki 完满联合
  • 从 ELK/EFK 到 PLG – 在 EKS 中实现基于 Promtail + Loki + Grafana 容器日志解决方案
  • Traefik Logs
  • loki mkdir wal: permission denied
  • Are you trying to mount a directory onto a file (or vice-versa)?

    • 补充:个别呈现这种谬误时,首先看看本人指定的目录是否存在问题,比方名字是否打错了这种 …
  • Grafana Plugin Install over Docker
  • Traefik Via Loki
  • 另一种计划的参考:ElasticSearch + FileBeat + Grafana
  • Datasource proxy returning “too many outstanding requests”
退出移动版