Моніторинг докер-хостів, контейнерів та контейнерних служб

Я шукав self-hosted моніторингове рішення з відкритим кодом, яке може надати сховище метрик, візуалізацію і оповіщення для фізичних серверів і віртуальних машин, контейнерів і сервісів, що діють усередині контейнерів. Випробувавши Elastic Beats, Graphite і Prometheus, я зупинився на Prometheus. В першу чергу мене залучили підтримка багатовимірних метрик і нескладний в оволодінні мовами запитів. Можливість використання одного і того ж мови для графічних зображень і повідомлення сильно спрощує завдання моніторингу. Prometheus здійснює тестування за методом як чорного, так і білого ящика, це означає, що ви можете тестувати інфраструктуру, а також контролювати внутрішній стан своїх додатків.

Чому вибір припав на Prometheus
  • Весь стек можна розгорнути з використанням контейнерів.
  • Він створений для розподілених систем та інфраструктур.
  • Масштабований збір даних, що не залежить від розподіленого сховища.
  • Гнучка система виявлення сервісів (вбудована підтримка для Kubernetes, Consul, EC2, Azure).
  • Цільової експортер для таких сервісів, як HAProxy, MySQL, PostgreSQL, Memcached, Redis та ін
Екосистема Prometheus величезна. Це означає, що можна знайти метричні експортери для цілого ряду систем, починаючи від бази даних, MQ, HTTP-серверів до систем, пов'язаних з апаратними засобами, таких як IoT або IPMI. Тестування за методом білого ящика також має відмінне покриття. Існують клієнтські бібліотеки Prometheus для Go, Java, Python, Ruby, .NET, PHP та інших мов програмування.
Початок роботи з Prometheus і докером
Якщо ви хочете спробувати стек Prometheus, зверніть увагу на репозиторій dockprom на GitHub. Можна використовувати dockprom в якості початкової точки моніторингового рішення. Це дозволить з допомогою однієї команди управляти цілим стеком: Prometheus, Grafana, cAdvisor, NodeExporter і AlertManager.

Установка
Скопіюйте репозиторій dockprom на докер-хост, перейдіть в директорію dockprom і запустіть compose up:
$ git clone https://github.com/stefanprodan/dockprom
$ cd dockprom
$ docker-compose up -d

Контейнери:
  • Prometheus (метрична база даних)
    http://<-host ip>:9090
  • AlertManager (керування оповіщеннями)
    http://<-host ip>:9093
  • Grafana (візуалізація метрик)
    http://<-host ip>:3000
  • NodeExporter (складальник хостовых метрик);
  • cAdvisor (складальник метрик контейнерів).
Якщо Gafana підтримує аутентифікацію, то сервіси Prometheus і AlertManager не мають такої функції. При наявності базової аутентифікації для Prometheus і AlertManager ви можете видалити відображення портів з файлу docker-compose і використовувати NGINX як зворотний проксі-сервер.
Установка Grafana
Перейдіть на
http://<-host ip>:3000
і авторизуйтесь, використовуючи логін admin і пароль changeme. Ви можете змінити пароль за допомогою Grafana UI або змінивши файл user.config.
З меню Grafana виберіть пункт «Джерела даних» (Data Sources) і клацніть на «Додати джерело даних» (Add Data Source). Щоб додати контейнери Prometheus як джерело даних, використовуйте наступні значення:
  • Назва: Prometheus
  • Тип: Prometheus
  • Url:
    http://prometheus:9090
  • Доступ: proxy
Тепер ви можете імпортувати шаблони панелі керування з директорії Grafana. З меню Grafana виберіть «Панель управління» і натисніть кнопку «Імпорт».
Панель управління докера
Панель управління докера
На панелі управління докера відображені ключові показники для моніторингу використання ресурсів вашого сервера.
  • Час роботи сервера, відсоток простою ЦПУ, кількість ядер ЦПУ, доступна пам'ять, swap та сховище.
  • Графік середньої навантаження системи, графік виконаних і заблокованих IO-процесів, графік переривань.
  • Графік використання ЦПУ в режимах guest, idle, iowait, irq, nice, softirq, steal, system, user.
  • Графік використання пам'яті з розподілу (використано, вільно, буфери, кешованим).
  • Графік використання IO (read Bps, read Bps and IO time).
  • Графік використання мережі пристроями (вхідний Bps, вихідний Bps).
  • Використання Swap та графіки активності.
