0

elk

Elastic stack (ELK) в контейнерах Docker с помощью Docker Compose

04.01.2023

Требования к системе

Для работы с данным руководством вам потребуется следующее.

  • Память – 1,5 ГБ и выше
  • Docker Engine – версия 18.06.0 или новее
  • Docker Compose – версия 1.26.0 или новее

Установите необходимые пакеты, указанные ниже:

## На Debian/Ubuntu
sudo apt update && sudo apt upgrade
sudo apt install curl vim git

## На RHEL/CentOS/RockyLinux 8
sudo yum -y update
sudo yum -y install curl vim git

## На Fedora
sudo dnf update
sudo dnf -y install curl vim git

Шаг 1 – Установите Docker и Docker Compose

Используйте приведенное ниже руководство для установки Docker Engine на вашу систему.

Добавьте системного пользователя в группу docker.

Шаг 2 – Обеспечение контейнеров Elastic stack (ELK).

Начнем с клонирования файлов с Github, как показано ниже

git clone https://github.com/deviantony/docker-elk.git
cd docker-elk

Откройте файл развертывания для редактирования:

vim docker-compose.yml

Файл развертывания стека Elastic состоит из 3 основных частей.

Elasticsearch – с портами:

  • 9200: Elasticsearch HTTP
  • 9300: Elasticsearch TCP транспорт

Logstash – с портами:

5044: Logstash Beats input
5000: Logstash TCP вход
9600: API мониторинга Logstash
Kibana – с портом 5601

В открытом файле вы можете сделать следующие настройки:

Настройка Elasticsearch

Файл конфигурации для Elasticsearch хранится в файле elasticsearch/config/elasticsearch.yml.

Таким образом, вы можете настроить среду, задав имя кластера, сетевой хост и лицензирование, как показано ниже

elasticsearch:
  environment:
    cluster.name: my-cluster
    xpack.license.self_generated.type: basic

Чтобы отключить платные функции, необходимо изменить параметр xpack.license.self_generated.type с trial (самогенерируемая лицензия дает доступ только ко всем функциям x-pack на 30 дней) на basic.

Настройка Kibana

Файл конфигурации хранится в файле kibana/config/kibana.yml.

Здесь вы можете указать переменные окружения, как показано ниже.

kibana:
  environment:
    SERVER_NAME: kibana.example.com

Настройка JVM

Обычно и Elasticsearch, и Logstash начинают с 1/4 от общей памяти хоста, выделенной под JVM Heap Size.

Вы можете настроить память, задав следующие параметры.

Для Logstash (пример с увеличением памяти до 1 ГБ)

logstash:
  environment:
    LS_JAVA_OPTS: -Xmx1g -Xms1g

Для Elasticsearch (пример с увеличением памяти до 1 ГБ)

elasticsearch:
  environment:
    ES_JAVA_OPTS: -Xm1g -Xms1g

Настройка имен пользователей и паролей

Чтобы настроить имена пользователей, пароли и версию, отредактируйте файл .env.

vim .env

Внесите необходимые изменения в версию, имена пользователей и пароли.

ELASTIC_VERSION=<VERSION>

## Passwords for stack users
#

# User 'elastic' (built-in)
#
# Superuser role, full access to cluster management and data indices.
# https://www.elastic.co/guide/en/elasticsearch/reference/current/built-in-users.html
ELASTIC_PASSWORD='StrongPassw0rd1'

# User 'logstash_internal' (custom)
#
# The user Logstash uses to connect and send data to Elasticsearch.
# https://www.elastic.co/guide/en/logstash/current/ls-security.html
LOGSTASH_INTERNAL_PASSWORD='StrongPassw0rd1'

# User 'kibana_system' (built-in)
#
# The user Kibana uses to connect and communicate with Elasticsearch.
# https://www.elastic.co/guide/en/elasticsearch/reference/current/built-in-users.html
KIBANA_SYSTEM_PASSWORD='StrongPassw0rd1'

Шаг 3 – Настройка постоянных томов.

Для того чтобы стек Elastic сохранял данные, нам необходимо правильно сопоставить тома.

В файле YAML у нас есть несколько томов, которые нужно сопоставить.

В этом руководстве я настрою вторичный диск, подключенный к моему устройству.

Определите диск.

