
Вступительное слово
В предыдущей статье была описана процедура установки Elasticsearch и настройка кластера. В этой статье будет рассмотрена процедура установки Kibana и Logstash, а также их настройка для работы с кластером Elasticsearch.
План действий
Скачиваем и устанавливаем Kibana
Установка из Deb пакета
Импортируем PGP ключ:
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -Устанавливаем
apt-transport-httpsпакет:
sudo apt-get install apt-transport-httpsПеред установкой пакета необходимо добавить репозиторий Elastic:
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.listУстанавливаем Kibana:
sudo apt-get update && sudo apt-get install kibanaНастраиваем Kibana для автоматического запуска при старте системы:
sudo /bin/systemctl daemon-reload && sudo /bin/systemctl enable kibana.serviceТак же возможен вариант установки из скаченного
Debпакет с помощьюdpkg
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.10.2-amd64.deb
sudo dpkg -i kibana-7.10.2-amd64.debУстановка из RPM пакета
Импортируем PGP ключ
sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearchВ директории
/etc/yum.repos.d/создаем файл репозиторияkibana.repoдля CentOS или Red Hat. Для дистрибутива OpenSUSE в директории/etc/zypp/repos.d/:
[kibana-7.x]
name=Kibana repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-mdУстанавливаем Kibana c помощью пакетного менеджера в зависимости от операционной системы,
yumилиdnfдля CentOS, Red Hat, Fedora илиzypperдля OpenSUSE:
# Yum
sudo yum install kibana
# Dnf
sudo dnf install kibana
# Zypper
sudo zypper install kibanaНастраиваем Kibana для автоматического запуска при старте системы:
sudo /bin/systemctl daemon-reload && sudo /bin/systemctl enable kibana.serviceТак же возможен вариант установки из скаченного
RPMпакет с помощьюrpm
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.10.2-x86_64.rpm
sudo rpm --install kibana-7.10.2-x86_64.rpmУстановка из архива tar.gz
Скачиваем архив c Kibana:
curl -O https://artifacts.elastic.co/downloads/kibana/kibana-7.10.2-linux-x86_64.tar.gzИзвлекаем данные и переходим в директорию с Kibana:
tar -xzf kibana-7.10.2-linux-x86_64.tar.gz
cd kibana-7.10.2-linux-x86_64/Текущий каталог считается как $KIBANA_HOME.
Конфигурационные файлы находятся в каталоге $KIBANA_HOME/config/.
Для запуска Kibana можно создать отдельного пользователя предоставив все необходимые права к каталогу с Kibana.
Настраиваем Kibana для работы с кластером Elasticsearch
Для настройки Kibana используется YAML файл, который лежит по следующему пути /etc/kibana/kibana.yml при установке из Deb и RPM пакетов или $KIBANA_HOME/config/kibana.yml при установке из архива.
Определяем адрес и порт, на которых будет работать Kibana (по умолчанию
localhost:5601):
server.host: 10.0.3.1
server.port: 5601Указываем узлы кластера Elasticsearch:
elasticsearch.hosts:
- http://10.0.3.11:9200
- http://10.0.3.12:9200
- http://10.0.3.13:9200В случае недоступности узла, с которым Kibana установила соединение, произойдет переключение на другой узел кластера, указанный в конфигурационном файле.
Указываем, где Kibana будет хранить свои логи (по умолчанию
stdout):
logging.dest: /var/log/kibana/kibana.logНеобходимо предоставить доступ на запись к данному каталогу, чтобы Kibana писала логи. В случае установки из пакетов
DepилиRPMдоступ предоставляется пользователю или группеkibana, а для установки из архива - пользователю, который осуществляет запуск Kibana.
Настраиваем частоту опроса Elasticsearch для получения обновлённого списка узлов кластера:
elasticsearch.sniffInterval: 600000Определяем, запрашивать ли обновленный список узлов кластера Elasticsearch в случае сбоя соединения с кластером:
elasticsearch.sniffOnConnectionFault: trueНа выходе получаем конфигурационный файл:
# Адрес и порт
server.host: 10.0.3.1
server.port: 5601
# Узлы кластера Elasticsearch
elasticsearch.hosts:
- http://10.0.3.11:9200
- http://10.0.3.12:9200
- http://10.0.3.13:9200
# Частота запросов обновления узлов кластера
# Запрос обновлений в случае сбоя подключения
elasticsearch.sniffInterval: 60000
elasticsearch.sniffOnConnectionFault: true
# Логи Kibana
logging.dest: /var/log/kibana/kibana.logПо умолчанию Kibana имеет ограничение на использование памяти в размере 1,4 Гб. Для изменения этого значения необходимо в файле
node.optionsуказать новые значения для параметра--max-old-space-size. Значения указываются в мегабайтах.Данный файл находится в каталоге
/etc/kibana/при установке изDebиRPMпакетов или$KIBANA_HOME/config/- при установке из архива
Запускаем службу
kibana:
sudo systemctl start kibana.serviceДля установки из архива используем:
$KIBANA_HOME/bin/kibanaДля выключения службы запущенной из архива используйте
Ctrl-C.
В браузере набираем IP адрес и порт (в примере выше это http://10.0.3.1:5601), который указывали в конфигурации Kibana. В результате должна открыться приветственная страница.

Настраиваем балансировку нагрузки между Kibana и Elasticsearch
Для организации балансировки между Kibana и узлами Elastcisearch в Elastcisearch имеется встроенный механизм. На хост c установленной Kibana, ставится Elasticsearch с ролью Coordinating only. Узел Elasticsearch с данной ролью обрабатывает HTTP запросы и распределяет их между узлами кластера.
Установка и настройка Elasticsearch
Устанавливаем Elasticseach на узел с Kibana. Как это сделать описано в предыдущей статье.
Настраиваем новому узлу роль
Coordinating only. Для этого для ролейmaster,dataиingestуказываем параметрfalse:
node.master: false
node.data: false
node.ingest: false
ingestроль позволяет построить конвейер дополнительной обработки данных до их индексирования. Выделения отдельных узлов с этой ролью снижает нагрузку на другие узлы. Узел с рольюmasterи/илиdataимеют эту роль по умолчанию.
Указываем имя Elasticsearch кластера:
cluster.name: es_cluster # Имя кластераУказываем адреса узлов текущего кластера. Для этого создадим файл
unicast_hosts.txtс перечнем узлов в директории с конфигурационными файлами Elasticsearch. Для установки изDebиRPMпакетов это/etc/elasticsearch/или$ES_HOME/config/ при установке из архива:
# Список узлов кластера
10.0.3.11
10.0.3.12
10.0.3.13Указываем, что адреса узлов кластера нужно брать из файла:
discovery.seed_providers: fileДанный метод имеет преимущество над методом из предыдущей статьи (
discovery.seed_hosts). Elasticsearch следит за изменением файла и применяет настройки автоматически без перезагрузки узла.
Настраиваем IP адрес и порт для приема запросов от Kibana (
network.hostиhttp.port) и для коммуникации с другими узлами кластера Elasticsearch(transport.hostиtransport.tcp.port). По умолчанию параметрtransport.hostравенnetwork.host:
network.host: 10.0.3.1 # Адрес узла
http.port: 9200 # Порт
transport.host: 10.0.3.1 # Адрес для связи с кластером
transport.tcp.port: 9300-9400 # Порты для коммуникации внутри кластераИтоговый конфигурационный файл:
# ------------------------------------ Node ------------------------------------
# Имя узла
node.name: es-nlb01
# Указываем роль Coordinating only
node.master: false
node.data: false
node.ingest: false
#
# ---------------------------------- Cluster -----------------------------------
#
cluster.name: es_cluster # Имя кластера
#
# --------------------------------- Discovery ----------------------------------
discovery.seed_providers: file
#
# ---------------------------------- Network -----------------------------------
#
network.host: 10.0.3.1 # Адрес узла
http.port: 9200 # Порт
transport.host: 10.0.3.1 # Адрес для связи с кластером
transport.tcp.port: 9300-9400 # Порты для коммуникации внутри кластера
#
# ----------------------------------- Paths ------------------------------------
#
path.data: /var/lib/elasticsearch # Директория с данными
path.logs: /var/log/elasticsearch # Директория с логамиЗапускаем Elasticsearch и проверяем, что узел присоединился к кластеру:
curl -X GET "http://10.0.3.1:9200/_cluster/health?pretty"
{
"cluster_name" : "es_cluster",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 4,
"number_of_data_nodes" : 3,
"active_primary_shards" : 6,
"active_shards" : 12,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}Теперь в кластере 4 узла, из них 3 с ролью data.
Настраиваем Kibana
В конфигурации Kibana указываем адрес
Coordinating onlyузла:
elasticsearch.hosts:
- http://10.0.3.1:9200Перезапускаем Kibana и проверяем, что служба запустилась, а UI Kibana открывается в браузере.
Настраиваем несколько экземпляров 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:
bin/kibana -c <путь_к_файлу_конфигурации_#1>
bin/kibana -c <путь_к_файлу_конфигурации_#2>Скачиваем и устанавливаем Logstash
Установка из Deb пакета
Импортируем GPG ключ:
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -Устанавливаем
apt-transport-httpsпакет:
sudo apt-get install apt-transport-httpsДобавляем репозиторий Elastic:
echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.listУстанавливаем Logstash:
sudo apt-get update && sudo apt-get install logstashНастраиваем Logstash для автоматического запуска при старте системы:
sudo /bin/systemctl daemon-reload && sudo /bin/systemctl enable logstash.serviceУстановка из RPM пакета
Импортируем PGP ключ
sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearchВ директории
/etc/yum.repos.d/создаем файл репозиторияlogstash.repoдля CentOS или Red Hat. Для дистрибутива OpenSUSE - в директории/etc/zypp/repos.d/
[logstash-7.x]
name=Elastic repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-mdУстанавливаем Logstash c помощью пакетного менеджера в зависимости от операционной системы,
yumилиdnfдляCentOS,Red Hat,FedoraилиzypperдляOpenSUSE:
# Yum
sudo yum install logstash
# Dnf
sudo dnf install logstash
# Zypper
sudo zypper install logstashНастраиваем Logstash для автоматического запуска при старте системы:
sudo /bin/systemctl daemon-reload && sudo /bin/systemctl enable logstash.serviceУстановка из архива
Скачиваем архив с Logstash:
curl -O https://artifacts.elastic.co/downloads/logstash/logstash-7.10.2-linux-x86_64.tar.gzИзвлекаем данные и переходим в директорию с Logstash:
tar -xzf logstash-7.10.2-linux-x86_64.tar.gz
cd logstash-7.10.2/Текущий каталог считается как $LOGSTASH_HOME.
Конфигурационные файлы находятся в каталоге $LOGSTASH_HOME/config/.
Помимо архива сайта можно скачать
DebилиRPMпакет и установить с помощьюdpkgилиrpm.
Настраиваем Logstash для чтения данных из файла
В качестве примера настроим считывание собственных логов 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 указать путь до директории с настройками конвейера:
- pipeline.id: main
path.config: "./conf.d/*.conf" Для установки из архива также требуется указать, где хранить логи в файле конфигурации $LOGSTASH_HOME/config/logstash.yml:
path.logs: /var/log/logstash/ # логи LogstashНе забудьте предоставить доступ на запись к данному каталогу пользователю, который осуществляет запуск Logstash.
В файле
logstash.confнастроим плагинfileв секцииinputдля чтения файлов. Указываем путь к файлам через параметрpath, а через параметрstart_positionуказываем, что файл необходимо читать с начала:
input {
file {
path => ["/var/log/logstash/*.log"]
start_position => "beginning"
}
}Каждое событие журнала логов будет представлять собой JSON документ и будет записано целиком в поле с ключом message. Чтобы из каждого события извлечь дату, время, источник и другую информацию, необходимо использовать секцию filter.
В секции
filterс помощью плагинаgrokи встроенных шаблонов извлекаем из каждой записи (message) журнала логов необходимую информацию:
filter {
grok {
match => { "message" => "\[%{TIMESTAMP_ISO8601:timestamp}\]\[%{DATA:severity}%{SPACE}\]\[%{DATA:source}%{SPACE}\]%{SPACE}%{GREEDYDATA:message}" }
overwrite => [ "message" ]
}
}Шаблон имеет формат %{SYNTAX:SEMANTIC} и по сути это оболочка над регулярным выражением, соответственно шаблон можно описать регулярным выражением. С перечнем всех встроенных шаблоном можно ознакомится тут.
SEMANTIC - это ключ поля с данными, которые извлекаются с помощью шаблона, и под этим ключом будут храниться в JSON документе.
С помощью параметра match указываем, из какого поля (message) извлекаем данные по описанным шаблонам. Параметр overwrite сообщает, что оригинальное поле message необходимо перезаписать в соответствии с теми данными, которые мы получили с помощью шаблона %{GREEDYDATA:message}.
Для сохранения данных в Elasticsearch настраиваем плагин
elasticsearchв секцииoutput. Указываем адреса узлов кластера Elasticseach и имя индекса.
Индекс (
index) - оптимизированный набор JSON документов, где каждый документ представляет собой набор полей ключ - значение. Каждый индекс сопоставляется с одним или более главным шардом (primary shard) и может иметь реплики главного шарда (replica shard).Что такое индекс, шард и репликация шардов рассмотрю в отдельной статье.
output {
elasticsearch {
hosts => ["http://10.0.3.11:9200","http://10.0.3.12:9200","http://10.0.3.13:9200"]
index => "logstash-logs-%{+YYYY.MM}"
}
}К названию индекса добавлен шаблон %{+YYYY.MM}, описывающий год и месяц. Данный шаблон позволит создавать новый индекс каждый месяц.
Итоговый файл:
# Читаем файл
input {
file {
path => ["/var/log/logstash/*.log"]
start_position => "beginning"
}
}
# Извлекаем данные из событий
filter {
grok {
match => { "message" => "\[%{TIMESTAMP_ISO8601:timestamp}\]\[%{DATA:severity}%{SPACE}\]\[%{DATA:source}%{SPACE}\]%{SPACE}%{GREEDYDATA:message}" }
overwrite => [ "message" ]
}
}
# Сохраняем все в Elasticsearch
output {
elasticsearch {
hosts => ["http://10.0.3.11:9200","http://10.0.3.12:9200","http://10.0.3.13:9200"]
index => "logstash-logs-%{+YYYY.MM}"
}
}Запускаем Logstash:
sudo systemctl start logstash.serviceДля установки из архива:
$LOGSTASH_HOME/bin/logstashСмотрим полученные данные в Kibana
Открываем 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:
curl -X GET "http://10.0.3.1:9200/logstash-logs-2021.01/_search?pretty&size=100"
...
{
"_index" : "logstash-logs-2021.01",
"_type" : "_doc",
"_id" : "XlXeQncBKsFiW7wX45A0",
"_score" : 1.0,
"_source" : {
"path" : "/var/log/logstash/logstash-plain.log",
"@version" : "1",
"source" : "logstash.outputs.elasticsearch",
"message" : "[main] Restored connection to ES instance {:url=>\"http://10.0.3.11:9200/\"}",
"host" : "logstash01",
"timestamp" : "2021-01-27T08:03:55,979",
"@timestamp" : "2021-01-27T08:03:58.907Z",
"severity" : "WARN"
}
},
...Заключение
В рамках этой статьи была рассмотрена процедура установки и настройки Kibana и Logstash, настройка балансировки трафика между Kibana и Elasticsearch и работа нескольких экземпляров Kibana. Собрали первые данные с помощью Logstash, посмотрели на данные с помощью Kibana Discover и построили первую визуализацию.
Прежде чем углубляться в изучение плагинов Logstash, сбор данных с помощью Beats, визуализацию и анализ данных в Kibana, необходимо уделить внимание очень важному вопросу безопасности кластера. Об этом также постоянно намекает Kibana, выдавая сообщение Your data is not secure.
Теме безопасности будет посвящена следующая статья данного цикла.
PSVITAmins
Артём, спасибо! Несколько вопросов, если позволите. В этот раз мы указываем список нод эластика в текстовом файле, потому что этот способ лучше. Тогда почему в первой статье цикла вы так не сделали?
Второй вопрос касается ноды балансировщика, которая «Coordinating only» — я правильно понимаю, что это потенциальная точка отказа? Если у нас не будет работать этот эластик, то и кибана в целом ничего не покажет. Получается по-хорошему надо и балансировщик дублировать, а это уже получается к трём нодам кластера ещё два балансера — не перебор ли? Насколько он вообще нужен, при каком объёме нагрузки вы его рекомендуете? Просто раньше этой ролью не пользовались и непонятно, стоит ли начинать.
artem_s_shestakov Автор
1. Чтобы показать варианты настроек. Замечание дельное, спасибо! Наверное в первой части поправлю, сразу указав два варианта.
2. Совершенно верно, как и любая служба в единственном экземпляре — потенциальная точка отказа. На вопрос когда использовать никто не скажет точно, надо смотреть и тестировать конкретный кластер. Основная задача роли — поисковые запросы направлять на узлы, где данные лежат, потом все собрать пришедшее с узлов и отдать в Kibana. Если поисковых запросов много, то имеет смысл использовать эту роль, чтобы ES узлы не гоняли между собой трафик, если нет, то лучше еще узел с данными добавить.