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

Статья от Prometheus соавтора Юлиуса Волца

Вступление

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

Docker позволяет вам инкапсулировать серверные процессы, используя контейнеры Linux (или другие технологии инкапсуляции), чтобы их было проще контролировать и изолировать друг от друга. Чтобы узнать больше о Docker, см. Https://www.digitalocean.com/community/tutorials/the-docker-ecosystem-an-introduction-to-common-components[The экосистема Docker: Введение в общие компоненты].

В этом уроке мы узнаем, как установить три ключевых компонента для использования Prometheus в Docker. Это:

  • Сервер Prometheus для сбора метрик и запроса их

  • Node Exporter для экспорта системных метрик в формате, совместимом с Prometheus

  • Grafana, веб-инструмент для построения графических панелей, который поддерживает Prometheus среди других бэкэндов

В экосистеме Прометея есть еще много компонентов, но эти три обеспечивают хорошую отправную точку для использования Прометея.

Предпосылки

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

Шаг 1 - Установка Прометея

В этом разделе объясняется, как установить основной сервер Prometheus с помощью Docker. Обязательно установите Docker в соответствии с разделом * Prerequisites *, прежде чем продолжить. Сервер Prometheus является центральной частью экосистемы Prometheus и отвечает за сбор и хранение метрик, а также за обработку запросов выражений и генерацию предупреждений.

Образы контейнеров Docker для всех компонентов Prometheus размещаются в организации * https: //hub.docker.com/u/prom/ [prom] * на Docker Hub. Запуск образа Docker + prom / prometheus + без каких-либо дополнительных параметров запускает сервер Prometheus с примером файла конфигурации, расположенного в + / etc / prometheus / prometheus.yml + внутри контейнера. Он также использует Docker объем данных, смонтированный в `+ / prometheus + `внутри контейнера для хранения собранных данных метрик. Этот каталог тома данных на самом деле является каталогом на хосте, который Docker автоматически создает при первом запуске контейнера. Данные внутри него сохраняются между перезапусками одного и того же контейнера.

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

Существуют и другие схемы организации хранения метрик. В этом руководстве мы будем использовать стандартное поведение образа Docker, используя https://www.digitalocean.com/community/tutorials/how-to-work-with-docker-data-volumes-on-ubuntu-14-04. [Объем данных Docker] для хранения метрик. В качестве альтернативы вы можете рассмотреть возможность создания контейнера тома данных, если он лучше соответствует вашим потребностям.

Сначала создайте минимальный файл конфигурации Prometheus в файловой системе хоста по адресу + ~ / prometheus.yml +:

nano ~/prometheus.yml

Добавьте следующее содержимое в файл (замените ++ на IP-адрес вашего дроплета):

~ / 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: [':9100']

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

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

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 из Docker Hub.

Эта команда довольно длинная и содержит много параметров командной строки. Давайте посмотрим на это более подробно:

  • Опция + -d + запускает контейнер Prometheus в отдельном режиме, это означает, что контейнер будет запущен в фоновом режиме и не будет завершен нажатием + CTRL + C +.

  • Опция + -p 9090: 9090 + открывает веб-порт Prometheus (9090) и делает его доступным через внешний IP-адрес хост-системы.

  • Опция + -v […​] + монтирует файл конфигурации + prometheus.yml + из файловой системы хоста в место внутри контейнера, где Prometheus ожидает его (+ / etc / prometheus / prometheus.yml +) ,

  • Параметр + -config.file + устанавливается в соответствии с расположением файла конфигурации Prometheus within в контейнере.

  • Параметр + -storage.local.path настраивает место хранения метрик в контейнере.

  • Наконец, опция + -storage.local.memory-chunks + регулирует использование памяти Prometheus в соответствии с очень небольшим объемом ОЗУ хост-системы (всего 512 МБ) и небольшим количеством хранимых временных рядов в этом руководстве (чуть менее 1000). Он указывает Prometheus хранить в памяти только 10000 фрагментов (примерно 10 блоков на серию) вместо значения по умолчанию 1048576. * Это значение, которое вам обязательно нужно будет настроить * при запуске Prometheus на машине с большим объемом оперативной памяти и при хранении большего количества временных рядов. Обратитесь к http://prometheus.io/docs/operating/storage/[storage документации Prometheus для получения более подробной информации по этому вопросу.

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

docker ps

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

Output of `docker ps`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

Используя идентификатор контейнера, показанный в выводе + docker ps +, вы можете проверить журналы работающего сервера Prometheus с помощью команды:

docker logs

В нашем примере команда будет такой:

docker logs

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

docker inspect

Это выведет информацию о конфигурации вашего контейнера, включая пути к хостам любых подключенных томов Docker.

Найдите в выводе раздел, который выглядит примерно так:

