- PVSM.RU - https://www.pvsm.ru -

ELK на Docker

Многие я думаю читали о применении Elasticsearch, Logstash и Kibana для сбора и анализа логов, но часто статьи начинаются с длинного мануала как поднять сервисы ELK и заставить работать их совместно.
Здесь я хочу рассказать о быстром старте с помощью Docker.

Напишу заранее, что статья ориентирована на тех кто уже знаком с Docker и имеет желание поднять стек ELK для ознакомления или будущего использования в продуктиве. А для тех кто не знает нужен ли им ELK, рекомендую причитать статью Kibana-мать или Зачем вам вообще нужны логи? [1].

Итак, в идеале задача сводится к тому, чтобы найти контейнер с ELK на hub.docker.com и запустить его. Предлагаю так и сделать с некоторыми доработками. В примере рассмотрим отправку логов nginx в elasticSearch.

Аббревиатура сервисов ELK предусматривает следующие задачи:
1) Обработку поступающих данных и доставку их в Elasticsearch [2] — за это отвечает сервис Logstash [3]
2) Поисковый движок и интерфейс доступа к данным- за это отвечают сам Elasticsearch и Kibana [4]

Но по хорошему Logstash не должен отвечать за доставку данных. Доставку данных делегируем четвертому сервису- Fealbeat [5].

Общая схема работы выглядит следующим образом:

image

В сети может находится различное количество сервисов, с которых необходимо собирать данные и сервис Filebeat является провайдером логов для сервиса Logstash.

Другими словами я веду к тому, что нам необходимо заиметь еще один контейнер с сервисом Filebeat.

Приступим к делу. Я настоятельно рекомендую вам пользоваться сервисом Docker Compose- описывать параметры в одном файле формата YAML, гораздо удобнее чем каждый раз выполнять команды с параметрами. А на этапе отладки запустить и остановить придется не 1 раз.

1. Создадим папку с проектом, например myElk и создадим там файл следующего имени docker-compose.yml, который мы будем дополнять.

2. Ищем и находим контейнер с filebeat. Я рекомендую взять вот этот olinicola/filebeat [6] или выполнить docker pull olinicola/filebeat
Настройка контейнера с filebeat заключается в подготовке конфигурационного файла в формате YAML для сервиса filebeat.
У нас он будет выглядеть следующим образом:
prospectors:
-
paths:
- "/etc/logs/nginx/access.log"
document_type: nginx-access
-
paths:
- "/var/log/nginx/error.log"
document_type: nginx-error
output:
logstash:
hosts: ["elk:5044"]
tls:
certificate_authorities:
- /etc/pki/tls/certs/logstash-beats.crt
timeout: 15
file:
path: "/tmp/filebeat"

Если коротко, то берем логи nginx с определенного места сервера и отправляем их на ELK сервер, который готов принимать от нас сообщения на порт 5044.
В данном конфигурационном файле «elk»- имя прилинкованного контейнера- подробнее ниже.
Я также дополнительно указал выгрузку в файл, для более удобной отладке на этапе запуска.

На данном этапе вы уже можете дополнить docker-compose.yml следующим кодом:

version: '2'
services:
filebeat:
build: .
image: [ваш imageId образа filebeat]
volumes:
- /path/to/myElk/log/nginx:/etc/logs/nginx # логи nginx
- /path/to/myElk/filebeat:/etc/filebeat
- /path/to/myElk/filebeat/tmp:/tmp/filebeat

Вы уже можете запустить поднять контейнер командой docker-compose up. И посмотреть как при изменении файла access.log данные будут отправляться в файл "/tmp/filebeat", только на данном этапе еще нет контейнера elk, поэтому output logstash лучше закомментировать.

3. Ок, нас появился первый контейнер с filebeat. Теперь нам нужен второй контейнер с ELK. Идем на hub.docker.com [7] и находим sebp/elk [8] или выполняем команду docker pull sebp/elk.

