14 grudnia 2021

Docker #4 - Monitoring

Zbieranie danych w celach diagnostycznych

Możemy wyróżnić 3 rodzaje kontenerów w tym przykładzie:

  • Agent Zbiera dane i wystawia web endpoint, aby wygodnie odczytać te dane
  • Magazyn danych w naszym przykładzie prometheus. Zbiera dane i zarządza retencją
  • Odbiorcy danych Wszystkie aplikacje, które konsumują nasze dane diagnostyczne

Przedstawiam kilka rodzajów aplikacji agentów:

  • node-exporter Zbiera dane o fizycznym hoście
  • cadvisor Zbiera dane o innych kontenerach
  • prometheus-pve-exporter Zbiera dane o maszynach wirtualnych w Proxmox.

Zbieranie danych

Zbieranie danych o fizycznej maszynie

version: '3.8'

services:
  node-exporter:
    image: prom/node-exporter:latest
    container_name: node-exporter
    restart: unless-stopped
    hostname: portainer-pc
    ports: [9100:9100]
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command:
      - '--path.procfs=/host/proc'
      - '--path.rootfs=/rootfs'
      - '--path.sysfs=/host/sys'
      - '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'

Node exporter możemy też zainstalować bez dockera.

sudo apt install prometheus-node-exporter

Zbieranie danych o innych kontenerach

version: '3.8'

services:
  cadvisor:
    image: google/cadvisor:latest
    container_name: cadvisor
    restart: unless-stopped
    ports: ['19998:8080']
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:rw
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro

cadvisor dla arm uruchomiony na raspberry PI

  image: braingamer/cadvisor-arm:latest

Monitorowanie Proxmox z poziomu kontenera

  proxmox_monitor:
    image: prompve/prometheus-pve-exporter
    container_name: proxmox_monitor
    restart: unless-stopped
    ports: ['9221:9221']
    volumes:
      - /global_config/docker_data/proxmox_exporter/pve.yml:/etc/pve.yml:ro
default:
    user: root@pam
    token_name: "token_monitor"
    token_value: "333333-aaaa-bbbb-cccc-111111111"
    verify_ssl: false

Magazyn danych

Prometheus docker composer

version: "3.8"

#http://portainer-pc.lan:9090

services:
  prometheus:
    user: 0:0
    network_mode: host
    image: prom/prometheus
    stop_signal: SIGKILL
    container_name: prometheus
    restart: unless-stopped
    command:
      - '--config.file=/config/config.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--storage.tsdb.retention.time=30d'
      - '--storage.tsdb.retention.size=1GB'
      - '--web.console.libraries=/etc/prometheus/console_libraries'
      - '--web.console.templates=/etc/prometheus/consoles'
      - '--web.enable-lifecycle'
    volumes:
      - /global_config/docker_data/prometheus/config:/config
      - /global_config/docker_data/prometheus/data:/prometheus

    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.prometheus.rule=Host(`prometheus.home.robertolechowski.com`)"
      - "traefik.http.routers.prometheus.tls.certresolver=myresolver"
      - "traefik.http.routers.prometheus.service=prometheus_service"
      - "traefik.http.services.prometheus_service.loadbalancer.server.port=9090"

Prometheus config

global:
  scrape_interval:     15s

scrape_configs:
  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"]

  - job_name: "node"
    static_configs:
        - targets: ["portainer-pc.lan:9100", "pi-hole.lan:9100"]
        
  - job_name: 'cadvisor'
    metrics_path: '/metrics'
    static_configs:
      - targets: ["portainer-pc.lan:19998"]

  - job_name: 'pve'
    static_configs:
      - targets: ["192.168.30.70"]
    metrics_path: /pve
    params:
      module: [default]
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: portainer-pc.lan:9221  

Pozostaje nam tylko skonfigurować dashboard w Grafana.

Linki