Установка 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
  1. Сохраните пароль пользователя 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

После установки 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

Для того, чтобы в 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.

Как видно из примера выше предупреждение больше не отображается.