24 октября 2018 г. ELK Elasticsearch Logstash Kibana Ubuntu Поисковые системы Docker

Запуск связки Elasticsearch + Logstash + Kibana на Docker Compose

В этой статье мы запустим связку для удобной работы с вашими логами. Для реализации нам понадобится: Elasticsearch - одно из лучших решений по полнотекстовому поиску и фильтрации данных, Logstash - удобный интерфейс к Elasticsearch для записи логов (фильтрация, сбор и трансформация), ну а Kibana - это веб-интерфейс для визуализации и чтения данных из Elasticsearch.

Данную связку мы используем для хранения логов запущенных API на Smappi.

Всю эту связку проще запустить в контейнерах, которые будет контролировать Docker Compose. Для этих целей хорошо подходит проект docker-elk, в который входит всё что нам нужно, настроим его и запустим.

Установка Docker Compose и ELK

Помимо docker.io и docker-compose нам ещё понадобится git:

sudo apt update
sudo apt install docker.io docker-compose git

Теперь скачаем docker-elk:

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

Я использую свой приватный форк, в котором переопределены настройки для Elasticsearch и Logstash, рекомендую вам иметь тоже свой форк, а не использовать оригинал. Так вы сможете хранить свои изменения и делиться ими со своей командой.

Настройка ELK

Чтобы была возможность работы с Docker от вашего пользователя, необходимо его добавить в группу "docker":

sudo usermod -a -G docker <USERNAME>

Чтобы после перезапуска контейнера не потерялись данные, которые хранятся в Elasticsearch, рекомендую подключить свой Volume. Для этого надо добавить запись в volumes секции elasticsearch файла docker-compose.yml:

services:
  elasticsearch:
    volumes:
      - ./elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro
      - <Абсолютный путь до вашего хранилища>elasticsearch/data:/usr/share/elasticsearch/data:rw

Теперь если перезапустить контейнер данные подцепятся к вашему Elasticsearch автоматически.

Запуск ELK

Перейдём в каталог "docker-elk" и запустим команду, которая поднимет нам все 3 сервиса, объединенные в одну сеть:

cd docker-elk
docker-compose up

Если все запустилось без ошибок, то остановим контейнеры по Ctrl+C и ниже напишем service-файл для systemd, чтобы после перезагрузки системы он сам запускал и следил за состоянием запущенных контейнеров.

Настроим Nginx

Сначала создадим htpasswd-файл для Базовой HTTP авторизации. Укажите свой USERNAME и по запросу введите пароль:

echo "<USERNAME>:`openssl passwd -apr1`" > /etc/nginx/htpasswd

Для примера хост для Elasticsearch будет "elastic.example.org", а хост для Kibana "kibana.example.org". Теперь создайте файл /etc/nginx/sites-available/elk.conf и разместите в нём следующее содержимое:

server {
    listen 80;
    server_name elastic.example.org kibana.example.org;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_certificate /etc/nginx/certs/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/nginx/certs/privkey.pem; # managed by Certbot
    ssl_session_cache shared:SSL:10m;
    client_max_body_size 20M;
    server_name elastic.example.org;

    satisfy any;
    allow <TRUSTED IP ADDRESS HERE>;  # Укажите IP адрес, которому вы доверяете (например соседний сервер откуда вы отправляете запросы к Elastic)
    allow <LOCAL IP ADDRESS HERE>;  # Если вы на одном сервере запустились, то укажите локальный адрес (127.0.0.1, 192.168.0.1 или какой-либо другой, посмотрите через какой интерфейс осуществяется передача данных)
    # allow 172.17.0.0/24;
    deny all;
    auth_basic "closed site";
    auth_basic_user_file htpasswd;

    location / {
        proxy_pass http://localhost:9200;
    }
}

server {
    listen 443 ssl;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_certificate /etc/nginx/certs/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/nginx/certs/privkey.pem; # managed by Certbot
    ssl_session_cache shared:SSL:10m;
    client_max_body_size 20M;
    server_name kibana.example.org;
    auth_basic "closed site";
    auth_basic_user_file htpasswd;
    location / {
        proxy_pass http://localhost:5601;
    }
}

Как получить SSL/TSL ключи читайте мою другую статью "Получаем бесплатный SSL/TLS-сертификат от Let's Encrypt и настраиваем Nginx".

Если по какой-либо причине вы не хотите использовать HTTPS, то можно использовать вот такой конфиг:
client_max_body_size 20M;
auth_basic "closed site";
auth_basic_user_file htpasswd;

server {
    listen 80;
    server_name elastic.example.org;
    location / {
        proxy_pass http://localhost:9200;
    }
}
server {
    listen 80;
    server_name kibana.example.org;
    location / {
        proxy_pass http://localhost:5601;
    }
}

Создадим симлинк для активации конфига и перезапустим Nginx:

ln -s /etc/nginx/sites-available/elk.conf /etc/nginx/sites-enabled/elk.conf
nginx -s reload

Зайдём браузером по адресу kibana.example.org, вы должны увидеть примерно следующий интерфейс:

Перейдите в Management > Index Patterns и нажмите на кнопку Create Index Pattern, введите "logstash-*" в поле Index pattern, а в качестве значения для поля Time Filter field name укажите "datetime", таким образом вы настроите шаблон для матчинга всех данных от Logstash.

Автозапуск ELK

Создадим service-файл в каталоге systemd:

sudo emacs /etc/systemd/system/docker-compose-elk.service

И внесём следующее содержимое:

[Unit]
Description=ELK: Docker Compose Application Service
Requires=docker.service
After=docker.service

[Service]
WorkingDirectory=/home/<USERNAME>/docker-elk
ExecStart=/usr/bin/docker-compose up
ExecStop=/usr/bin/docker-compose down
TimeoutStartSec=0
Restart=on-failure

[Install]
WantedBy=multi-user.target

Теперь активируем и запустим наш сервис:

sudo systemctl enable docker-compose-elk
sudo systemctl start docker-compose-elk

Вы также можете узнать статус, остановить или перезапустить сервис:

sudo systemctl status docker-compose-elk
sudo systemctl stop docker-compose-elk
sudo systemctl restart docker-compose-elk

Не забывайте после каждого изменения service-файла перезапускать systemd:

systemctl daemon-reload

Собственно это всё что требуется знать для начального запуска ELK, свои вопросы можете оставить в комментариях к этой статье.

Комментарии

"надо добавить запись в volumes секции elasticsearch:"

Если у вас свой форк вы бы хоть файл конфигурационный указывали куда это надо добавить

Спасибо, добавил в статье путь к файлу. Про форк не понял, зачем вы его упомянули в предложении?

Ещё бы nginx тоже в тот же стэк впилить

@drros да, было бы удобно

В этой сборке Kibana генерит на elasticsearch огромное число логов, которые не несут никакой полезной нагрузки.

Оставьте свой комментарий

Markdown