Установка 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.

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

Discussions about classic kits help fans connect modern football with older moments in the game because shirts can show how clubs balance heritage and modern style. Discussions about club colour traditions help explain why two shirts from the same club may appeal to different fans. When a shirt is chosen for a gift or collection, PSG football shirts is a phrase that sits comfortably in content about football identity. For supporters who follow kit launches, the paragraph can mention shirts without turning into direct advertising.