Мониторинг Docker-хостов и Docker-контейнеров с помощью Prometheus+Grafana+AlertManager+Node-exporter+Cadvisor

За основу был взять стек мониторинга отсюда и изменен под свои задачи
https://github.com/stefanprodan/dockprom

Репозитарий с мониторинг стеком досутпен по адресу

https://bitbucket.org/kamaok/monstack/src/master/

Базовая архитектурная схема мониторинг стека имеет вид

Mониторинг стек состоит из следующих компонентов:

Prometheus(https://https://prometheus.io/) – сбор и хранение метрик
Доступен на URL https://prometehus.mydomain.com
Grafana(https://grafana.org) — визуализация метрик в виде графиков/панелей на dashboard-ах.
Доступна на URL https://grafana.mydomain.com
AlertManger(https://github.com/prometheus/alertmanager) — отправка сообщений в желаемый канал информации (в нашем случае Slack)
Доступен на URL https://alertmanager.mydomain.com
Caddy(https://caddyserver.com) – обратный прокис-сервер с обеспечением Basic-аутентификации для Prometheus, AlertManager, Pushgateway, а также терминирования SSL-соединений для Prometheus, Grafana, AlertManager, Pushgateway
Node-exporter – сборщик метрик c нод/хостов
Cadvisor — сборщик метрик c контейнеров

Для примера, мониторить будем 4 сервера/хоста,
Server{1,2}.mydomain.com — staging сервера
Server{3,4}.mydomain.com — production сервера

Все сервера Bare-metal(или виртуалки)(не облака) с file-based service discovery в качестве механизма обнаружения хостов используемый в Prometheus
Т.е. добавление серверов на мониторинг выполняется вручную путем добавление их в специальные файлы, которые автоматически перечитываются самим Prometheus-ом и он начинает собирать с добавленных серверов и их контейнеров метрики

Иерархия каталогов/файлов имеет следующий вид


1.Cкопировать файл-шаблон env-example с переменными для docker-compose в .env
(файл, который docker-compose читает при своем запуске) и указать в .env-файле значения для следующих переменных

– это URL для Slack в формате https://hooks.slack.com/services/

– название канала в Slack

– пользователь, от которого будут приходить сообщения в канал Slack(если не указан, то используется пользователь alertmanager)

— пароль пользователя admin, который будет использоваться для аутентификации в Prometheus, Alertmanager, Pushgateway через сервис аутентификации Caddy и для аутентификации в Grafana через встроенную непосредственно в Grafana аутентификацию

— это URL приватного Docker-репозитария, из которого/в который будут загружаться наши кастомные/измененные образы

Файл с переменными имеет вид

2.Собрать и зашрузить в приватный Docker-репозитарий образ для Alertmanager

3.Перетегировать единоразово и загрузить в приватный Docker-репозитарий образ для Caddy
Caddy автоматически получает и автообновляет бесплатные Let’sEncrypt-сертификаты для
Prometheus,grafana,alertmanager,pushgateway. Поэтому для успешного выпуска бесплатных сертификатов от Let’sEncrypt необходимо направить указанные домены {prometheus,grafana,alertmanager,pushgateway}.mydomain.com на IP-адрес сервера, на котором развернут monitoring-стек

Кроме этого Caddy по умолчанию настроен на принудительный редирект с http на https
При первом запуске Caddy попытается получить Let’sEncrypt сертификаты для всех доменов, указанных в кофигурационном файле Caddyfile и для которых не отключено SSL (не указана/не установлен опция tls off)
Больше информации о Caddy доступно из официальной документации
https://caddyserver.com/docs
https://caddyserver.com/docs/automatic-https

Загрузим исходный образ Caddy

Перетегируем его на свой образ

Загрузим наш образ в приватный Docker-репозитарий

Образы для Prometheus, Grafana, Pushgateway, Node-exporter, Cadvisor берем из официальных Docker-репозитариев

В .env файле для docker-compose указаны версии необходимых нам сервисов

После выполнения указанных выше всех трех шагов мониторинг стек готов к своему запуск
Запуск мониторинг стека выполняется командой

Docker-compose.yml имеет вид

Используется версия docker-compose 2.4, чтобы применялись лимиты на ресурсы(если использовать версию 3, тогда для применения лимитов docker-compose.yml файл необходимо запускать в docker swarm)

Создается сеть типа bridge c именем monitor-net, к которой будут подключены все компоненты мониторинг стека

Для statefull-приложений(Prometheus, Grafana, AlertManager), которые хранят свои данные – создаются docker-тома(volume), которые и используются в соответствующих конфигурационных файлов таких statefull-приложений для хранения на них данных приложений

Для всех контейнеров установлены
— лимиты на резервируемый и максимально используемый размер памяти
— метка(используется для запросов PromQL в Grafana),
— формат и размер лог-файла
— имя сети, к которой необходимо подключить контейнер
— политика автоматического перезапуска контейнера (всегда, за исключением корректной остановки/завершения работы)
— имя контейнера

 

Более подробное описание каждого сервиса:

Prometheus
Монтирует конфиги с хостового каталога, а также сохраняет свои данные на томе prometheus_data
Время хранения метрик – 1500 часов ~2 месяца (—storage.tsdb.retention.time)
Включена возможность перечитывания конфигурационного файла Prometheus с помощь HTP POST-запроса (—web.enable-lifecycle)

С помощью параметра extra_hosts задаем соответствие имени хоста и его IP-адреса (такое соответствие будет добавлено в файл /etc/hosts внутри контейнера с Prometheus), что позволит Prometheus корректно разименовать хосты и подключиться к ним для сбора метрик
Это необходимо,если, например, доменные имена для целевых хостов не настроены в DNS или имена нстроены в DNS, но разименовываются в IP-адреса, на которых не слушают запросы экспортеры метрик(node-exporter, cadvisor). Такая ситуация, например, возможна, когда доступ к целевым хоста для сбора метрик возможен только по VPN-адресу или по внутренним IP-адресам(на которые в DNS не разименовываются доменные адреса целевых хостов)

Alertmanager
Сохраняет свои данные на томе alertmanager_data
Конфигурационный файл alertmanager.yml уже находится/зашит нами ранее в образ
При старте контейнера выполняется скрипт docker-entrypoint.sh в качестве ENTRYPOINT, в котором динамически подставляются значение параметров
SLACK_URL, SLACK_CHANNEL, SLACK_USER в конфигурационный файл alertmanager.yml
Если необходимо изменить настройки в конфигурационном файле alertmanager.yml, тогда пересобираем образ и пересоздаем контейнер с alertmanager

Либо с помощью одной команды

После чего проверить наличие сделанных в Alertmanager GUI
https://alertmanager.mydomain.com


Сaddy

Монтирует свой конфигурационный файл Caddyfile с хостового каталога, а также сохраняет свои данные( в том числе выпущенные SSL-сертификаты) в хостовом каталоге
Для аутентификации в Caddy( и соотвественно получения доступа к Prometheus, Alertmanager, Pushgateway, для которых Caddy выступает proxy-сервером) используются значения параметров
ADMIN_USER, ADMIN_PASSWORD, указанных в .env-файле (если не указаны, тога используется admin/admin)
Для Grafana сервиса Caddy выступает в качестве proxy-сервера и не требует базовую аутентификацию при запросах к Grafana т.к. сама Grafana имеет свой внутренний родной механизи аутентификации по логину/паролю

Grafana
Монтирует каталог с источником, откуда брать данные(/grafana/datasources) и каталог своих dashboard-ов (/grafana/dashboards) с хоста
Grafana поддержует динамический provisioning как источников данных/метрик(datasource), так и dashboard-ов
http://docs.grafana.org/administration/provisioning/
Grafana преднастроена для работы с дефолтным истоником данных — Prometheus

Сохраняет свои данные на томе grafana_data
Для аутентификации в Grafana используются значения параметров
ADMIN_USER, ADMIN_PASSWORD, указанных в .env-файле (если не указаны, тога используется admin/admin)
Запрещена регистрация новых пользователей(GF_USERS_ALLOW_SIGN_UP=false)
Отключена отдача метрик самой Grafana(GF_METRICS_ENABLED=false)

В комплект включены следующие dashboard-ы

Host Dashboard
Отображает ключевые метрики для мониторинга ресурсов, используемых хостами

Containers Dashboard
Отображает ключевые метрики запущенных контейнеров

Monitor Services Dashboard
Отображает ключевые метрики для мониторинга контейнеров, которые входят в мониторинг стек

 

Nodeexporter
Запускается для мониторинга хоста, на котором развернут мониторинг стек(т.е. самого себя)

Cadvisor
Запускается для мониторинга контейнеров, запущенных на хосте, на котором развернут мониторинг стек(т.е. мониторинг всех сервисных/служебных контейнеров стека)

Pushgateway
Запускается для приема/получения метрик от хостов/сервисов, которые настроены на отправку таких метрик или от краткосрочных приложений(cron-задач), которые не запущены постоянно и соотвественно Prometheus не может поучать с них метрики
Для отправки метрик такому Pushgateway можно выполнить команду типа

 

Конфигурационный файл Prometheus – prometheus.yml имеет вид

Метка,используемая для определения сервера, с которого было отправлено оповещение в AlertManager

Файлы с правилами

Отправка уведомление в AlertManager при срабатывании правила

Снятие метрик/мониторинг prometheus самого себя prometheus-ом

Снятие меток/мониторинг с Pushgateway

Снятие метрик c Node-exporter-а, который запущен на мониторинг хосте (мониторинг хоста, на котором запущен мониторинг стек)

Снятие метрик c Cadvisor, который запущен на мониторинг хосте (мониторинг контейнеров, запущенных на мониторинг хосте)

Снятие метрик c Node-exporter-а целевых хостов(мониторинг ресурсов целевых хостов)

Снятие метрик c Cadvisor целевых хостов(мониторинг запущенных контейнеров на целевых хостах)

При добавлении хостов в файлы sd/targets-node-exporter.yml/ и/или sd/targets-cadvisor.yml Prometheus автоматически их перечитывает и начинает собирать метрики с указанных хостов/контейнеров

 

Для добавления целевого хоста и запущенных на нем контейнеров на мониторинг необходимо:

1.Установить Node-exporter и Cadvisor на целевом хосте и проверить доступность метрик с мониторинг хоста до Node-exporter и Cadvisor

2. Добавить в опцию extra-hosts в service prometheus в docker-compose.yml файле соотвествие имени хоста и его IP-адреса

3.Пересобрать Prometheus контейнер и проверить налиичие добавленных строк в файле /etc/hosts внутри Prometheus-экспортера

4.Добавить в Prometheus сбор метрик с Node-exporter/Cadvisor с целевого хоста

5.Проверить наличие добавленных целей для Node-exporter и Cadvisor в Prometheus GUI
https://prometheus.mydomain.com/targets


Правила Prometheus

Для мониторинг ресурсов хостов использую следующие правила

 

Для мониторинг ресурсов контейнеров использую следующие правила
Мониторим только наличие необходимых запущенных контейнеров
Правила для метрик контейнеров не настраивал

 

Изменение/добавление/удаление правил Prometheus

1.Изменение/добавление/удаление правила в файле/файлах prometheus/containers_rules.yml/ prometheus/containers_rules.yml

2.Прверка синтаксиса основного конфигурационного файла prometheus и всех подключаемых файлов с правилами

Как получить утилиту promtool указано в этой статье
https://kamaok.org.ua/?p=3090
3.Перезагрузка основного конфигурационного файла Prometheus путем отправки HTTP POST-запроса

4.Проверка наличия изменений в правилах через Prometheus GUI
https://prometheus.mydomain.com/alerts

Мониторинг различных приложений настраивается в файле  и  такая настройка изложена в отдельных статьях

Мониторинг Nginx в Prometheus
Мониторинг PHP-FPM в Prometheus
Мониторинг Redis в Prometheus
Мониторинг MySQL в Prometheus
Мониторинг Beanstalkd в Prometheus
Мониторинг Varnish
Мониторинг доступности сайта в Prometheus
Мониторинг ICMP-доступности хоста в Prometheus
Мониторинг доступности порта хоста в Prometheus

 

Источник:
https://github.com/stefanprodan/dockprom
https://prometheus.io/docs/prometheus/latest/getting_started

Комментирование и размещение ссылок запрещено.

Комментарии закрыты.

Яндекс.Метрика