Мониторинг Docker контейнеров: настройка cAdvisor, Prometheus и Grafana
- Отсутствие видимости утилизации аппаратных ресурсов отдельными контейнерами.
- Сложность выявления контейнеров, вызывающих троттлинг CPU (CPU Throttling) или утечки памяти.
- Необходимость построения алертов по падению контейнеров и росту ошибок OOM.
1. Развертывание Google cAdvisor через Docker Compose
Создайте файл monitoring-compose.yml:
version: '3.8'
services:
cadvisor:
image: gcr.io/cadvisor/cadvisor:latest
container_name: cadvisor
restart: unless-stopped
privileged: true
ports:
- "8080:8080"
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
- /dev/disk/:/dev/disk:ro
devices:
- /dev/kmsg2. Конфигурация Prometheus (prometheus.yml)
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'cadvisor'
static_configs:
- targets: ['cadvisor:8080']3. Ключевые PromQL-запросы для мониторинга контейнеров
- Утилизация CPU контейнером (%):
sum(rate(container_cpu_usage_seconds_total{name=~".+"}[2m])) by (name) * 100 - Потребление оперативной памяти без учета файлового кэша:
container_memory_working_set_bytes{name=~".+"} - Счетчик троттлинга CPU (CFS Throttling):
rate(container_cpu_cfs_throttled_periods_total[5m]) / rate(container_cpu_cfs_periods_total[5m]) * 100
Частые вопросы (FAQ)
Почему container_memory_usage_bytes показывает 100% памяти, но контейнер не падает по OOM?
Метрика memory_usage_bytes включает в себя кэш страниц файловой системы (page cache), который ядро освобождает по требованию. Для реальной оценки риска OOM Killer используйте метрику container_memory_working_set_bytes.
Зачем монтировать /dev/kmsg в контейнер cAdvisor?
Это необходимо cAdvisor для перехвата сообщений OOM Killer и аппаратных событий ядра Linux из кольцевого буфера dmesg.