Установка Prometheus с помощью Docker в CentOS 7

Prometheus – это открытая система мониторинга и темпоральная база данных. Prometheus охватывает множество аспектов мониторинга: генерирование и сбор метрик, оповещение об аномалиях, создание графиков на основе полученных данных и отображение их в дашбордах. Для получения всех этих функций Prometheus предлагает разнообразные компоненты, которые запускаются отдельно, но используются в сочетании.

Docker – это система контейнеризации, которая позволяет инкапсулировать серверные процессы при помощи контейнеров Linux (или других подобных технологий), что значительно упрощает управление ими и изолирует их друг от друга.

Данное руководство поможет установить три ключевых компонента Prometheus с помощью Docker:

  • Сервер Prometheus (для сбора и запроса метрик).
  • Node Exporter (для экспорта системных метрик в совместимом с Prometheus формате).
  • Grafana (веб-дашборд и конструктор графиков, поддерживающий Prometheus и ряд других бэкендов).

Требования

  • Сервер CentOS 7.1.
  • Доступ к sudo (о привилегиях в CentOS можно прочитать здесь).
  • Предустановленная система Docker (инструкции по установке можно найти в разделе 1 этого руководства).

Примечание: Руководство протестировано на сервере CentOS 7.1, ресурсы 1 CPU/512 MB RAM. Настройки Prometheus можно подогнать под разные объёмы ресурсов.

1: Установка Prometheus

Сначала нужно установить систему мониторинга Prometheus.

Сервер является главным объектом экосистемы Prometheus и отвечает за сбор и хранение метрик, а также за обработку запросов и создание оповещений.

Образы контейнеров Docker для всех компонентов Prometheus хранятся на Docker Hub. Образ prom/prometheus без дополнительных опций запускает сервер Prometheus с конфигурационным файлом в  /etc/prometheus/prometheus.yml. Для хранения данных этот образ использует смонтированный том данных Docker в каталоге /prometheus. Этот том данных является каталогом на хосте, который автоматически создаётся системой Docker при первом запуске контейнера.

Существует несколько способов для переопределения стандартного конфигурационного файла. Например, пользовательский конфигурационный файл можно передать в контейнер из файловой системы хоста в томе данных Докер; кроме того, можно создать производный контейнер для хранения конфигурационных файлов. В данном руководстве показано, как передать конфигурационный файл из файловой системы хоста.

Для хранения метрик также существуют различные шаблоны. В этом руководстве используется стандартная функция образа Docker (хранение метрики в томе данных). В качестве альтернативы можно создать контейнер для хранения томов данных.

Для начала создайте конфигурационный файл Prometheus, содержащий необходимый минимум настроек, в файловой системе хоста в ~/prometheus.yml.

nano ~/prometheus.yml

Добавьте в файл следующие параметры:

# A scrape configuration scraping a Node Exporter and the Prometheus server
# itself.
scrape_configs:
# Scrape Prometheus itself every 5 seconds.
- job_name: 'prometheus'
scrape_interval: 5s
target_groups:
- targets: ['localhost:9090'] # Scrape the Node Exporter every 5 seconds.
- job_name: 'node'
scrape_interval: 5s
target_groups:
- targets: ['your_server_ip:9100']

Примечание: Замените your_server_ip IP-адресом сервера.

Теперь Prometheus будет собирать метрики с сервера, на котором он установлен, а также с сервера Node Exporter, который будет настроен позже. Система Prometheus может подключаться внутри своего контейнера при помощи имени localhost, однако ей нужно также собирать метрики с Node Exporter, а для этого необходим внешний IP-адрес (поскольку Node Exporter запускается в отдельном контейнере с отдельным сетевым пространством имён).

Запустите Docker-контейнер Prometheus с внешним конфигурационным файлом:

docker run -d -p 9090:9090 -v ~/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus -config.file=/etc/prometheus/prometheus.yml -storage.local.path=/prometheus -storage.local.memory-chunks=10000

При первом запуске этой команды с Docker Hub будет загружен образ Docker.

