В предыдущей статье была описана процедура установки Elasticsearch и настройка кластера. В этой статье будет рассмотрена процедура установки Kibana и Logstash, а также их настройка  для работы с кластером Elasticsearch. Скачиваем и устанавливаем Kibana. Настраиваем Kibana для работы с кластером Elasticsearch. Настраиваем балансировку нагрузки между Kibana и Elasticsearch. Настраиваем несколько экземпляров Kibana. Скачиваем и устанавливаем Logstash. Настраиваем Logstash для чтения данных из файла. Смотрим полученные данные в Kibana. Импортируем PGP ключ: Устанавливаем apt-transport-https пакет: Перед установкой пакета необходимо добавить репозиторий Elastic: Устанавливаем Kibana: Настраиваем Kibana для автоматического запуска при старте системы: Так же возможен вариант установки из скаченного Deb пакет с помощью dpkg Импортируем PGP ключ В директории /etc/yum.repos.d/ создаем файл репозитория kibana.repo для CentOS или Red Hat. Для дистрибутива OpenSUSE в директории /etc/zypp/repos.d/: Устанавливаем Kibana c помощью пакетного менеджера в зависимости от операционной системы, yum или dnf для CentOS, Red Hat, Fedora или zypper для OpenSUSE: Настраиваем Kibana для автоматического запуска при старте системы: Так же возможен вариант установки из скаченного RPM пакет с помощью rpm  Скачиваем архив c Kibana: Извлекаем данные и переходим в директорию с Kibana: Текущий каталог считается как $KIBANA_HOME. Конфигурационные файлы находятся в каталоге $KIBANA_HOME/config/. Для запуска Kibana можно создать отдельного пользователя предоставив все необходимые права к каталогу с Kibana. Для настройки Kibana используется YAML файл, который лежит по следующему пути /etc/kibana/kibana.yml при установке из Deb и RPM пакетов или $KIBANA_HOME/config/kibana.yml при установке из архива. Определяем адрес и порт, на которых будет работать Kibana (по умолчанию localhost:5601): Указываем узлы кластера Elasticsearch: В случае недоступности узла, с которым Kibana установила соединение, произойдет переключение на другой узел кластера, указанный в конфигурационном файле.  Указываем, где Kibana будет хранить свои логи (по умолчанию stdout): Необходимо предоставить доступ на запись к данному каталогу, чтобы Kibana писала  логи. В случае установки из пакетов Dep или RPM доступ предоставляется пользователю или группе kibana, а для установки из архива - пользователю, который осуществляет запуск Kibana. Настраиваем частоту опроса Elasticsearch для получения обновлённого списка узлов кластера: Определяем, запрашивать ли обновленный список узлов кластера Elasticsearch в случае сбоя соединения с кластером: В работе опции elasticsearch.sniffInterval  обнаружился "баг", при работе с Elasticsearch. После запроса обновления может возникать ошибка: "statusCode":401,"error":"Unauthorized","message":"missing authentication credentials for REST request: security_exception.  Ссылка на BugFix. Исправление будет в версии 7.11.2 На выходе получаем конфигурационный файл: По умолчанию Kibana имеет ограничение на использование памяти в размере 1,4 Гб. Для изменения этого значения необходимо в файле node.options указать новые значения для параметра --max-old-space-size. Значения указываются в мегабайтах. Данный файл находится в каталоге  /etc/kibana/ при установке из Deb и RPM пакетов или $KIBANA_HOME/config/ - при установке из архива Запускаем службу kibana: Для установки из архива используем: Для выключения службы запущенной из архива используйте Ctrl-C. В браузере набираем IP адрес и порт (в примере выше это http://10.0.3.1:5601), который указывали в конфигурации Kibana. В результате должна открыться приветственная страница. Для организации балансировки между Kibana и узлами Elastcisearch в Elastcisearch имеется встроенный механизм. На хост c установленной Kibana, ставится Elasticsearch с ролью Coordinating only. Узел Elasticsearch с данной ролью обрабатывает HTTP запросы и распределяет их между узлами кластера. Устанавливаем Elasticseach на узел с Kibana. Как это сделать описано в предыдущей статье. Настраиваем новому узлу роль Coordinating only. Для этого для ролей master, data и ingest указываем параметр false:  ingest роль позволяет построить конвейер дополнительной обработки данных до их индексирования. Выделения отдельных узлов с этой ролью снижает нагрузку на другие узлы. Узел с ролью master и/или  data  не имеют эту роль по умолчанию. Указываем имя Elasticsearch кластера: Указываем адреса узлов текущего кластера. Для этого создадим файл unicast_hosts.txt  с перечнем узлов  в директории с конфигурационными файлами Elasticsearch. Для установки из Deb и RPM пакетов это /etc/elasticsearch/  или $ES_HOME/config/ при установке из архива: Указываем, что адреса узлов кластера нужно брать из файла: Данный метод имеет преимущество над методом из предыдущей статьи (discovery.seed_hosts). Elasticsearch следит за изменением файла и применяет настройки  автоматически без перезагрузки узла. Настраиваем IP адрес и порт для приема запросов от Kibana (network.host и http.port) и для коммуникации с другими узлами кластера Elasticsearch(transport.host и transport.tcp.port). По умолчанию параметр transport.host равен network.host: Итоговый конфигурационный файл: Запускаем Elasticsearch и проверяем, что узел присоединился к кластеру: Теперь в кластере 4 узла, из них 3 с ролью data. В конфигурации Kibana указываем адрес Coordinating only узла: Перезапускаем Kibana и проверяем, что служба запустилась, а UI Kibana открывается в браузере. Чтобы организовать работу нескольких экземпляров Kibana,  размещаем их за балансировщиком нагрузки. Для каждого экземпляра Kibana необходимо: Настроить уникальное имя: server.name уникальное имя экземпляра. По умолчанию имя узла. В документации к Kibana указана необходимость настройки server.uuid, однако, в списке параметров конфигурации данный параметр отсутствует. На практике uuid генерируется автоматически и хранится в директории, в которой Kibana хранит свои данные. Данная директория определяется параметром path.data. По умолчанию для установки из Deb и RPM пакетов это /var/lib/kibana/  или $KIBANA_HOME/data/ для установки из архива. Для каждого экземпляра в рамках одного узла необходимо указать уникальные настройки: logging.dest директория для хранения логов; path.data директория для хранения данных; pid.file файл для записи ID процесса; server.port порт, который будет использовать данный экземпляр Kibana ; Указать следующие параметры одинаковыми для каждого экземпляра: xpack.security.encryptionKey произвольный ключ для шифрования сессии. Длина не менее 32 символов. xpack.reporting.encryptionKey  произвольный ключ для шифрования отчетов. Длина не менее 32 символов. xpack.encryptedSavedObjects.encryptionKey ключ для шифрования данных до  отправки их в Elasticsearch. Длина не менее 32 символов. xpack.encryptedSavedObjects.keyRotation.decryptionOnlyKeys список ранее использованных ключей. Позволит расшифровать ранее сохраненные данные. Настройки безопасности(xpack) ELK будут рассмотрены в отдельной статье. Чтобы запустить несколько экземпляров Kibana на одном узле, необходимо указать путь к файлу конфигурации каждого из них. Для этого используется ключ -c: Импортируем GPG ключ: Устанавливаем apt-transport-https пакет: Добавляем репозиторий Elastic: Устанавливаем Logstash: Настраиваем Logstash для автоматического запуска при старте системы: Импортируем PGP ключ В директории /etc/yum.repos.d/ создаем файл репозитория logstash.repo для CentOS или Red Hat. Для дистрибутива OpenSUSE - в директории /etc/zypp/repos.d/ Устанавливаем Logstash c помощью пакетного менеджера в зависимости от операционной системы, yum или dnf для CentOS, Red Hat, Fedora или zypper для OpenSUSE: Настраиваем Logstash для автоматического запуска при старте системы: Скачиваем архив с Logstash: Извлекаем данные и переходим в директорию с Logstash: Текущий каталог считается как $LOGSTASH_HOME. Конфигурационные файлы находятся в каталоге $LOGSTASH_HOME/config/. Помимо архива сайта можно скачать Deb или RPM пакет и установить с помощью dpkg или rpm. В качестве примера настроим считывание собственных логов Logstash из директории /var/log/logstash/. Для этого необходимо настроить конвейер (pipeline). Logstash имеет два типа файлов конфигурации. Первый тип описывает запуск и работу Logstash (settings files).  Второй тип отвечает за конфигурацию конвейера (pipeline) обработки данных. Этот файл состоит из трех секций: input, filter и output. Чтобы описать конвейер создаем файл logstash.conf в директории /etc/logstash/conf.d/, если установка была из Deb и RPM, или в директории $LOGSTASH_HOME/conf.d/ для установки из архива, предварительно создав эту директорию. Для установки из архива необходимо в конфигурационном файле $LOGSTASH_HOME/config/pipelines.yml указать путь до директории с настройками конвейера:  Для установки из архива также требуется указать, где хранить логи в файле конфигурации $LOGSTASH_HOME/config/logstash.yml: Не забудьте предоставить доступ на запись к данному каталогу пользователю, который осуществляет запуск Logstash. В файле logstash.conf настроим плагин file в секции input для чтения файлов. Указываем путь к файлам через параметр path, а через параметр start_position указываем, что файл необходимо читать с начала: Каждое событие журнала логов будет представлять собой JSON документ и  будет записано целиком в поле с ключом message. Чтобы из каждого события извлечь дату, время, источник и другую информацию, необходимо использовать секцию filter. В секции filter с помощью плагина grok и встроенных шаблонов извлекаем из каждой записи (message) журнала логов необходимую информацию: Шаблон имеет формат  %{SYNTAX:SEMANTIC} и по сути это оболочка над регулярным выражением, соответственно шаблон можно описать регулярным выражением. С перечнем всех встроенных шаблоном можно ознакомится тут.  SEMANTIC - это ключ поля с данными, которые извлекаются с помощью шаблона, и под этим ключом будут храниться в JSON документе.  С помощью параметра match указываем, из какого поля (message)  извлекаем данные по описанным шаблонам. Параметр overwrite сообщает, что оригинальное поле message необходимо перезаписать в соответствии с теми данными, которые мы получили с помощью шаблона %{GREEDYDATA:message}. Для сохранения данных в Elasticsearch настраиваем плагин elasticsearch в секции output. Указываем адреса узлов кластера Elasticseach и имя индекса. Индекс (index) - оптимизированный набор JSON документов, где каждый документ представляет собой набор полей ключ - значение. Каждый индекс сопоставляется с одним или более главным шардом (primary shard) и может иметь реплики главного шарда (replica shard). Что такое индекс, шард и репликация шардов рассмотрю в отдельной статье. К названию индекса добавлен шаблон %{+YYYY.MM}, описывающий год и месяц. Данный шаблон позволит создавать новый индекс каждый месяц. Итоговый файл: Запускаем Logstash: Для установки из архива: Открываем Kibana, в верхнем левом углу нажимаем меню и в секции Management выбираем Stack Management. Далее слева выбираем Index patterns и нажимаем кнопку Create Index Patern. В поле Index pattern name описываем шаблон logstash* , в который попадут все индексы, начинающиеся с logstash. Жмем Next step и выбираем Time field поле timestamp, чтобы иметь возможность фильтровать данные по дате и времени. После жмем Create index pattern: Logstash при анализе событий добавил поле @timestamp, в результате получилось 2 поля с датой и временем. Это поле содержит дату и время обработки события, следовательно, эти даты могут различаться. Например, если анализируемый файл имеет старые записи, то поле timestamp будет содержать данные из записей, а @timestamp текущее время, когда каждое событие были обработано. После создания шаблона индексов Kibana покажет информацию об имеющихся полях, типе данных и возможности делать агрегацию по этим полям. Чтобы посмотреть полученные данные на основе созданного шаблона нажимаем меню и в секции Kiban выбираем Discover. В правой части экрана можно выбрать интервал в рамках которого отображать данные. В левой часте экрана можно выбрать шаблон индекса или поля для отображения из списка Available fields. При нажатии на доступные поля можно получить топ-5 значений. Для фильтрации данных можно использовать Kibana Query Language (KQL). Запрос пишется в поле Search. Запросы можно сохранять, чтобы использовать их в будущем. Для визуализации полученных данных нажимаем меню и в секции Kiban выбираем Visualize. Нажав Create new visualization , откроется окно с перечнем доступных типов визуализации. Для примера выбираем Pie, чтобы построить круговую диаграмму. В качестве источника данных выбираем шаблон индексов logstash*. В правой части в секции Buckets жмем Add  , далее -  Split slices. Тип агрегации выбираем Terms, поле severity.keyword. Жмем Update в правом нижнем углу и получаем готовую диаграмму. В секции Options можно добавить отображение данных или изменить вид диаграммы. Если вместо графика отобразилась надпись No results found, проверьте выбранный интервал времени. Чтобы посмотреть данные в Elasticsearch необходимо сделать GET запрос /имя_индекса/_search к любому узлу кластера. Добавление параметра pretty позволяет отобразить данные в читабельном виде. По умолчанию вывод состоит из 10 записей, чтобы увеличить это количество необходимо использовать параметр size: В рамках этой статьи была рассмотрена процедура установки и настройки Kibana и Logstash,  настройка балансировки трафика между Kibana и Elasticsearch и работа нескольких экземпляров Kibana. Собрали первые данные с помощью Logstash, посмотрели на данные с помощью Kibana Discover и построили первую визуализацию. Прежде чем углубляться в изучение плагинов Logstash, сбор данных с помощью Beats, визуализацию и анализ данных в Kibana, необходимо уделить внимание очень важному вопросу безопасности кластера. Об этом  также постоянно  намекает Kibana, выдавая сообщение Your data is not secure. Теме безопасности будет посвящена следующая статья данного цикла. Logstash Directory Layout Шаблоны Logstash Grok Kibana Query Language (KQL) Elasticsearch discovery