$ lsblk
NAME        MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda           8:0    0  40G  0 disk 
├─sda1        8:1    0   1G  0 part /boot
└─sda2        8:2    0  39G  0 part 
  ├─rl-root 253:0    0  35G  0 lvm  /
  └─rl-swap 253:1    0   4G  0 lvm  [SWAP]
sdb           8:16   0  10G  0 disk 
└─sdb1        8:17   0  10G  0 part 

Отформатируйте диск и создайте на нем файловую систему XFS.

sudo parted --script /dev/sdb "mklabel gpt"
sudo parted --script /dev/sdb "mkpart primary 0% 100%"
sudo mkfs.xfs /dev/sdb1

Смонтируйте диск по нужному пути.

sudo mkdir /mnt/datastore
sudo mount /dev/sdb1 /mnt/datastore

Проверьте, был ли смонтирован диск.

$ sudo mount | grep /dev/sdb1
/dev/sdb1 on /mnt/datastore type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)

Создайте постоянные тома на диске.

sudo mkdir /mnt/datastore/setup
sudo mkdir /mnt/datastore/elasticsearch

Установите правильные разрешения.

sudo chmod 775 -R /mnt/datastore
sudo chown -R $USER:docker /mnt/datastore

На системах на базе Rhel настройте SELinux, как показано ниже.

sudo setenforce 0
sudo sed -i 's/^SELINUX=.*/SELINUX=permissive/g' /etc/selinux/config

Создайте внешние тома:

Для Elasticsearch

docker volume create --driver local \
     --opt type=none \
     --opt device=/mnt/datastore/elasticsearch \
     --opt o=bind elasticsearch

Для настройки

docker volume create --driver local \
     --opt type=none \
     --opt device=/mnt/datastore/setup \
     --opt o=bind setup

Проверьте, были ли созданы тома.

$ docker volume list
DRIVER    VOLUME NAME
local     elasticsearch
local     setup

Просмотреть более подробную информацию о томе.

$ docker volume inspect setup
[
    {
        "CreatedAt": "2022-05-06T13:19:33Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/setup/_data",
        "Name": "setup",
        "Options": {
            "device": "/mnt/datastore/setup",
            "o": "bind",
            "type": "none"
        },
        "Scope": "local"
    }
]

Вернитесь к файлу YAML и добавьте эти строки в конец файла.

$ vim docker-compose.yml
.......
volumes:
  setup:
    external: true
  elasticsearch:
    external: true

Теперь у вас должен быть готовый файл YAML.

Шаг 4 – Приведение в действие стека Elastic

После внесения необходимых изменений запустите стек Elastic с помощью команды:

docker-compose up -d

Вывод:

[+] Building 6.4s (12/17)                                                                                                                   
 => [docker-elk_setup internal] load build definition from Dockerfile                                                                  0.3s
 => => transferring dockerfile: 389B                                                                                                   0.0s
 => [docker-elk_setup internal] load .dockerignore                                                                                     0.5s
 => => transferring context: 250B                                                                                                      0.0s
 => [docker-elk_logstash internal] load build definition from Dockerfile                                                               0.6s
 => => transferring dockerfile: 312B                                                                                                   0.0s
 => [docker-elk_elasticsearch internal] load build definition from Dockerfile                                                          0.6s
 => => transferring dockerfile: 324B                                                                                                   0.0s
 => [docker-elk_logstash internal] load .dockerignore                                                                                  0.7s
 => => transferring context: 188B                                                 
........

После завершения проверьте, запущены ли контейнеры:

$ docker ps
CONTAINER ID   IMAGE                      COMMAND                  CREATED          STATUS         PORTS                                                                                                                                                                        NAMES
096ddc76c6b9   docker-elk_logstash        "/usr/local/bin/dock…"   9 seconds ago    Up 5 seconds   0.0.0.0:5000->5000/tcp, :::5000->5000/tcp, 0.0.0.0:5044->5044/tcp, :::5044->5044/tcp, 0.0.0.0:9600->9600/tcp, 0.0.0.0:5000->5000/udp, :::9600->9600/tcp, :::5000->5000/udp   docker-elk-logstash-1
ec3aab33a213   docker-elk_kibana          "/bin/tini -- /usr/l…"   9 seconds ago    Up 5 seconds   0.0.0.0:5601->5601/tcp, :::5601->5601/tcp                                                                                                                                    docker-elk-kibana-1
b365f809d9f8   docker-elk_setup           "/entrypoint.sh"         10 seconds ago   Up 7 seconds   9200/tcp, 9300/tcp                                                                                                                                                           docker-elk-setup-1
45f6ba48a89f   docker-elk_elasticsearch   "/bin/tini -- /usr/l…"   10 seconds ago   Up 7 seconds   0.0.0.0:9200->9200/tcp, :::9200->9200/tcp, 0.0.0.0:9300->9300/tcp, :::9300->9300/tcp                                                                                         docker-elk-elasticsearch-1

