5.7к
0
0
Скопировать ссылку
Telegram
WhatsApp
Vkontakte
Одноклассники
Назад

Внедряем систему мониторинга и сбора логов на базе Zabbix и Grafana Loki

Время чтения 23 минуты
Нет времени читать?
Скопировать ссылку
Telegram
WhatsApp
Vkontakte
Одноклассники
5.7к
0
0
Нет времени читать?
Скопировать ссылку
Telegram
WhatsApp
Vkontakte
Одноклассники

Меня зовут Кучеренко Игорь, я ведущий системный администратор на телеканалах Еда и FoodTime. Мое руководство поможет вам с легкостью поднять сервисы, о которых пойдет речь в статье, у себя в компании. 

Внедряем систему мониторинга и сбора логов на базе Zabbix и Grafana Loki

Но для начала немного вводной информации.

В компании не было никакой системы мониторинга и сбора логов. Из-за этого о проблемах узнавали по факту, когда всё сломалось и нужно искать, где и что именно. Чтобы этого избежать, приходилось каждый день ходить в серверную и узловые точки и мониторить состояние оборудования здесь и сейчас. Это было крайне неудобно и требовало много времени.

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

Я решил строить систему на базе Zabbix и Grafana Loki. На самом деле есть очень много аналогичных программ, которые позволяют мониторить оборудование, но сравнительным анализом в этой статье я заниматься не буду.

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

Grafana — это платформа для мониторинга, анализа и визуализации данных. Grafana не собирает и не хранит данные, а представляет сухие цифры в виде красивых диаграмм и графиков. Источник информации для Grafana — системы мониторинга и хранилища систематических данных. Платформу можно подключить к Graphite, OpenTSDB, Prometheus, InfluxDB, MySQL, PostgreSQL и многим другим движкам.

Loki — это решение для хранения и просмотра логов, также этот стек предоставляет гибкую систему для их анализа и отправки данных в Prometheus.

Подготовьте оборудование

Для того чтобы всё работало как часы, нужно правильно выбрать серверы. Их параметры зависят от нагруженности системы. Примерная схема выбора железа под сервер Zabbix:

  • до 1000 метрик, потребуется 2 ядра CPU и 8 ГБ оперативной памяти;
  • до 10 000 метрик, потребуется 4 ядра CPU и 16 ГБ оперативной памяти;
  • до 100 000 метрик, потребуется 16 ядер CPU и 64 ГБ оперативной памяти;
  • от 1 000 000 метрик, потребуется 32 ядра CPU и 96 ГБ оперативной памяти.

Все требования можно реализовать как на физическом сервере, так и на виртуальном. Базу данных можно использовать MySQL, MariaDB, PostgreSQL, Percona, Oracle.

Обязательно иметь достаточный объем дискового пространства для хранения истории и обработки данных.

Требования к железу для Grafana Loki: объем памяти от 512 МБ и минимум один процессор.

Если у вас будет производиться рендеринг изображений или оповещения, то ресурсов потребуется больше.

Характеристики Zabbix и Grafana Loki, которые я выбрал

Установите Zabbix

Мой выбор операционной системы пал на CentOS 8.5.2111.

Подготовка к установке Zabbix

Внесите репозитории в каталог yum.repos.d:

sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-Linux-*
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-Linux-*

Установите обновления и пакеты баз данных MySQL:

yum update
yum install mysql-server

Запустите службу MySQL:

systemctl start mysqld.service

Установите репозитории Zabbix:

rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/8/x86_64/zabbix-release-6.0-1.el8.noarch.rpm
dnf clean all

Установите основные зависимые сервисы:

dnf install zabbix-server-mysql zabbix-web-mysql zabbix-apache-conf zabbix-sql-scripts zabbix-selinux-policy zabbix-agent

Настройка базы в MySQL

Авторизуйтесь в MySQL с помощью root-пароля, который установили ранее:

mysql -u root -p

Создайте базу данных с именем zabbix_name для Zabbix: 

