Исходный сайт представленного материала: r4ven.me
Приветствую!
В данной инструкции мы с вами развернем популярную систему мониторинга Zabbix с использованием TimescaleDB – плагина для БД PostgreSQL, позволяющего эффективно работать с “временнЫми рядам”. Все это добро мы завернем внутрь docker контейнеров 🐳. Будет интересно 😉.
Напомню, что в одной из прошлых заметок мы обсуждали, что такое системы мониторинга в IT, какие виды бывают и немного узнали о популярных реализациях на сегодняшний день, среди которых – Zabbix.
Присоединяйтесь к нашему каналу в телеграм: t.me/r4ven_me, уведомления о новых постах приходят туда в день публикации. А если у вас есть вопросы или просто желание пообщаться по тематике – заглядывайте в чат: t.me/r4ven_me_chat.
Сразу прошу обратить внимание на то, что все действия описанные в данном руководстве вы делаете на свой риск и ответственность. Прошу это понимать. Мой блог – лишь площадка, где я рассказываю про свой опыт и делюсь своим мнением по каким-либо вещам и явлениям. Спасибо за понимание.Иван Чёрный
Введение
Особенностью инсталяции, описываемой в этой статье является не только развертывание системы мониторинга Zabbix в docker контейнерах, но и использование ее в связке с базой данных временных рядов – TimescaleDB.
Прежде чем мы начнем, давайте дадим несколько определений в качестве введения.
Zabbix — это открытая платформа для мониторинга сетей и серверов. Для хранения данных использует реляционные СУБД, например: PostgreSQL, MySQL, MariaDB, Oracle, SQLite и т.д.
Временные ряды в базах данных (time series) — это набор данных, упорядоченных по времени, где значения регистрируются через равные или неравные интервалы времени.
Базы данных временных рядов (time series database) — это специализированные базы данных, предназначенные для эффективного хранения, управления и анализа временных рядов. Часто это no sql базы данных.
TimescaleDB (TSDB) — это расширение для PostgreSQL, которое оптимизирует работу с временными рядами в данной СУБД, сохраняя при этом всю мощь и гибкость классических SQL like баз данных. С определенного времени Zabbix научился работать с данной СУБД.
Цитата из официальной документации Zabbix:
Zabbix supports TimescaleDB, a PostgreSQL-based database solution of automatically partitioning data into time-based chunks to support faster performance at scale.Zabbix.com
Для лучшего понимания причины выбора именно такой связки, рекомендую статью на Habr: Zabbix, временные ряды и TimescaleDB.
Прошу вас также обратить внимание на предупреждение из оф. документации Zabbix:
Warning: Currently, TimescaleDB is not supported by Zabbix proxy.Zabbix.com 09.2024
Уверен, что в будущем это поправят. А пока хватит трепа, переходим к делу🤵♂️.
Подготовка
Разворачивать Zabbix будем в среде дистрибутива Debian 12 💿 с установленным Docker engine 🐳. Если у вас еще нет готового Linux сервера, то рекомендую мои предыдущие статьи:
Также для дальнейшей работы нам понадобится пользователь с правами root.
Установка необходимых утилит
Сегодня нам понадобятся утилиты для взаимодействия с веб. Открываем терминал и устанавливаем систему контроля версий git и утилиту curl:
sudo apt update && sudo apt install -y git curl
Скачивание файлов проекта
Все файлы проекта находятся в моем репозитории на GitHub. Клонируем его с помощью установленной ранее утилиты git по пути /opt/zabbix:
sudo git clone https://github.com/r4ven-me/zabbix /opt/zabbix
Описание файлов проекта:
docker-compose.yml – файл описания сервисов, запускаемых в docker контейнерах:
Секция NETWORK – определяет две виртуальные сети docker:
- zbx_net_backend – изолированная сеть для взаимодействия контейнеров postgres-server, zabbix-server, zabbix-web и zabbix-agent;
- zbx_net_frontend – сеть с доступом к контейнерам со стороны хостовой ОС: для контейнеров zabbix-server и zabbix-web.
Секция SERVICES – определяет параметры запускаемых сервисов/контейнеров:
- postgres-server – сервис СУБД TimescaleDB;
- zabbix-server – сервис Zabbix сервера;
- zabbix-web – сервис веб интерфейса для Zabbix сервера (под капотом nginx + php-fpm);
- zabbix-agent – сервис агента Zabbix для сбора метрик с самого сервера Zabbix.
Секция SECRETS – определяет файлы, содержащие чувствительную информацию, которые прокидываются внутрь контейнеров postgres-server, zabbix-server и zabbix-web:
- POSTGRES_USER (файл ./env/.POSTGRES_USER) – имя пользователь для базы данных Zabbix в СУБД TimescaleDB;
- POSTGRES_PASSWORD (файл ./env/.POSTGRES_PASSWORD) – соответственно, пароль пользователя.
env – директория с файлами, содержащие переменные окружения, значения которых передаются внутрь контейнера при его запуске:
- .env_db – параметры для postgres-server;
- .env_srv – параметры для zabbix-server;
- .env_web – параметры для zabbix-web;
- .env_agent – параметры для локального zabbix-agent;
- .POSTGRES_PASSWORD – пароль пользователя в БД zabbix;
- .POSTGRES_USER – имя пользователя в БД zabbix.
src – директория с исходными файлами для сборки кастомного контейнера zabbix-server с расширенным функционалом:
- alertscripts – директория с файлами для отправки уведомлений в Telegram:
- docker-entrypoint.sh – скрипт подготовки окружения внутри контейнера (не изменялся);
- Dockerfile – кастомизированный файл описания сборки образа;
- externalscripts – директория со скриптом мониторинга делегирования домена.
При необходимости, отредактируйте блок deploy у нужных сервисов в файле docker-compose.yml, в зависимости от серверных ресурсов, которыми располагаете. По умолчанию используются самые минимальные значения.
Создание сервисного пользователя zabbix
В целях безопасности создаем ограниченные в правах группу и сервисного пользователя для запуска контейнеров zabbix:
sudo addgroup --system --gid 1995 zabbix
sudo adduser --system --gecos "Zabbix monitoring system" \
--disabled-password --uid 1997 --ingroup zabbix \
--shell /sbin/nologin --home /opt/zabbix/zabbix_data zabbix
adgroup – команда создания группы;
- --system – помечает группу, как системную и применяет к ней установленные политики;
- --gid 1995 – указывает явный идентификатор группы (GID) – в данном случае 1995 (именно такой GID задают разрабы Zabbix в своих контейнерах);
- zabbix – название создаваемой группы;
adduser – команда создания пользователя
- --system – помечает группу, как системную и применяет к ней установленные политики;
- --gecos – позволяет задать описание пользователя;
- --disabled-password – отключает пароль у пользователя (в таком случае под ним нельзя авторизоваться в системе с помощью пароля);
- --uid 1997 – указывает явный идентификатор пользователя (UID) – в данном случае 1997 (именно такой UID задают разрабы Zabbix в своих контейнерах);
- --ingroup zabbix – добавляет пользователя в созданную ранее группу zabbix;
- --shell /sbin/nologin – в качестве оболочки пользователя устанавливает nologin – под ней невозможно авторизоваться в системе;
- --home /opt/zabbix/zabbix_data – задает домашний каталог пользователя, в нашем случае это директория с файлами сервисов zabbix;
- zabbix – имя создаваемого пользователя.
Создание сервисного пользователя postgres
Теперь аналогичным образом создаем группу и пользователя для запуска контейнера TimescaleDB:
sudo addgroup --system --gid 70 postgres
sudo adduser --system --gecos "PostgreSQL database" \
--disabled-password --uid 70 --ingroup postgres \
--shell /sbin/nologin --home /opt/zabbix/postgres_data postgres
Проверяем наличие всех нужных файлов и папок:
ls -l /opt/zabbix
Отлично, идем дальше 🚶.
Создание пароля для базы данных Postgres
По умолчанию в файле /opt/zabbix/env/.POSTGRES_PASSWORD я задал для БД zabbix одноименный пароль. Но крайне рекомендую сгенерировать новый, например такой командой:
tr -cd "[:alnum:]" < /dev/urandom | head -c 30 \
| sudo tee /opt/zabbix/env/.POSTGRES_PASSWORD
Команда tr -cd с помощью механизма перенаправления стандартных потоков получает на ввод латинские буквы и цифры (класс символов [:alnum:]), генерируемые псевдоустройством /dev/urandom. Затем команда head, получая данные по конвейеру, с помощью ключа -c отбирает 30 первых символов (байт). И в конце, полученная псевдорандомная строка передается на ввод команде tee, запущенной от имени суперпользователя. Полученные данные tee записывает в указанный файл (/opt/zabbix/env/.POSTGRES_PASSWORD) и дублирует вывод в стандартный поток (stdout).
Не обращайте внимания на символ % в конце строки моего примера. Это особенность командной оболочки ZSH, которая выводит его (или # для root) при отсутствии символа перевода строки.
Запуск Zabbix стека с помощью docker compose
Старт Postgres сервера
Первым запускаем сервер СУБД, такой командой:
sudo docker compose -f /opt/zabbix/docker-compose.yml up -d postgres-server
После загрузки образа и запуска контейнера смотрим его вывод:
sudo docker logs -f postgres-server
При успешном запуске, вы увидите подобное:
При первом старте, внутри контейнера выполняются скрипты подготовки окружения и базовой конфигурации СУБД в зависимости от параметров сервера. В одном из моих тестов такой скрипт выставлял параметр max_connections равным 25 – чего недостаточно даже для импорта схемы БД zabbix и процесс выпадет в ошибку:
FATAL: sorry, too many clients already
Проверить значение max_connections можно такой командой:
sudo grep 'max_connections' /opt/zabbix/postgres_data/postgresql.conf
Если у вас <=25, то этот параметр необходимо увеличить. Открываем файл на редактирование любым консольным редактором, например, Vim/Neovim 😎:
sudo vim /opt/zabbix/postgres_data/postgresql.conf
Находим там строку:
max_connections = 25
И меняем ее, например, на:
max_connections = 200
Сохраняем файл, выходим из редактора.
Для применения изменений перезапускаем контейнер postgres-server и проверяем текущее значение max_connections:
sudo docker compose -f /opt/zabbix/docker-compose.yml restart postgres-server
sudo docker exec -it postgres-server psql -U zabbix -c "SHOW max_connections;"
Все применилось, переходим к запуску контейнера zabbix-server.
Старт Zabbix сервера
Запускаем его такой командой:
sudo docker compose -f /opt/zabbix/docker-compose.yml up -d zabbix-server
Смотрим вывод контейнера:
sudo docker logs -f zabbix-server
При первом запуске, котейнер запустит создание базы. Это займет некоторое время. Вывод остановится на такой строке:
Creating 'zabbix' schema in PostgreSQL
Обязательно дождитесь завершения процедуры создания БД!
При успешном запуске вы должны увидеть что-то подобное:
Возможно в самом конце будет вывод, подобный этому:
256:20240922:121849.602 Zabbix agent item "system.cpu.util[,system]" on host "Zabbix server" failed: first network error, wait for 15 seconds
225:20240922:121855.944 item "Zabbix server:zabbix[vmware,buffer,pused]" became not supported: No "vmware collector" processes started.
225:20240922:121858.958 item "Zabbix server:zabbix[process,report writer,avg,busy]" became not supported: No "report writer" processes started.
225:20240922:121859.962 item "Zabbix server:zabbix[process,report manager,avg,busy]" became not supported: No "report manager" processes started.
256:20240922:121904.599 Zabbix agent item "system.users.num" on host "Zabbix server" failed: another network error, wait for 15 seconds
256:20240922:121919.602 Zabbix agent item "system.cpu.load[all,avg5]" on host "Zabbix server" failed: another network error, wait for 15 seconds
225:20240922:121928.010 item "Zabbix server:zabbix[connector_queue]" became not supported: connector is not initialized: please check "StartConnectors" configuration parameter
225:20240922:121929.016 item "Zabbix server:zabbix[process,connector manager,avg,busy]" became not supported: No "connector manager" processes started.
225:20240922:121930.021 item "Zabbix server:zabbix[process,connector worker,avg,busy]" became not supported: No "connector worker" processes started.
256:20240922:121934.600 temporarily disabling Zabbix agent checks on host "Zabbix server": interface unavailable
Не обращаем на него внимания.
Проверяем статус запущенных контейнеров:
sudo docker ps
Все ок – идем дальше.
Создание схемы для TimescaleDB
Выводим созданный ранее пароль в терминал, скоро он нам понадобится. Затем подключаемся к оболочке контейнера zabbix-server:
sudo cat /opt/zabbix/env/.POSTGRES_PASSWORD
sudo docker exec -it zabbix-server bash
Теперь импортируем схему TimescaleDB с помощью SQL скрипта, который разработчики Zabbix любезно положили в системные файлы. При вводе команды импорта у нас запросят пароль от БД, который мы вывели на предыдущем шаге:
psql -h postgres-server -U zabbix zabbix < /usr/share/doc/zabbix-server-postgresql/timescaledb.sql
Процесс импорта представляет собой простое перенаправление содержимого SQL скрипта на вводе команды подключения к БД с помощью psql.
Вывод должен быть таким:
Выходим из контейнера zabbix-server и проверяем наличие информации о чанках (chunks) в Postgres:
exit
sudo docker exec -it postgres-server \
psql -U zabbix -c "SELECT * FROM chunks_detailed_size('history')"
Если вывод у вас такой же, как на скрине выше, то все импортировалось успешно 🥳.
На этом этапе БД Postgres/TimesacleDB и Zabbix сервер готовы 😉.
Старт всего стека TimesacleDB + Zabbix server + Zabbix web + Zabbix agent
Останавливаем запущенные контейнеры и запускаем всю инсталляцию, включая Zabbix web и Zabbix agent:
sudo docker compose -f /opt/zabbix/docker-compose.yml down
sudo docker compose -f /opt/zabbix/docker-compose.yml up -d
Проверяем все ли контейнеры запустились корректно:
sudo docker ps
sudo docker compose -f /opt/zabbix/docker-compose.yml logs -f
Отлично. Теперь проверим работу самого Zabbix:
curl -I http://localhost:8080
nc -zv localhost 10051
ss -tulnap | grep -E '8080|10051'
Первой командой мы проверили доступность веб интерфейса из консоли, второй – доступность порта zabbix-server, а третьей вывели порты, прослушиваемые хостовой ОС.
Отлично, все работает 🎉🎉🎉.
Доступ к веб интерфейсу Zabbix
Способ получения доступа к веб интерфейсу Zabbix зависит от условий, в которых вы разворачивали стек. Я опишу несколько очевидных вариантов.
1) Если Zabbix сервер развернут на локальной машине
Просто вбейте в браузере URL 😁😁😁:
http://127.0.0.1:8080/
2) Если Zabbix сервер развернут на удаленном сервере, который находится в локальной или VPN сети
В таком случае отредактируйте настройки сети для сервисов zabbix-server и zabbix-web в docker-compose.yml файле.
Например, внутренний адрес моего сервера в сети VPN: 192.168.122.24. Правлю docker-compose.yml:
sudo vim /opt/zabbix/docker-compose.yml
zabbix-server:
zabbix-web:
Перезапускаю все контейнеры:
sudo docker compose -f /opt/zabbix/docker-compose.yml down
sudo docker compose -f /opt/zabbix/docker-compose.yml up -d
sudo docker ps
На подключенном к VPN сети клиенте открываю в браузере такой URL:
http://192.168.122.24:8080/
3) Если Zabbix сервер развернут на удаленном сервере и не подключен к локальной или VPN сети
При таком раскладе можно прокинуть SSH порт либо открыть доступ напрямую или через обратный прокси, наподобие nginx. Я рассмотрю лишь первый случай, как самый простой. А еще потому, что два других выходят за рамки данной статьи 😜.
На клиенте открываем терминал и выполняем:
ssh -L 8080:127.0.0.1:8080 user@example.com
Где (по порядку):
- -L – ключ перенаправления локального порта;
- 8080 – порт, который будет слушать клиентская машина и перенаправлять его на 8080 порт сервера;
- 127.0.0.1 – адрес сервера, на котором он слушает порт;
- 8080 – соответственно порт, на который перенаправляем;
- user@example.com – пользователь и адрес SSH сервера.
В моём примере команда такая:
Теперь открываем браузер и переходим по адресу: http://127.0.0.1:8080/
Доступ к веб интерфейсу будет пока открыта SSH сессия.
Для авторизации в веб интерфейсе используйте стандартные логин: Admin и пароль: zabbix
Если вы увидели такое:
Мои поздравления 😎! Zabbix сервер с TimescaleDB поднят и готов к работе 👷♂️.
Опционально
Чтобы не раздувать статью, ниже приведены ссылки на необязательные, но рекомендованные шаги инструкции 😉 на моем сайте r4ven.me.
Заключение
Фух..🤯 это была не самая простая статья. Особенно по объему перелопаченной информации. Но, мне кажется, оно того стоило. В итоге мы получили гибкий и легко переносимый проект системы мониторинга, работающий внутри docker контейнеров. А также мы настроили лаконичные, но информативные уведомления с графиками в Telegram, чтобы всегда быть в курсе состояния нашей инфраструктуры.
Хочется также отметить великолепную работу разработчиков Zabbix. В частности, актуальность и разнообразие docker образов и доступность файлов их сборки. После написания этой статьи, я их зауважал еще больше 👍.
Спасибо, что читаете 😊. Если возникли вопросы – приглашаю вас в Вороний чат, как вы догадались, в телеге 😅. У нас там дружное сообщество 🚶♀️🐧🚶🐧🚶♂️🐧. И обязательно подписывайтесь на основной телеграм канал: @r4ven_me, чтобы не пропустить публикации новых материалов на сайте.
Желаю успехов и нападающего прода! 😌