Проверьте, запущен ли Elastic search:

$ curl http://localhost:9200 -u elastic:StrongPassw0rd1
{
  "name" : "45f6ba48a89f",
  "cluster_name" : "my-cluster",
  "cluster_uuid" : "hGyChEAVQD682yVAx--iEQ",
  "version" : {
    "number" : "8.1.3",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "39afaa3c0fe7db4869a161985e240bd7182d7a07",
    "build_date" : "2022-04-19T08:13:25.444693396Z",
    "build_snapshot" : false,
    "lucene_version" : "9.0.0",
    "minimum_wire_compatibility_version" : "7.17.0",
    "minimum_index_compatibility_version" : "7.0.0"
  },
  "tagline" : "You Know, for Search"
}

Шаг 5 – Доступ к дашборду Kibana.

На этом этапе вы можете приступить к работе и получить доступ к дашборду Kibana, работающему на порту 5601.

Но сначала разрешите необходимые порты через брандмауэр.

##На Firewalld
sudo firewall-cmd --add-port=5601/tcp --permanent
sudo firewall-cmd --add-port=5044/tcp --permanent
sudo firewall-cmd --reload

##На UFW
sudo ufw allow 5601/tcp
sudo ufw allow 5044/tcp

Теперь зайдите в Kibana с помощью URL http://IP_Address:5601 или http://Domain_name:5601.

Войдите в систему, используя учетные данные, установленные для пользователя Elasticsearch:

Username: elastic
Password: StrongPassw0rd1

Теперь, чтобы доказать, что стек ELK работает так, как нужно.

Мы отправим некоторые данные/записи журнала.

Logstash позволяет нам отправлять содержимое через TCP, как показано ниже.

cat /path/to/logfile.log | nc -q0 localhost 5000

Например:

cat /var/log/syslog | nc -q0 localhost 5000

Шаг 6 – Очистка

Если вы хотите полностью удалить стек Elastic (ELK) и все постоянные данные, используйте команду:

$ docker-compose down -v
[+] Running 5/4
 ⠿ Container docker-elk-kibana-1         Removed                                                                                      10.5s
 ⠿ Container docker-elk-setup-1          Removed                                                                                       0.1s
 ⠿ Container docker-elk-logstash-1       Removed                                                                                       9.9s
 ⠿ Container docker-elk-elasticsearch-1  Removed                                                                                       3.0s
 ⠿ Network docker-elk_elk                Removed                                                                                       0.1s

Свежие комментарии

Подписка

Лучшие статьи


Fatal error: Uncaught Error: Call to a member function have_posts() on null in /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/blog.php:380 Stack trace: #0 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/widgets/latest-posts/widget.php(257): fox56_blog_grid(NULL, Array) #1 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/widgets/latest-posts/register.php(33): include('/home/host18670...') #2 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/class-wp-widget.php(394): Wi_Widget_Latest_Posts->widget(Array, Array) #3 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/widgets.php(837): WP_Widget->display_callback(Array, Array) #4 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(417): dynamic_sidebar('sidebar') #5 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(136): fox56_single_sidebar() #6 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/single.php(7): fox56_single_inner() #7 /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/single.php(23): fox56_single() #8 /home/host1867038/the-devops.ru/htdocs/www/wp-includes/template-loader.php(106): include('/home/host18670...') #9 /home/host1867038/the-devops.ru/htdocs/www/wp-blog-header.php(19): require_once('/home/host18670...') #10 /home/host1867038/the-devops.ru/htdocs/www/index.php(17): require('/home/host18670...') #11 {main} thrown in /home/host1867038/the-devops.ru/htdocs/www/wp-content/themes/fox/inc/blog.php on line 380