Эта команда достаточно длинная и содержит множество опций. Рассмотрим её подробнее:

  • Опция -d запускает контейнер Prometheus в изолированном режиме (то есть контейнер будет запущен в фоновом режиме и не будет останавливаться при помощи клавиш CTRL+C).
  • Опция -p 9090:9090 указывает порт Prometheus (9090) и открывает его для внешнего IP-адреса хост-системы.
  • Опция -v […] монтирует конфигурационный файл prometheus.yml из файловой системы хоста в специально отведённое место в контейнере Prometheus (/etc/prometheus/prometheus.yml).
  • Опция -config.file задаёт местонахождение конфигурационного файла Prometheus в контейнере.
  • -storage.local.path указывает место хранения метрик в контейнере.
  • -storage.local.memory-chunks настраивает использование памяти (512MB) и количество временных рядов (до 1000). Prometheus будет хранить в памяти только 10000 показателей (примерно 10 показателей на ряд) вместо стандартных 1048576. Настоятельно рекомендуется увеличить значение данного параметра, если у вас больше RAM и вам нужно хранить больше временных рядов. Подробнее об этом – в документации Prometheus.

Чтобы просмотреть список всех контейнеров Docker, введите:

docker ps

Для Docker-контейнера Prometheus вывод будет примерно таким:

CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                    NAMES
6a89ac39911e        prom/prometheus      "/bin/prometheus -con"   2 hours ago         Up 2 hours          0.0.0.0:9090->9090/tcp   stoic_pike

Зная ID контейнера (в выводе команды docker ps), можно проверить логи сервера Prometheus при помощи команды:

docker logs container_id

В данном случае команда будет выглядеть так:

docker logs 6a89ac39911e

Чтобы узнать, где в файловой системе хоста хранятся метрики, запустите следующую команду, указав container_id:

docker inspect container_id

Команда вернёт данные о настройках контейнера (включая пути хостов любого смонтированного тома Docker).

В выводе найдите следующий фрагмент:

...
"Mounts": [
{
"Source": "/home/8host/prometheus.yml",
"Destination": "/etc/prometheus/prometheus.yml",
"Mode": "",
"RW": true
},
{
"Name": "821b0abc470a9c758ff35ed5cff69077423a629566082a605a01d8207d57cd6c",
"Source": "/var/lib/docker/volumes/821b0abc470a9c758ff35ed5cff69077423a629566082a605a01d8207d57cd6c/_data",
"Destination": "/prometheus",
"Driver": "local",
"Mode": "",
"RW": true
}
],
...

В данном примере метрики хранятся в /var/lib/docker/volumes/821b0abc470a9c758ff35ed5cff69077423a629566082a605a01d8207d57cd6c/_data на хост-системе. Этот каталог создан автоматически при первом запуске контейнера Prometheus. Он связан с каталогом /prometheus в контейнере. Данные в этом каталоге сохраняются при перезапуске контейнера.

Теперь можно получить доступ к серверу Prometheus:

http://your_server_ip:9090/

Убедитесь в том, что сервер собирает метрики. Для этого перейдите по ссылке:

http://your_server_ip:9090/status

и найдите конечную точку процесса prometheus в разделе Targets. Столбец State этой целевой точки покажет её состояние (HEALTHY).

Наоборот, точка Node Exporter (http://localhost:9100/metrics) будет в состоянии UNHEALTHY, поскольку Node Exporter ещё не был настроен.

Итак, теперь у вас есть запущенный Docker-контейнер Prometheus с пользовательским конфигурационным файлом ~/prometheus.yml, расположенным в файловой системе хоста. Метрики хранятся в каталоге /prometheus в контейнере.

2: Настройка Node Exporter

Node Exporter – это сервер, который показывает метрики хост-машины, на которой он работает (включая метрики файловой системы, сетевых устройств, использование процессора, памяти и многое другое).

Имейте в виду: запуск Node Exporter в Docker – довольно сложная задача, поскольку главная цель этого сервера состоит в сборе метрик хоста, на котором он работает. Если запустить его в Docker без опций, пространство имён ресурсов Docker (файловой системы и сетевых устройств) станет причиной того, что вместо метрик хоста Node Exporter будет экспорт метрики окружения контейнера. Потому, как правило, рекомендуется запускать Node Exporter непосредственно на хост-системе вне контейнера Docker. Тем не менее, если вы хотите управлять всеми процессами с помощью Docker, это поведение можно обойти.

Чтобы запустить Node Exporter на порт 9100 при помощи Docker:

docker run -d -p 9100:9100 -v "/proc:/host/proc" -v "/sys:/host/sys" -v "/:/rootfs" --net="host" prom/node-exporter -collector.procfs /host/proc -collector.sysfs /host/proc -collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)"

