Установка Elasticsearch + Kibana. Ubuntu
ELK (Elasticsearch, Logstash, Kibana) – это одна из самых популярных поисковых систем в области Big Data, масштабируемое нереляционное хранилище данных с открытым исходным кодом, аналитическая NoSQL-СУБД с широким набором функций полнотекстового поиска.
Основные функциональные возможности Elasticsearch включают:
- автоматическую индексацию новых JSON-объектов,
- поддержку восточных языков,
- гибкость поисковых фильтров,
- наличие встроенных анализаторов текста.
Elasticsearch активно применяется в различных Big Data системах крупных и средних компаний по всему миру.
Предварительная подготовка
Полный перечень шагов по предварительной подготовке сервера приведен в соответствующем разделе документации.
При установки из deb или rpm пакета большинство предварительных настроек применяется автоматически. Про те настройки, которые не применяются автоматически я расскажу в следующих нескольких разделах.
Отключение swap
Поскольку Elastichsearch написан на Java, то необходимо отключить swap, чтобы не допустить выгрузку данных Java приложения на диск, т.к. это может привести к очень серьезным проблема с производительностью.
Команда для отключения swap:
sudo swapoff -a
Однако, после перезагрузки swap снова будет активен. Чтобы этого избежать необходимо скорректировать настройки монтирования в файле fstab и отключить монтирование swap раздела (если таковое настроено):
sudo nano /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/ubuntu-vg/ubuntu-lv during curtin installation
/dev/disk/by-id/dm-uuid-LVM-SgxsJ2Y0eJDJHTCFxWt9vMFHdFgBPS6uChmsGMK81UYtPrnaUsrLbPGkdnE9aLxc / ext4 defaults 0 1
# /boot was on /dev/sda2 during curtin installation
/dev/disk/by-uuid/0debc3fb-e83a-4d99-a78e-99472ebcadbd /boot ext4 defaults 0 1
#/swap.img none swap sw 0 0
Период повторного TCP соединения
Для оптимизации сетевого взаимодействия между узлами кластера Elasticsearch дополнительно необходимо скорректировать параметры TCP.
Выполните следующую команду:
sudo sysctl -w net.ipv4.tcp_retries2=5
Для того, чтобы изменения сохранились при перезагрузке системы отредактируем соответствующий конфигурационный файл:
sudo nano /etc/sysctl.d/99-sysctl.conf
Добавьте в файл вот такой параметр:
net.ipv4.tcp_retries2=5
Сохраните внесенные изменения.
Установка первого узла Elasticsearch
1. Загрузить deb/rpm пакет с сайта или
Альтернативный вариант – использовать вот этот блок команд из документации.
2. Запускаем установку:
sudo dpkg -i elasticsearch-8.15.1-amd64.deb
Selecting previously unselected package elasticsearch.
(Reading database ... 132049 files and directories currently installed.)
Preparing to unpack elasticsearch-8.13.2-amd64.deb ...
Creating elasticsearch group... OK
Creating elasticsearch user... OK
Unpacking elasticsearch (8.13.2) ...
Setting up elasticsearch (8.13.2) ...
--------------------------- Security autoconfiguration information ------------------------------
Authentication and authorization are enabled.
TLS for the transport and HTTP layers is enabled and configured.
The generated password for the elastic built-in superuser is : 79_mvu-17RVcng_w6=BS
If this node should join an existing cluster, you can reconfigure this with
'/usr/share/elasticsearch/bin/elasticsearch-reconfigure-node --enrollment-token <token-here>'
after creating an enrollment token on your existing cluster.
You can complete the following actions at any time:
Reset the password of the elastic built-in superuser with
'/usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic'.
Generate an enrollment token for Kibana instances with
'/usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana'.
Generate an enrollment token for Elasticsearch nodes with
'/usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s node'.
-------------------------------------------------------------------------------------------------
### NOT starting on installation, please execute the following statements to configure elasticsearch service to start automatically using systemd
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch.service
### You can start elasticsearch service by executing
sudo systemctl start elasticsearch.service
root@tst01:/home/roman# sudo systemctl daemon-reload
- Сохраните пароль пользователя elastic.
4. Конфигурируем автоматический запуск:
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch.service
5. Запускаем сервис:
sudo systemctl start elasticsearch.service
6. Проверяем статус сервиса:
sudo systemctl status elasticsearch.service
Проверка после установки
1. Установим значение переменной окружения с паролем пользователя elastic:
export ELASTIC_PASSWORD="79_mvu-17RVcng_w6=BS"
2. Выполним запрос к API Elasticsearch:
curl --cacert /etc/elasticsearch/certs/http_ca.crt -u elastic:$ELASTIC_PASSWORD https://localhost:9200
{
"name" : "tst01",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "G7jnDzcxSV60bqxB2oSbJg",
"version" : {
"number" : "8.13.2",
"build_flavor" : "default",
"build_type" : "deb",
"build_hash" : "16cc90cd2d08a3147ce02b07e50894bc060a4cbf",
"build_date" : "2024-04-05T14:45:26.420424304Z",
"build_snapshot" : false,
"lucene_version" : "9.10.0",
"minimum_wire_compatibility_version" : "7.17.0",
"minimum_index_compatibility_version" : "7.0.0"
},
"tagline" : "You Know, for Search"
}
Настройки
1. Открываем на редактирование файл конфигурации:
sudo nano /etc/elasticsearch/jvm.options
################################################################
## IMPORTANT: JVM heap size
################################################################
##
## The heap size is automatically configured by Elasticsearch
## based on the available memory in your system and the roles
## each node is configured to fulfill. If specifying heap is
## required, it should be done through a file in jvm.options.d,
## and the min and max should be set to the same value. For
## example, to set the heap to 4 GB, create a new file in the
## jvm.options.d directory containing these lines:
##
## -Xms4g
## -Xmx4g
##
## See https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html
## for more information
##
################################################################
Если вы хотите уменьшить потребление оперативной памяти, то просто выставляете, например, такие значения:
-Xms512m
-Xmx512m
Если же захочется увеличить, то вбиваем, например 4Гб:
-Xms4g
-Xmx4g
После изменения настройки, перегрузите ES:
sudo service elasticsearch restart
Теперь можете замерить потребление Elasticsearch'ом памяти и убедиться, что настройки были сохранены.
Установка Kibana
Установка Kibana
Установка выполняется следующим образом:
1. Загрузите deb/rpm пакет со страницы загрузки или
Вы также можете выполнить загрузку используя соответствующие шаги из руководства для Debian или RPM пакетов.
2. Запустите установку пакета:
sudo dpkg -i kibana-8.15.1-amd64.deb
3. Включите автоматический запуск сервиса Kibana:
sudo systemctl daemon-reload
sudo systemctl enable kibana.service
Первоначальная настройка Kibana
После установки Kibana необходимо выполнить её первоначальную настройку:
1. Сначала сгенерируем токен доступа на сервере с Elasticsearch:
sudo /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana
root@tst01:/home/roman# sudo /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana
eyJ2ZXIiOiI4LjEzLjIiLCJhZHIiOlsiMTkyLjE2OC41Ni40MDo5MjAwIl0sImZnciI6IjUwMGE5NjRiZTcxMjkwYjg0YmZkZTAxMjQ0ZTJkNDY5ZGMzZmM1NzFmOWFhNmRlMGVjYjljNjY0ZWUzZjMzYzQiLCJrZXkiOiJlVWJnNlk0QjF0TnFKMjQ5eGN2cTpUNlB1c01JcVF4Ml81ZjJzdTF4N3h3In0=
2. Теперь нужно добавить адрес сервера Elastichsearch в конфигурационный файл сервиса Kibana:
sudo nano /etc/kibana/kibana.yml
3. Раскомментируем параметр server.host и укажем в нем IP-адрес сервера Kibana. на котором будут прослушиваться входящие подключения:
server.host: "192.168.56.36"
4. Сохраните внесенные изменения.
5. Запустите сервис Kibana:
sudo systemctl start kibana.service
6. Проверим статус сервиса Kibana:
sudo systemctl status kibana.service
[root@localhost roman]# sudo systemctl status kibana.service
● kibana.service - Kibana
Loaded: loaded (/usr/lib/systemd/system/kibana.service; enabled; preset: disabled)
Active: active (running) since Wed 2024-04-17 09:40:07 +07; 20s ago
Docs: https://www.elastic.co
Main PID: 1613 (node)
Tasks: 11 (limit: 23168)
Memory: 279.3M
CPU: 21.328s
CGroup: /system.slice/kibana.service
└─1613 /usr/share/kibana/bin/../node/bin/node /usr/share/kibana/bin/../src/cli/dist
Apr 17 09:40:09 localhost.localdomain kibana[1613]: Native global console methods have been overridden in production environment.
Apr 17 09:40:11 localhost.localdomain kibana[1613]: [2024-04-17T09:40:11.588+07:00][INFO ][root] Kibana is starting
Apr 17 09:40:11 localhost.localdomain kibana[1613]: [2024-04-17T09:40:11.710+07:00][INFO ][node] Kibana process configured with roles: [background_tasks, ui]
Apr 17 09:40:25 localhost.localdomain kibana[1613]: [2024-04-17T09:40:25.591+07:00][INFO ][plugins-service] The following plugins are disabled: "cloudChat,cloudExperim>
Apr 17 09:40:25 localhost.localdomain kibana[1613]: [2024-04-17T09:40:25.728+07:00][INFO ][http.server.Preboot] http server running at http://192.168.56.36:5601
Apr 17 09:40:26 localhost.localdomain kibana[1613]: [2024-04-17T09:40:26.080+07:00][INFO ][plugins-system.preboot] Setting up [1] plugins: [interactiveSetup]
Apr 17 09:40:26 localhost.localdomain kibana[1613]: [2024-04-17T09:40:26.111+07:00][INFO ][preboot] "interactiveSetup" plugin is holding setup: Validating Elasticsearc>
Apr 17 09:40:26 localhost.localdomain kibana[1613]: [2024-04-17T09:40:26.161+07:00][INFO ][root] Holding setup until preboot stage is completed.
Apr 17 09:40:26 localhost.localdomain kibana[1613]: i Kibana has not been configured.
Apr 17 09:40:26 localhost.localdomain kibana[1613]: Go to http://192.168.56.36:5601/?code=773960 to get started.
8. Переходим по ссылке из сообщения статуса сервиса. В моем случае адрес следующий:
http://192.168.56.36:5601/?code=773960
9. Теперь нужно указать токен доступа, которые мы сгенерировали в п. 1 и нажать на кнопку “Configure Elastic”:
10. Дождитесь окончания процесса инициализации настроек Kibana. В случае успешного заврешения инициализации настроек должна отобразиться форма с приглашение указания учетных данных для подключения:
11. Используйте учетную запись пользователя elastic, который был создан в процессе установки сервера Elasticsearch.
12. В случае успешной аутентификации должен отобразиться стартовый экран Kibana:
Настройка шифрования трафика
После установки Kibana работает по HTTP, что далеко не безопасно в современных реалиях. Необходимо настроить шифрование трафика между серверами Kibana и Elasticsearch, а также между клиентским браузером и серверов Kibana. После завершения инициализации наcтроек Kibana трафик до сервера Elasticsearch уже по умолчанию зашифрован:
sudo nano /etc/kibana/kibana.yml
elasticsearch.hosts: ['https://192.168.56.40:9200']
elasticsearch.serviceAccountToken: AAEAAWVsYXN0aWMva2liYW5hL2Vucm9sbC1wcm9jZXNzLXRva2VuLTE3MTMzMjE5MjUxNTA6VncxMllkV3pSai12eDdOdHR6M1pFZw
elasticsearch.ssl.certificateAuthorities: [/var/lib/kibana/ca_1713321927055.crt]
Остается выполнить настройку шифрования между браузером клиента и сервером Kibana.
Шифрование между браузером и Kibana
Для настройки TLS соединения между клиентским браузером и Kibana необходим открытый ключ и закрытый ключ сертификата. Есть несколько вариантов:
1. Выпустить самоподписанный сертификат для Kibana. Этот вариант подойдет для тестовых сред.
2. Использовать сертификат от стороннего центра сертификации. Например, от Let’s Encrypt.
Я буду использовать второй вариант.
Шифрование между браузером и сервером Kibana конфигурируется следующим образом:
1. Скопируйте в директорию /etc/kibana файл открытого и закрытого ключа сертификата:
sudo ls -l /etc/kibana
[root@localhost]# sudo ls -l /etc/kibana
total 28
-rw-rw----. 1 root kibana 1935 Apr 17 12:30 cert.crt
-rw-rw----. 1 root kibana 130 Apr 17 09:22 kibana.keystore
-rw-rw----. 1 root kibana 8400 Apr 17 12:26 kibana.yml
-rw-r--r--. 1 root kibana 447 Apr 5 23:19 node.options
-rw-rw----. 1 root kibana 2459 Apr 17 12:30 priv.key
[root@localhost]#
2. Откройте на редактирование конфигурационный файл сервиса Kibana.
sudo nano /etc/kibana/kibana.yml
3. Раскомментируйте следующие параметры и укажите расположений файла открытого и закрытого ключа сертификата:
server.ssl.enabled: true
server.ssl.certificate: /etc/kibana/certs/cert.crt
server.ssl.key: /etc/kibana/certs/priv.key
4. Сохраните изменения в файле конфигурации.
5. Перезапустите сервис Kibana:
sudo systemctl start kibana.service
5. Проверим статус сервиса:
sudo systemctl status kibana.service
[root@localhost]# sudo systemctl status kibana.service
● kibana.service - Kibana
Loaded: loaded (/usr/lib/systemd/system/kibana.service; enabled; preset: disabled)
Active: active (running) since Wed 2024-04-17 15:25:33 +07; 4min 14s ago
Docs: https://www.elastic.co
Main PID: 14939 (node)
Tasks: 11 (limit: 23168)
Memory: 458.4M
CPU: 1min 13.849s
CGroup: /system.slice/kibana.service
└─14939 /usr/share/kibana/bin/../node/bin/node /usr/share/kibana/bin/../src/cli/dist
Apr 17 15:28:06 localhost.localdomain kibana[14939]: [2024-04-17T15:28:06.267+07:00][INFO ][plugins.fleet] Beginning fleet setup
Apr 17 15:28:06 localhost.localdomain kibana[14939]: [2024-04-17T15:28:06.269+07:00][INFO ][plugins.fleet] Cleaning old indices
Apr 17 15:28:06 localhost.localdomain kibana[14939]: [2024-04-17T15:28:06.706+07:00][WARN ][plugins.fleet] xpack.encryptedSavedObjects.encryptionKey is not configured, private key passphrase is being sto>
Apr 17 15:28:06 localhost.localdomain kibana[14939]: [2024-04-17T15:28:06.739+07:00][INFO ][plugins.fleet] Fleet setup completed
Apr 17 15:28:19 localhost.localdomain kibana[14939]: [2024-04-17T15:28:19.252+07:00][INFO ][plugins.securitySolution.endpoint:user-artifact-packager:1.0.0] Started. Checking for changes to endpoint artif>
Apr 17 15:28:19 localhost.localdomain kibana[14939]: [2024-04-17T15:28:19.267+07:00][INFO ][plugins.securitySolution.endpoint:user-artifact-packager:1.0.0] Last computed manifest not available yet
Apr 17 15:28:19 localhost.localdomain kibana[14939]: [2024-04-17T15:28:19.268+07:00][INFO ][plugins.securitySolution.endpoint:user-artifact-packager:1.0.0] Complete. Task run took 16ms [ stated: 2024-04->
Apr 17 15:29:22 localhost.localdomain kibana[14939]: [2024-04-17T15:29:22.243+07:00][INFO ][plugins.securitySolution.endpoint:user-artifact-packager:1.0.0] Started. Checking for changes to endpoint artif>
Apr 17 15:29:22 localhost.localdomain kibana[14939]: [2024-04-17T15:29:22.253+07:00][INFO ][plugins.securitySolution.endpoint:user-artifact-packager:1.0.0] Last computed manifest not available yet
Apr 17 15:29:22 localhost.localdomain kibana[14939]: [2024-04-17T15:29:22.254+07:00][INFO ][plugins.securitySolution.endpoint:user-artifact-packager:1.0.0] Complete. Task run took 11ms [ stated: 2024-04->
lines 1-21/21 (END)
6. Теперь интерфейс Kibana будет доступен по тому же стандартному порту 5601, но уже по HTTPS:
https://192.168.56.36:5601/
В моем случае я обращался к Kibana по IP-адресу, а не по DNS-имени. В следствии этого отображается предупреждение о небезопасном соединении.
Настройка прослушиваемого имени
Также рекомендуется в конфигурационном файле сервиса Kibana указать имя, по которому сервис будет прослушивать входящие подключения:
sudo nano /etc/kibana/kibana.yml
Добавьте параметр с указанием прослушиваемого имени:
server.publicBaseUrl: "https://kib.itproblog.ru"
Сохраните внесенные изменения и перезапустите сервис Kibana:
sudo systemctl start kibana.service
Подключение Elastic Enterprise Search
Для того, чтобы в Kibana работал Elastic web crawler необходим еще один компонент – Elastic Enterprise Search.
Для подключения Elastic Enterprise Search выполните следующие действия:
1. Установите Elastic Enterprise Search на отдельном хосте или на хосте с Kibana. На своем тестовом стенде я совместил Elastic Enterprise Search и Kibana.
2. Откройте для редактирования конфигурационный файл Kibana:
sudo nano /etc/kibana/kibana.yml
3. Добавьте параметр с указанием расположения сервиса Elastic Enterprise Search:
enterpriseSearch.host: 'http://localhost:3002'
Поскольку я совместил Elastic Enterprise Search и Kibana, то я могу обращаться через локальный хост.
4. Сохраните внесенные изменения.
5. Перезапустите сервис Kibana.
sudo systemctl restart kibana.service
Если вы все выполнили верно, то на странице с перечнем всех индексов вы не должны увидеть соответствующего предупреждения о том, что сервис Elastic Enterprise Search не подключен.
https://192.168.56.36:5601/app/enterprise_search/content/search_indices
Пример окно с перечнем индексов после успешного подключения сервиса Elastic Enterprise Search.
Как видно из примера выше предупреждение больше не отображается.