create database zabbix_name character set utf8 collate utf8_bin;

Проверьте список баз данных:

SHOW DATABASES;

Создайте пользователя базы данных с именем zabbix_user и root-паролем zabbix_password:

create user 'zabbix_user'@'localhost' identified BY 'zabbix_password';

Проверьте список пользователей:

SELECT User, Host FROM mysql.user;

Добавьте привилегии пользователю:

grant all privileges on zabbix_name.* to zabbix_user@localhost;
SET GLOBAL log_bin_trust_function_creators = 1;

Параметр all privileges предоставляет полные права на использование данных. Закройте консоль базы данных:

quit;

Распаковка и настройка серверной части Zabbix

Разверните файлы сервера. Это не быстрый процесс, придется подождать:

zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql -u zabbix_user -p zabbix_name

Отредактируйте конфигурацию сервера:

nano /etc/zabbix/zabbix_server.conf
DBName=zabbix_name
DBUser=zabbix_user
DBPassword=zabbix_password

Перезагрузите все сервисы и активируйте автозапуск:

systemctl restart zabbix-server zabbix-agent httpd php-fpm
systemctl enable zabbix-server zabbix-agent httpd php-fpm

Настройка iptables

Сохраните в файл настройки:

sudo iptables-save > /tmp/iptables-export

Откройте редактором файл:

nano /tmp/iptables-export

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