Следующие флаги Docker и Node Exporter используются для разумного приближения к метрикам хоста:

  • В Linux Node Exporter собирает большинство метрик из файловых систем /proc и /sys. Эти файловые системы монтируются с хоста в контейнер в каталог /host с помощью флага –v.
  • При помощи флагов -collector.procfs и -collector.sysfs Node Exporter отслеживает файловые системы /proc и /sys в нестандартных местах.
  • Чтобы метрик файловой сообщать метрики файловой системы хоста, нужно также смонтировать в контейнер файловую систему root (/rootfs; для того используйте флаг –v.
  • При помощи флага -collector.filesystem.ignored-mount-points Node Exporter игнорирует другие файловые системы в контейнере, которые не принадлежат хост-системе.
  • Флаг –net=host помещает контейнер в один сетевой стек с хостом.

Обратите внимание: некоторые показатели будут всё же отличаться от результатов, полученных при запуске Node Exporter непосредственно на хосте. В частности, метрики об использовании файловой системы будут иметь префикс /rootfs в метках mountpoint. Также нет гарантии, что описанные методы подойдут для функций Node Exporter в дальнейшем.

Теперь сервер Prometheus будет автоматически собирать данные Node Exporter.

Откройте страницу состояний Prometheus:

http://your_server_ip:9090/status

Убедитесь, что http://your_server_ip:9100/metrics имеет состояние HEALTHY.

3: Установка Grafana

Grafana – это популярный дашборд и конструктор графиков для визуализации временных рядов и показателей приложений, который можно использовать в различных областях. Grafana – очень производительное средство для создания, изучения и совместного использования дашбордов и графиков.

Grafana хранит метаданные дашбордов в реконфигурируемой БД, основанной на SQL. Grafana поддерживает локальные БД SQLite3, а также сторонние БД (MySQL или PostgreSQL).

В этом руководстве используется БД SQLite3.

Запустите Grafana в Docker-контейнере, выбрав пароль администратора:

docker run -d -p 3000:3000 -e "GF_SECURITY_ADMIN_PASSWORD=admin_password" -v ~/grafana_db:/var/lib/grafana grafana/grafana

Примечание: Замените admin_password паролем администратора.

Это загрузит Docker-образ Grafana с Docker Hub и создаст новый том Docker в ~/grafana_db на хост-системе и в /var/lib/grafana в файловой системе контейнера. Затем Grafana автоматически создаст и инициализирует в контейнере БД SQLite3 в /var/lib/grafana/grafana.db.

Флаг –е позволяет передавать переменные среды процессам, запущенным в контейнере Docker. Здесь этот флаг используется для того, чтобы присвоить переменную среды GF_SECURITY_ADMIN_PASSWORD и так переопределить пароль администратора по умолчанию. Переменные среды также могут использоваться для переопределения любых других настроек Grafana.

Чтобы убедиться, что Grafana работает правильно, перейдите по ссылке:

http://your_server_ip:3000/

Введите имя администратора (admin) и пароль (выбранный во время запуска контейнера Docker).

Пройдя аутентификацию, вы увидите главную страницу Grafana.

Примечание: Более подробную информацию о работе с Grafana можно получить в официальной документации программы или в документации для Prometheus.

Заключение

Компоненты Prometheus (сервер, Node Exporter и Grafana) успешно установлены при помощи Docker.

На данный момент все контейнеры запущены на одной машине. Это нормально для демонстрации примеров, но в среде производства рекомендуется запускать Node Exporter на каждой отслеживаемой машине и установить несколько серверов Prometheus.

Tags: , , , ,

2 комментария

Добавить комментарий