Панель управління контейнерів докера
Панель управління контейнерів докера
Панель управління контейнерів докера відображає ключові показники для моніторингу використовуваних контейнерів.
  • Загальна навантаження контейнерів ЦПУ, використання пам'яті і сховища.
  • Графік використовуваних контейнерів, графік навантаження системи, графік використання IO.
  • Графік використання контейнера ЦПУ.
  • Графік використання пам'яті контейнера.
  • Графік використання кешувати пам'яті.
  • Графік вхідного використання мережі контейнерів.
  • Графік вихідного використання мережі контейнерів.
На панелі не представлені контейнери, які є частиною стека моніторингу.
Панель управління моніторинговими сервісами
Панель управління моніторинговими сервісами
Панель управління моніторинговими сервісами відображає ключові показники для моніторингу контейнерів, складових моніторинговий стек.
  • Час роботи контейнера Prometheus, загальне використання пам'яті моніторингового стека, фрагменти і серії пам'яті локального сховища Prometheus.
  • Графік використання контейнера ЦПУ.
  • Графік використання пам'яті контейнера.
  • Графіки збережених фрагментів Prometheus і терміновості збереження.
  • Графіки операцій фрагментів Prometheus і тривалості встановлення контрольних точок.
  • Графіки відсотка використаних шаблонів Prometheus, цільових зчитувань і тривалості зчитування.
  • Графік запитів Prometheus HTTP.
  • Графік повідомлень Prometheus.
Контролювати використання пам'яті Prometheus можна приєднанням фрагментів пам'яті локального сховища. Можна змінювати максимальне значення фрагментів у docker-compose.yml. Я налаштував значення
storage.local.memory-chunks
до 100 000. Якщо ви моніторите 10 контейнерів, то Prometheus буде використовувати близько 2 Гб RAM.
Визначення повідомлень
Я встановив три файлу конфігурації повідомлень:
  • Повідомлення сервісів моніторингу targets.rules;
  • Повідомлення хоста докера hosts.rules;
  • Повідомлення контейнерів докера containers.rules.
Ви можете змінювати правила попередження і перезавантажувати їх за допомогою запиту HTTP POST:
curl -X POST http://<-host ip>:9090/-/reload

Повідомлення сервісів моніторингу
Якщо один із цільових об'єктів (node-exporter і cAdvisor) не відповідає більше 30 секунд, увімкніть повідомлення:
ALERT monitor_service_down
IF up == 0
FOR 30s
LABELS { severity = "critical" }
ANNOTATIONS {
summary = "Monitor service non-operational",
description = "{{ $labels.instance }} service is down.",
}

Повідомлення хоста докера
Якщо ЦПУ хоста докера знаходиться під високим навантаженням більше 30 секунд, увімкніть повідомлення:
ALERT high_cpu_load
IF node_load1 > 1.5
FOR 30s
LABELS { severity = "warning" }
ANNOTATIONS {
summary = "Server under high load",
description = "Docker host is under high load the avg load 1m is at {{ $value}}. Reported by instance {{ $labels.instance }} of job {{ $labels.job }}.",
}

Змініть порогове значення навантаження відповідно з кількістю ядер ЦПУ.
Якщо пам'ять хоста докера заповнена, увімкніть повідомлення:
ALERT high_memory_load
IF (sum(node_memory_MemTotal) - sum(node_memory_MemFree + node_memory_Buffers + node_memory_Cached) ) / sum(node_memory_MemTotal) * 100 > 85
FOR 30s
LABELS { severity = "warning" }
ANNOTATIONS {
summary = "Server memory is almost full",
description = "Docker host memory usage is {{ humanize $value}}%. Reported by instance {{ $labels.instance }} of job {{ $labels.job }}.",
}

