Практическая работа №00 "Стэк ELK"
ELK Stack overview
[!NOTE]
Изначально планировалось настроить для стэка ELK несколько proof-of-concept сервисов, которые бы отправляли телеметрию стэку в реальном времени. Однако в процессе реализации такого стэнда я столкнулся со следующими проблемами:
- Такой стенд состоял бы из минимум 6-7 сервисов и (как показала практика) работает крайне нестабильно даже на машине с 32Гб RAM и процессором i9. Официальная документация Elastic не рекомендует развертывать более одного сервиса на одной физической машине.
- Elastic крайне активно склоняют пользователей к использованию их платного hosted-продукта, и основная работа ведется именно над ним. Смысл всей лабораторной работы в self-хостинге этих сервисов, однако сами Elastic не настроены помогать в этом инженерам, особенно с адресами из РФ. Ввиду этого, развернуть полноценный стэнд с real-time клиентами крайне сложно - необходимый elastic agent буквально отказывается работать, а все интеграции (с
postgresql, auditd и другими) невозможно установить не только с российским IP, но и под некоторыми зарубежными.
Исходя из этого, лабораторная работа центрируется вокруг развертывания коренных сервисов стэка (Elasticsearch + Logstash + Kibana) и минимальных сопровождающих сервисов (Filebeat и Metricbeat). На практике такой тестовый стенд позволяет достаточно неплохо изучить основы Elastic, а так же поработать с живыми данными внутри Kibana.
[!NOTE] Изначально планировалось настроить для стэка ELK несколько proof-of-concept сервисов, которые бы отправляли телеметрию стэку в реальном времени. Однако в процессе реализации такого стэнда я столкнулся со следующими проблемами:
- Такой стенд состоял бы из минимум 6-7 сервисов и (как показала практика) работает крайне нестабильно даже на машине с 32Гб RAM и процессором i9. Официальная документация Elastic не рекомендует развертывать более одного сервиса на одной физической машине.
- Elastic крайне активно склоняют пользователей к использованию их платного hosted-продукта, и основная работа ведется именно над ним. Смысл всей лабораторной работы в self-хостинге этих сервисов, однако сами Elastic не настроены помогать в этом инженерам, особенно с адресами из РФ. Ввиду этого, развернуть полноценный стэнд с real-time клиентами крайне сложно - необходимый elastic agent буквально отказывается работать, а все интеграции (с
postgresql,auditdи другими) невозможно установить не только с российским IP, но и под некоторыми зарубежными.
Исходя из этого, лабораторная работа центрируется вокруг развертывания коренных сервисов стэка (Elasticsearch + Logstash + Kibana) и минимальных сопровождающих сервисов (Filebeat и Metricbeat). На практике такой тестовый стенд позволяет достаточно неплохо изучить основы Elastic, а так же поработать с живыми данными внутри Kibana.
![[elk_preview.png]]
Стэк ELK состоит из трёх сервисов:
- Elasticsearch - распределённая система поиска и аналитики, основанная на JSON.
- Logstash - открытая система сбора данных в реальном времени.
- Kibana - фронтенд для эффективного анализа и мониторинга данных, собранных вышеупомянутыми сервисами.
А так же (в рамках этой работы) двух дополнительных сервисов:
- Metricbeat - инструмента для мониторинга самого стэка ELK.
- Filebeat - Инструмента для работы с всевозможными форматами данных и логов. В рамках работы именно в нём должны происходить взаимодействие и обработка телеметрии.
Important
Некоторая часть документации Elastic, а так же репозитории docker-контейнеров и интеграций Elasticsearch могут быть недоступны для просмотра и использования с российских IP-адресов, использование VPN решает эту проблему.
Развернуть тестовый стенд со стэком ELK на Linux-хосте. За основу Linux-хоста допускается взять любой дистрибутив, в котором нет GUI-интерфейса, например:
- Ubuntu Server
- Debian Server
- Arch Linux
- Void Linux
Caution
Единственные GUI-инструменты, которые допускается использовать - это те, что являются частью самого ELK (Kibana / Metricbeat), вся остальная часть работы должна выполняться строго в командной строке.
Так же необходимо запустить и подготовить к работе (привязать к стеку) Metricbeat и Filebeat. Стоит подготовить собственные наборы данных для импорта (например, любой датасет в .csv формате)
Настроить все сервисы так, чтобы логи развернутых сервисов попадали в обработку самого стэка ELK (на скриншоте видно, что в стэк попали данные от двух запусков его самого, а так же данные из вручную добавленного датасета):
![[kibana_self_injested_logs.png]]
При корректной настройке всех сервисов, мониторинг самого стенда и работа с данными через Filebeat будут доступны в Kibana "из коробки". Если доступ к данному функционалу требует дополнительной привязки или конфигурации - это сигнал о том, что что-то развернуто неправильно.
todo!()
Стэк ELK на тестовом стэнде удобнее всего развернуть с помощью docker compose, однако допустима и нативное развертывание.
Первым должен стартовать сервис Elasticsearch, так как Kibana может нормально подключится только к полностью настроенному и готову сервису. Logstash должен запускаться после Kibana, а после запуска всех трёх сервисов - можно запускать Metricbeat и Filebeat.
ВАЖНО: Для адекватной работы стенда необходимо настроить TLS для Elasticsearch, Kibana и Logstash. Сервисы могут функционировать и по простому http-соединению, однако в таком случае есть большой шанс столкнуться с недоступным функционалом и предупреждениями от сервисов, что помешает выполнению лабораторной работы.
-
Контейнер с Elasticsearch может не запускаться с ошибкой
Elasticsearch exited unexpectedly. Для решения проблемы стоит выполнить следующую команду:sudo sysctl -w vm.max_map_count=262144
-
После команды из пункта №1 ошибка может смениться на
Elasticsearch died while starting up with exit code 137. Для решения этой ошибки можно либо ограничить использование памяти для Elasticsearch (как именно - разобраться самостоятельно), либо просто увеличить объем доступной памяти для контейнера в файле.envrc, если вычислительные мощности хоста позволяют.
[!CAUTION]
Это "материал для преподователя" - (скорее всего) надо убрать из лабораторной работы, ибо это можно все скопировать и получить рабочий стенд.
[!CAUTION] Это "материал для преподователя" - (скорее всего) надо убрать из лабораторной работы, ибо это можно все скопировать и получить рабочий стенд.
NOTE: На моём опыте, развернуть ELK нативно, без использования контейнеризации, крайне проблематично. Сервисы ругаются друг на друга, конфликтуют с хостом и иногда просто не работают, в зависимости от дистрибутива и пакета. Поэтому docker compose. Его можно избежать, однако в таком случае мне кажется, что одна лишь задача запуска ELK - уже достаточно сложная и объемная для одной лабораторной работы.
-
Получаем репозиторий. Я либо открою доступ к репозиторию на GitHub, либо пришлю
.zipархив с исходным кодом. Репозиторий не хочется делать открытым, ибо тогда все оттуда спишут :) -
Поднимаем контейнеры:
docker compose up --detach # Запуск всего стэка. docker compose down # Остановка всего стэка. docker compose logs --follow # Просмотр логов стэка. # Ахтунг! # Удаление всех данных стэка. Нужно, чтобы "начать заново"! docker compose down --volumes
-
Отправляемся на
localhost:5601- главную страницу Kibana, логинимся. Имя пользователя -elastic, пароль взять из.envrc, скорее всегоchangeme. -
Если все хорошо, то увидим дэшборд:
![[Study/Semester 5/Telemetry Lab/kibana_dashboard.png]]
Тут нам нужен желтый Search, жмём на него и под заголовком Ingest your content загружаем файл1 с данными через кнопку Upload file.
-
Далее, Kibana предложит множество возможностей повзаимодействовать с данными из файла, что именно здесь выставлять как задачу - я не определился. Возможно, на этом этапе студенту стоит продемонстрировать уникальность данных для проверки, ну или сделать какую-то примитивную выборку.
-
Если перезапустить стенд несколько раз, то в списке индексов вероятно появится один или несколько относящихся к телеметрии самого стэка.
Footnotes
-
Либо
filebeat_ingest_data/Air_Quality.log, либоlogstash_ingest_data/Air_Quality.csv. Для обоих файлов скорее всего придется вручную проставить галочку напротив Has header row в разделе Override settings, потому что строка с заголовками столбцов почему-то не определяется сама. ↩