Настройка контейнера ELK.
Единственное, что нужно настроить здесь это logstash, причем тут 2 варианта: а) оставить все как есть и это будет работать, так как logstash в данном контейнере уже настроен на получение логов nginx сервера.
Однако после того как вы запуститесь вам захочется пойти по пути б)-то есть настроить логи так как нужно именно вам. Потому что от того как будут переданы логи в elasticsearch вам будет более или менее удобно анализировать данные, приходящие с nginx.
Итак поясню файлы конфигурации logstash. Файлы логов, которые нас интересуют следующие:
Входные параметры:
02-beats-input.conf — можно не трогать

input {
beats {
port => 5044
ssl => true
ssl_certificate => "/etc/pki/tls/certs/logstash-beats.crt"
ssl_key => "/etc/pki/tls/private/logstash-beats.key"
}
}

Здесь мы видим, что сервис готов принимать данные по порту 5044.
Выходные параметры:
30-output.conf — можно не трогать

output {
elasticsearch {
hosts => ["localhost"]
sniffing => true
manage_template => false
index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
document_type => "%{[@metadata][type]}"
}
stdout { codec => rubydebug }
}

Самое интересное- преобразование данных. По умолчанию файл 11-nginx.conf выглядит так

filter {
if [type] == "nginx-access" {
grok {
match => { "message" => "%{NGINXACCESS}" }
}
}
}

Но возможно после того как вы наиграетесь с шаблоном NGINXACCESS вы захотите обработать ваши логи именно так как нужно вам.
Для этого вам нужно будет изменять секцию filter. Там может быть несколько параметров — очень хорошо описано здесь Собираем, парсим и отдаём логи с помощью Logstash [9].
От себя хочу добавить, что для отладки grok фильтров хорошо подходит следующий сервис: Grok Debugger [10]

3. Компоновка 2х контейнеров.

Здесь я настоятельно рекумендую вам пользоваться сервисом Docker Compose- описывать параметры в одном файле формата YAML, гораздо удобнее чем каждый раз выполнять команды с параметрами. А на этапе отладки запустить и остановить придется не 1 раз.
Для этого вам необходимо создать папку с проектом, например myElk и создать там файл следующего имени docker-compose.yml и например следующего содержания:

version: '2'
services:
filebeat:
build: .
image: [ваш imageId образа filebeat]
volumes:
- /path/to/myElk/log/nginx:/etc/logs/nginx # логи nginx
- /path/to/myElk/filebeat:/etc/filebeat
- /path/to/myElk/filebeat/tmp:/tmp/filebeat
- /path/to/myElk/filebeat/certs:/etc/pki/tls/certs
links:
- "elk"
depends_on:
- "elk"
#entrypoint: ./time-to-start.sh
elk:
image: [ваш imageId образа elk]
ports:
- "5601:5601" #kibana
- "9200:9200" #elastic
- "5044:5044" #logstash beats filebeat

Данный конфигурационный файл описывает два контейнера и их взаимосвязь, а т
Пробуйте запустить контейнер, если все ОК, то по адресу localhost:5601 вы увидите первую страницу Kibana, где вам нужно будет выбрать первый index, он будет сформирован вида filebeat-[дата], наберите filebeat и если данные начали поступать, то он будет сформирован автоматически.

Для тех кто запускает docker на mac- вам необходимо будет дополнительно пробросить порты через проброс портов VirtualBox, чтобы localhost:5601 был доступен на хостовой машине.

Автор: robertsz

Источник [11]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/nginx/119835

Ссылки в тексте:

[1] Kibana-мать или Зачем вам вообще нужны логи?: https://habrahabr.ru/company/uteam/blog/278729/

[2] Elasticsearch: https://www.elastic.co/products/elasticsearch

[3] Logstash: https://www.elastic.co/products/logstash

[4] Kibana: https://www.elastic.co/products/kibana

[5] Fealbeat: https://www.elastic.co/products/beats/filebeat

[6] olinicola/filebeat: https://hub.docker.com/r/olinicola/filebeat/

[7] hub.docker.com: https://hub.docker.com

[8] sebp/elk: https://hub.docker.com/r/sebp/elk/

[9] Собираем, парсим и отдаём логи с помощью Logstash: https://habrahabr.ru/post/165059/

[10] Grok Debugger: https://grokdebug.herokuapp.com/

[11] Источник: https://habrahabr.ru/post/282866/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best