September 25

Поднимаем сервер мониторинга Zabbix 7 + TimescaleDB в docker

Поднимаем сервер мониторинга Zabbix 7 + TimescaleDB в docker

Исходный сайт представленного материала: 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 [email protected]

Где (по порядку):

  • -L – ключ перенаправления локального порта;
  • 8080 – порт, который будет слушать клиентская машина и перенаправлять его на 8080 порт сервера;
  • 127.0.0.1 – адрес сервера, на котором он слушает порт;
  • 8080 – соответственно порт, на который перенаправляем;
  • [email protected] – пользователь и адрес SSH сервера.

В моём примере команда такая:

Теперь открываем браузер и переходим по адресу: http://127.0.0.1:8080/

Доступ к веб интерфейсу будет пока открыта SSH сессия.

Для авторизации в веб интерфейсе используйте стандартные логин: Admin и пароль: zabbix

Если вы увидели такое:

Мои поздравления 😎! Zabbix сервер с TimescaleDB поднят и готов к работе 👷‍♂️.

Опционально

Чтобы не раздувать статью, ниже приведены ссылки на необязательные, но рекомендованные шаги инструкции 😉 на моем сайте r4ven.me.

Заключение

Фух..🤯 это была не самая простая статья. Особенно по объему перелопаченной информации. Но, мне кажется, оно того стоило. В итоге мы получили гибкий и легко переносимый проект системы мониторинга, работающий внутри docker контейнеров. А также мы настроили лаконичные, но информативные уведомления с графиками в Telegram, чтобы всегда быть в курсе состояния нашей инфраструктуры.

Хочется также отметить великолепную работу разработчиков Zabbix. В частности, актуальность и разнообразие docker образов и доступность файлов их сборки. После написания этой статьи, я их зауважал еще больше 👍.

Спасибо, что читаете 😊. Если возникли вопросы – приглашаю вас в Вороний чат, как вы догадались, в телеге 😅. У нас там дружное сообщество 🚶‍♀️🐧🚶🐧🚶‍♂️🐧. И обязательно подписывайтесь на основной телеграм канал: @r4ven_me, чтобы не пропустить публикации новых материалов на сайте.

Желаю успехов и нападающего прода! 😌

Используемые материалы