Якщо сховище хоста докера заповнено, увімкніть повідомлення:
ALERT hight_storage_load
IF (node_filesystem_size{fstype="aufs"} - node_filesystem_free{fstype="aufs"}) / node_filesystem_size{fstype="aufs"} * 100 > 85
FOR 30s
LABELS { severity = "warning" }
ANNOTATIONS {
summary = "storage Server is almost full",
description = "Docker host storage usage is {{ humanize $value}}%. Reported by instance {{ $labels.instance }} of job {{ $labels.job }}.",
}

Повідомлення контейнерів докера
Якщо контейнер не відповідає протягом 30 секунд, увімкніть повідомлення
ALERT jenkins_down
IF absent(container_memory_usage_bytes{name="jenkins"})
FOR 30s
LABELS { severity = "critical" }
ANNOTATIONS {
summary= "Jenkins down",
description= "Jenkins container is down for more than 30 seconds."
}

Якщо контейнер використовує більше 10 % ядер ЦПУ більше 30 секунд, увімкніть повідомлення:
ALERT jenkins_high_cpu
IF sum(rate(container_cpu_usage_seconds_total{name="jenkins"}[1m])) / count(node_cpu{mode="system"}) * 100 > 10
FOR 30s
LABELS { severity = "warning" }
ANNOTATIONS {
summary= "Jenkins high CPU usage",
description= "Jenkins CPU usage is {{ humanize $value}}%."
}

Якщо контейнер використовує понад 1,2 Гб RAM протягом 30 секунд, увімкніть повідомлення:
ALERT jenkins_high_memory
IF sum(container_memory_usage_bytes{name="jenkins"}) > 1200000000
FOR 30s
LABELS { severity = "warning" }
ANNOTATIONS {
summary = "Jenkins high memory usage",
description = "Jenkins memory consumption is at {{ humanize $value}}.",
}

Налаштування сповіщень
Сервіс AlertManager відповідає за передачу повідомлень сервера Prometheus. AlertManager може посилати повідомлення за допомогою електронної пошти, Pushover, Slack, HipChat та інших систем, що використовують інтерфейс webhook.
Тут ви можете проглянути або вимкнути повідомлення:
http://<-host ip>:9093
.
Отримання повідомлень можна налаштувати у файлі alertmanager/config.yml.
Щоб отримувати повідомлення через Slack, необхідно налаштувати інтеграцію, вибравши «Вихідні мережеві прив'язки» на сторінці програми.
Скопіюйте Slack Webhook URL у поле api_url і визначте канал Slack.
route:
receiver: 'slack'

receivers:
- name: 'slack'
slack_configs:
- send_resolved: true
text: "{{ .CommonAnnotations.description }}"
username: 'Prometheus'
channel: '#<channel>'
api_url: 'https://hooks.slack.com/services/<webhook-id>'

Розширення системи моніторингу
Щоб покрити більше одного хоста докера, панель управління Grafana Dockprom можна розширити… Для контролю більшої кількості хостів потрібно розмістити нод-експортер і контейнер cAdvisor на кожному хості і вказати сервер Prometheus для зчитування.
Необхідно активувати стек Prometheus через дата-центр/зону і використовувати характеристику інтеграції, щоб об'єднати всі метрики в певній копії програми Prometheus, яка буде представляти собою загальний огляд інфраструктури. Таким чином, якщо зона або копія програми Prometheus, задіяна в об'єднанні зон, вийде з ладу, моніторингова система буде доступна в зонах.
Ви також можете зробити Prometheus більш резервний, запустивши два ідентичних сервера в кожній зоні. Якщо кілька серверів будуть направляти повідомлення в Alertmanager, це не призведе до появи надлишкових даних, так як Alertmanager виконує дедупликацию.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.