Output of `docker inspect ...`...
"Mounts": [
   {
       "Source": "/home/sammy/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 / volume / 821b0abc470a9c758ff35ed5cff69077423a629566082a605a01d8207d57cd6c / _data + в хост-системе. Этот каталог был автоматически создан Docker при первом запуске контейнера Prometheus. Он отображается в каталог + / prometheus + в контейнере. Данные в этом каталоге сохраняются при перезапуске того же контейнера. При желании вы также можете смонтировать существующий каталог хоста для хранения данных метрик. См. Https://www.digitalocean.com/community/tutorials/how-to-work-with-docker-data-volumes-on-ubuntu-14-04[Как работать с томами данных Docker в Ubuntu 14.04], чтобы узнать, как для достижения этой цели. Эта статья написана для Ubuntu 14.04, но команды и файлы конфигурации докера одинаковы для CentOS 7.

Теперь вы сможете получить доступ к серверу Prometheus по адресу + http: //: 9090 / +. Убедитесь, что он собирает метрики о себе, перейдя в + http: //: 9090 / status + и найдя конечную точку + http: // localhost: 9090 / metrics + для задания + prometheus + в * Targets * раздел. Столбец * State * для этой цели должен показывать состояние цели как * HEALTHY *. Напротив, конечная точка + http: // localhost: 9100 / metrics + (Node Exporter) должна по-прежнему отображаться как * UNHEALTHY *, так как Node Exporter еще не запущен и поэтому не может быть очищен:

изображение: https: //assets.digitalocean.com/articles/prometheus_install_docker/unhealthy.png [Цель Node Exporter должна быть показана как НЕЗДОРОВАЯ]

Подводя итог, теперь у вас есть Prometheus, работающий в качестве контейнера Docker с использованием пользовательского файла конфигурации Prometheus + ~ / prometheus.yml +, который находится в файловой системе хоста. Хранилище метрик находится в каталоге + / prometheus + в контейнере, который поддерживается в хост-системе путем, указанным командой + docker inspect +, объясненной в этом разделе.

Шаг 2 - Настройка Node Exporter

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

Обратите внимание, что запуск Node Exporter в Docker сопряжен с некоторыми трудностями, поскольку вся его цель состоит в том, чтобы представить метрики о хосте, на котором он работает. Если мы запустим его в Docker без дальнейших опций, пространство имен ресурсов Docker, таких как файловая система и сетевые устройства, приведет к тому, что он будет экспортировать только метрики о среде контейнера, которые будут отличаться от среды хоста. Поэтому обычно рекомендуется запускать Node Exporter непосредственно в хост-системе вне Docker. Однако если у вас есть требование управлять всеми вашими процессами с помощью 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 используются для обеспечения разумного приближения для метрик host:

  • В Linux Node Exporter собирает большинство своих метрик из файловых систем + / proc + и + / sys +. Эти файловые системы монтируются с хоста в контейнер под каталогом + / host +, используя флаг Docker + -v +.

  • Посредством флагов + -collector.procfs + и + -collector.sysfs + Node Exporter мы указываем Node Exporter искать файловые системы + / proc + и + / sys + в нестандартном месте.

  • Чтобы сообщить о метриках файловой системы хоста, мы также монтируем всю корневую (+ / +) файловую систему в контейнер (в + / rootfs +), снова используя флаг Docker + -v +.

  • Используйте флаг Node Exporter + -collector.filesystem.ignored-mount-points +, чтобы игнорировать любые другие файловые системы в контейнере, которые не принадлежат хост-системе. Этот параметр принимает регулярное выражение точек монтирования, чтобы исключить его из сообщаемых показателей.

  • Используя флаг Docker + - net = host +, мы помещаем контейнер в тот же сетевой стек, что и хост, так что чтение из файлов, таких как + / proc / net / dev +, даст те же результаты, что и для хост (чтение из файловой системы + / proc +, смонтированной с хоста, недостаточно).

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

Сервер Prometheus теперь должен автоматически начать очистку Node Exporter. Перейдите на страницу состояния вашего сервера Prometheus по адресу + http: //: 9090 / status + и убедитесь, что цель + http: //: 9100 / metrics + для задания + node + теперь показывает состояние * HEALTHY * :

изображение: https: //assets.digitalocean.com/articles/prometheus_install_docker/healthy.png [Цель Node Exporter должна быть показана как ЗДОРОВАЯ]

Шаг 3 - Настройка Графана

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

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

В этом руководстве мы будем использовать базу данных SQLite3, подкрепленную томом данных Docker. См. Https://www.digitalocean.com/community/tutorials/how-and-when-to-use-sqlite[How и когда использовать Sqlite] для получения дополнительной информации.

Запустите Grafana как Docker-контейнер с паролем администратора (++) на ваш выбор:

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

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

Флаг + -e + позволяет передавать переменные среды процессу, запущенному внутри контейнера Docker. Здесь мы используем его для установки переменной окружения + GF_SECURITY_ADMIN_PASSWORD + на требуемый пароль администратора панели мониторинга, переопределяя пароль по умолчанию + admin +. Переменные среды также могут использоваться для переопределения любых других параметров конфигурации Grafana. См. Http://docs.grafana.org/installation/configuration/#using-environment-variables[Using переменные среды] для получения более подробной информации.

Чтобы убедиться, что Grafana работает правильно, перейдите к + http: //: 3000 / +. Имя пользователя администратора - + admin, а пароль - тот, который вы выбрали при запуске контейнера Docker ранее.

изображение: https: //assets.digitalocean.com/articles/prometheus_install_docker/grafana_login.png [Войти в Grafana с выбранным паролем]

После входа в систему вы должны увидеть главный вид Grafana:

изображение: https: //assets.digitalocean.com/articles/prometheus_install_docker/grafana_main.png [основной вид Grafana]

Смотрите документацию Grafana, чтобы узнать больше о том, как начать работу с Grafana. В Prometheus Grafana документации также показано, как использовать Grafana в сочетании с Prometheus специально.

Заключение

Поздравляем! Вы настроили сервер Prometheus, Node Exporter и Grafana - все с помощью Docker. Несмотря на то, что все они в настоящее время работают на одной машине, это только для демонстрационных целей. В производственных настройках обычно нужно запускать Node Exporter на каждом отслеживаемом компьютере, на нескольких серверах Prometheus (в соответствии с требованиями организации), а также на одном сервере Grafana для отображения данных с этих серверов.

Чтобы узнать больше об использовании Prometheus в целом, обратитесь к его documentation.

Related