*raw
:PREROUTING ACCEPT [4093:273187]
:OUTPUT ACCEPT [995:75596]
-A PREROUTING -p udp -m udp --sport 53 -j NOTRACK
-A OUTPUT -p udp -m udp --dport 53 -j NOTRACK
COMMIT
*filter
:INPUT ACCEPT [2894:173422]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [995:75596]
:ICMP - [0:0]
:NTP - [0:0]
:SSH - [0:0]
:ZBX - [0:0]
:WEB - [0:0]
:SNMPTRAP - [0:0]
:SQL - [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -s 8.8.8.8/32 -p udp -m udp --sport 53 -j ACCEPT
-A INPUT -s 8.8.4.4/32 -p udp -m udp --sport 53 -j ACCEPT
-A INPUT -p icmp -j ICMP
-A INPUT -p udp -m udp --dport 123 -j NTP
-A INPUT -p tcp -m tcp --dport 22 -j SSH
-A INPUT -p tcp -m multiport --dports 10050,10051 -j ZBX
-A INPUT -p tcp -m multiport --dports 80,443 -j WEB
-A INPUT -p udp -m udp --dport 162 -j SNMPTRAP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j DROP
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A OUTPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT
-A ICMP -p icmp -m limit --limit 5/sec -j ACCEPT
-A SSH -p tcp -m tcp --dport 22 -j ACCEPT
-A ZBX -p tcp -m tcp --dport 10050 -j ACCEPT
-A ZBX -p tcp -m tcp --dport 10051 -j ACCEPT
-A WEB -p tcp -m multiport --dports 80,443 -j ACCEPT
-A WEB -p udp -m udp --dport 162 -j ACCEPT
COMMIT

Загрузите файл:

sudo iptables-restore < /tmp/iptables-export

Проверьте правила:

sudo iptables -S

Настройка и оптимизация Zabbix

Добавьте русский язык в Zabbix:

dnf install glibc-langpack-ru
reboot

Зайдите в веб-интерфейс Zabbix по адресу http://ВашIP/zabbix/
В файле /etc/zabbix/zabbix_server.conf пропишите размер кеша и количество предварительно разветвленных экземпляров Discoverers:

CacheSize=2048M
StartDiscoverers=5 

После этого перезапустите сервис:

Systemctl restart zabbix-server.service

Устанавливаем Grafana Loki

Для Grafana Loki я буду использовать такую же версию ОС, как для Zabbix. Если у вас в системе отсутствует пакет, позволяющий скачивать файлы, то выполните команду:

yum install git wget

Для компиляции исходника необходимо установить Golang. Можно перейти на их сайт и скопировать ссылку на актуальную версию. Затем выполнить команду:

wget https://go.dev/dl/go1.19.3.linux-amd64.tar.gz

Распакуйте архив:

tar -v -C /usr/local -xzf go*.tar.gz

Далее отредактируйте файл:

nano /etc/profile

В конец файла добавьте строку:

export PATH=$PATH:/usr/local/go/bin

Выполните команду:

export PATH=$PATH:/usr/local/go/bin

Проверьте, что go установлен:

go version

Если видите такое сообщение, значит, всё супер

Настройка фаервола

Откройте порт для запуска Loki:

firewall-cmd --permanent --add-port=3100/tcp
firewall-cmd --reload

Отключите SELinux т. к. он в нашем случае не понадобится:

setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config

Причина отключения в том, что он может стать проблемой при отладке.
Начинаем процесс установки Loki. Перейдите в каталог:

cd /usr/src/

Загрузите исходники:

git clone https://github.com/grafana/loki

Перейдите в скачанный каталог и запустите компиляцию:

cd loki/
go build ./cmd/loki

Появится файл Loki — перенесите его в другой каталог:

mv loki /usr/local/bin/

Создайте каталог и перенесите в него конфиг:

mkdir /etc/loki
mv cmd/loki/loki-local-config.yaml /etc/loki/

Скорректируйте /tmp командами:

sed -i 's//tmp/wal//opt/loki/wal/g' /etc/loki/loki-local-config.yaml
sed -i 's//tmp/loki//opt/loki/g' /etc/loki/loki-local-config.yaml

Создайте каталог:

mkdir /opt/loki

Протестируйте запуск:

/usr/local/bin/loki -config.file=/etc/loki/loki-local-config.yaml

В браузере перейдите по адресу http://ВашIP:3100/metrics, где ВашIP — IP-адрес сервера Grafana Loki.

Если видите нечто подобное, то всё супер

Настройте автозапуск сервиса. Для этого создайте пользователя и дайте ему нужные права на запуск:

useradd --no-create-home --shell /bin/false loki
chown loki:loki /usr/local/bin/loki
chown -R loki:loki /etc/loki
chown -R loki:loki /opt/loki

Добавьте отдельный юнит для автозапуска:

nano /etc/systemd/system/loki.service

Содержимое файла должно быть таким:

[Unit]
Description=Grafana Loki Service
After=network.target
[Service]
User=loki
Group=loki
Type=simple
ExecStart=/usr/local/bin/loki -config.file=/etc/loki/loki-local-config.yaml
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
[Install]
WantedBy=multi-user.target

Перезапустите конфигурацию и разрешите автозапуск:

systemctl daemon-reload
systemctl enable loki --now

Проверьте статус:

systemctl status loki

Если видите подобное, то можно двигаться дальше

Настройка визуальной части и сбор логов

Установите недостающие компоненты:

yum install unzip wget

Установите и настройте Promtail, он позволяет читать и отправлять логи на сервер. Для этого скачайте архив с программой:

wget https://github.com/grafana/loki/releases/latest/download/promtail-linux-amd64.zip

Распакуйте и перенесите его в другой каталог:

unzip promtail-linux-amd64.zip
mv promtail-linux-amd64 /usr/local/bin/promtail

Создайте каталог для конфигов:

mkdir /etc/promtail

Теперь создайте сам конфиг и наполните его:

nano /etc/promtail/promtail.yaml

В файле конфигурации пропишите данные:

server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://ВашIP:3100/loki/api/v1/push

где ВашIP — адрес вашего сервера Loki

Пример конфигурационного файла

Теперь создайте юнит для автозапуска:

nano /etc/systemd/system/promtail.service

Содержимое файла должно быть таким:

[Unit]
Description=Promtail Service
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/promtail -config.file=/etc/promtail/promtail.yaml
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target

Перезапустите конфигурацию и включите автозагрузку:

systemctl daemon-reload
systemctl enable promtail --now

Проверьте статус:

systemctl status promtail

Если видите такое, двигайтесь дальше

Откройте нужный порт для запуска Promtail:

firewall-cmd --permanent --add-port=9080/tcp
firewall-cmd --reload

Проверьте в браузере работу Promtail: http://ВашIP:9080/targets.

Видите нечто подобное? Всё супер

Важное упоминание: Promtail нужно установить на все линуксовые машины, с которых вы планируете собирать логи.

Для сбора логов нужно внести в конфиг информацию о том, что и как собирать. Откройте конфиг:

nano /etc/promtail/promtail.yaml

В конфиге пропишите строки для сбора логов с сервера Loki:

# Чтение логов с сервера Loki
# Имя задания чтения лога
- job_name: loki_srv
static_configs:
# ПК, с которого читается лог
- targets:
- localhost
labels:
# Метка для имени задания
job: loki_srv
# Путь к файлу с логами
__path__: /var/log/rsyslog/Loki/*log

По такому же принципу добавьте в конфигурационный файл все серверы и сетевое оборудование, откуда вы планируете собирать логи. После каждого изменения файла выполняйте перезагрузку:

systemctl restart promtail

Затем проверьте в браузере отображение: http://ВашIP:9080/targets.

Если видите подобное, то вы справились с задачей

Переходим к установке самой Grafana. Нужно создать репозиторий, откуда и будет производиться установка:

nano /etc/yum.repos.d/grafana.repo

Содержимое файла:

 [grafana]
name=grafana
baseurl=https://packages.grafana.com/oss/rpm
repo_gpgcheck=1
enabled=1
gpgcheck=1
gpgkey=https://packages.grafana.com/gpg.key
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt

Установите Grafana:

yum install grafana

Откройте порт для запуска Grafana и включите автозагрузку:

firewall-cmd --permanent --add-port=3000/tcp
firewall-cmd --reload
systemctl enable grafana-server

Запустите сервер:

systemctl start grafana-server

Сейчас есть проблемы с доступом на сайт Grafana. Можно обойти их с помощью VPN, скачать RPM-пакет напрямую и установить его:

wget https://dl.grafana.com/enterprise/release/grafana-enterprise-9.3.0-1.x86_64.rpm
yum install /home/grafana-9.3.0-1.x86_64.rpm

Где /home/ — путь к скачанному RPM-пакету.

Переходим к финальной стадии — настройке веб-интерфейса. В браузере перейдите по ссылке http://ВашIP:3000/, где ВашIP — сервер, где установлена Grafana.

Введите логин и пароль admin. Система потребует сменить пароль по умолчанию, но если не потребует, то изменить его можно в настройках внутри веб-интерфейса.

Перейдите по пути Configuration >> Data sources
Добавьте источник, кликнув по кнопке Add data source
Найдите и выберите Loki
Введите адрес сервера и сохраните
Если получили такое сообщение, то всё супер и теперь вы можете видеть логи

Примеры логов из реальных сервисов

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

В примере ниже видно, как происходит закрытие соединения с почтовыми адресами. Также есть предупреждения о том, что есть проблемы с плагином для восстановления паролей.

На дашбордах можно выводить практически любую информацию, собранную Zabbix. На примерах показана общая карта сети, список проблем, которые возникают на оборудовании, и сколько уже длится конкретная проблема. Также есть количество отклоненных писем, место на жестких дисках.

В заключение хочу посоветовать: никогда не бойтесь осваивать новые сервисы и прокачивать свои скилы. Таким образом вы расширяете свои возможности и никогда не заскучаете.

Лучшее время для развития — когда у вас в компании нет проблем с сервисами и всё работает как часы.

Всем удачи в освоении новых навыков!

Комментарии0
Тоже интересно
Комментировать
Поделиться
Скопировать ссылку
Telegram
WhatsApp
Vkontakte
Одноклассники